Методические указания и примеры выполнения задания №6 " Моделирование процессов принятия решений"
Вид материала | Методические указания |
- Рабочая программа, методические указания по выполнению курсовой работы, темы курсовых, 1694.43kb.
- Программа дисциплины Моделирование экономических процессов для направления 080100., 53.79kb.
- Методические указания для выполнения курсовой работы по дисциплине «Теория принятия, 547.84kb.
- Методические указания к изучению курса «модели и методы принятия решений в анализе, 683.86kb.
- Методические указания к выполнению контрольных, курсовых работ По дисциплине Имитационное, 222.24kb.
- Анализ принятия управленческих решений, 54.28kb.
- Методические указания по изучению дисциплины и задания для выполнения, 272.59kb.
- Лекция №10: «Интеллектуальные системы принятия решений и управления в условиях конфликта», 581.94kb.
- Методические указания к выполнению лабораторной работы №23 по физике для студентов, 142.34kb.
- Методические указания для выполнения контрольных работ по курсу «Автоматика и автоматизация, 447.92kb.
Игра
ЦЕЛЬ: Выйграть игру (используя и приобретая навыки управления обьектами в игре).
ОГРАНИЧЕНИЯ : Правила игры.
АЛЬТЕРНАТИВЫ: Имеется 4 способа решения задач (для некоторых задач эти способы могут комбинироваться).
ТИП: Однокритериальная, статистическая, стохастическая.
Исходный текст программы ( Реализовано на С++ ):
#include
#include
#include
#include
#include
#include
int a[4];
int i,j,k,t,m,q,r,M1,M2,M3,M4,Flag,Timer,z;
typedef struct
{
int metod[5];
}data;
data b[4];
void main()
{
randomize();clrscr();Timer=0;
M1=M2=M3=M4=Flag=0;
printf("Input K: ");scanf("%d",&k);//коэффицент умения
printf("Input Q: ");scanf("%d",&q);//предел умения
do
{printf("Input time: ");scanf("%d",&t);//время игры
for(i=1;i<(t+1);i++)
{
switch (Flag)
{
case 0:if(b[1].metod[1]==1){M1=M1+k;Flag=1;i++;Timer++;}
else{
r=random(100);if(r<50)M2=M2+k;
r=random(100)*M1;
if(r>50){M1=M1+k;b[1].metod[1]=1;Flag=1;i++;Timer++;}
else{M1=M1+k;}}
break;
case 1:if(b[2].metod[2]==1){M1=M1+k;M2=M2+k;Flag=2;i++;Timer++;}
if(M2==0){M1=M1+k;b[2].metod[1]=0;}
else{r=random(100)*M2*M1;
if(r>95){M1=M1+k;M2=M2+k;b[2].metod[2]=1;Flag=2;i++;Timer++;}
else{M1=M1+k;M2=M2+k;}
}
break;
case 2:if(b[3].metod[1]==1)
{ r=random(100);
{if(r<70)
{M1=M1+k;M2=M2+k;M3=M3+k;M4=M4+k;Flag=3;i++;Timer++;}
else{M1=M1+k;M2=M2+k;M3=M3+k;M4=M4+k;}}
}
else
{
if(b[3].metod[2]==1)
{
r=random(100);
{if(r<25){M1=M1+k;M2=M2+k;M3=M3+k;Flag=3;i++;Timer++;}
else{M1=M1+k;M2=M2+k;M3=M3+k;}}
}
else
{
if(b[3].metod[3]==1)
{
r=random(100);
{if(r<5){M1=M1+k;M2=M2+k;Flag=3;i++;Timer++;}
else{M1=M1+k;M2=M2+k;}}
}
else
{
b[3].metod[1]=0;b[3].metod[1]=0;b[3].metod[1]=0;
a[1]=M1*30+M2*30+M3*30+M4*10;
a[2]=M1*30+M2*40+M3*30;
a[3]=M1*50+M2*50;
a[4]=0;
r=random(a[1]+a[2]+a[3]+1);
if (r
else
{
if (r
else {i--;Timer--;b[3].metod[3]=1;}
}
}
}
}
break;
case 3:Timer++;break;
}
if(Timer>12){Timer=Timer-12;k++;M1--;M2--;M3--;M4--;}
if(M1<0)M1=0;if(M2<0)M2=0;if(M3<0)M3=0;if(M4<0)M4=0;
if(k>q)k=q;
}
printf("Input rest: ");scanf("%d",&t);//время отдыха
for (i=0;i
{
if(i>0)z=4;else z=5;if(i>2)z=3;if(i>5)z=2;if(i>10)z=1;if(i>25)z=0;
Timer++;M1=M1-z;M2=M2-z;M3=M3-z;M4=M4-z;
if(M1<0)M1=0;if(M2<0)M2=0;if(M3<0)M3=0;if(M4<0)M4=0;
if(Timer>12){Timer=Timer-12;k++;}
if(k>q)k=q;
}
printf("Result: ");
cout<<"\nK: "<
printf("Repeat (1-Yes;0-No) ?");scanf("%d",&t);
}
while(t!=0);
}
#include
#include
#include
#include
#include
#include
int a[4];
int i,j,k,t,m,q,r,M1,M2,M3,M4,Flag,Timer,z;
typedef struct
{
int metod[5];
}data;
data b[4];
void main()
{
randomize();clrscr();Timer=0;
M1=M2=M3=M4=Flag=0;
printf("Input K: ");scanf("%d",&k);//коэффицент умения
printf("Input Q: ");scanf("%d",&q);//предел умения
do
{printf("Input time: ");scanf("%d",&t);//время игры
for(i=1;i<(t+1);i++)
{
switch (Flag)
{
case 0:if(b[1].metod[1]==1){M1=M1+k;Flag=1;i++;Timer++;}
else{
r=random(100);if(r<50)M2=M2+k;
r=random(100)*M1;
if(r>50){M1=M1+k;b[1].metod[1]=1;Flag=1;i++;Timer++;}
else{M1=M1+k;}}
break;
case 1:if(b[2].metod[2]==1){M1=M1+k;M2=M2+k;Flag=2;i++;Timer++;}
if(M2==0){M1=M1+k;b[2].metod[1]=0;}
else{r=random(100)*M2*M1;
if(r>95){M1=M1+k;M2=M2+k;b[2].metod[2]=1;Flag=2;i++;Timer++;}
else{M1=M1+k;M2=M2+k;}
}
break;
case 2:if(b[3].metod[1]==1)
{ r=random(100);
{if(r<70)
{M1=M1+k;M2=M2+k;M3=M3+k;M4=M4+k;Flag=3;i++;Timer++;}
else{M1=M1+k;M2=M2+k;M3=M3+k;M4=M4+k;}}
}
else
{
if(b[3].metod[2]==1)
{
r=random(100);
{if(r<25){M1=M1+k;M2=M2+k;M3=M3+k;Flag=3;i++;Timer++;}
else{M1=M1+k;M2=M2+k;M3=M3+k;}}
}
else
{
if(b[3].metod[3]==1)
{
r=random(100);
{if(r<5){M1=M1+k;M2=M2+k;Flag=3;i++;Timer++;}
else{M1=M1+k;M2=M2+k;}}
}
else
{
b[3].metod[1]=0;b[3].metod[1]=0;b[3].metod[1]=0;
a[1]=M1*30+M2*30+M3*30+M4*10;
a[2]=M1*30+M2*40+M3*30;
a[3]=M1*50+M2*50;
a[4]=0;
r=random(a[1]+a[2]+a[3]+1);
if (r
else
{
if (r
else {i--;Timer--;b[3].metod[3]=1;}
}
}
}
}
break;
case 3:Timer++;break;
}
if(Timer>12){Timer=Timer-12;k++;M1--;M2--;M3--;M4--;}
if(M1<0)M1=0;if(M2<0)M2=0;if(M3<0)M3=0;if(M4<0)M4=0;
if(k>q)k=q;
}
printf("Input rest: ");scanf("%d",&t);//время отдыха
for (i=0;i
{
if(i>0)z=4;else z=5;if(i>2)z=3;if(i>5)z=2;if(i>10)z=1;if(i>25)z=0;
Timer++;M1=M1-z;M2=M2-z;M3=M3-z;M4=M4-z;
if(M1<0)M1=0;if(M2<0)M2=0;if(M3<0)M3=0;if(M4<0)M4=0;
if(Timer>12){Timer=Timer-12;k++;}
if(k>q)k=q;
}
printf("Result: ");
cout<<"\nK: "<
printf("Repeat (1-Yes;0-No) ?");scanf("%d",&t);
}
while(t!=0);
}
Модель принятия решения при приёме на работу оператора ЭВМ.
ЦЕЛЬ: менеджеру фирмы необходимо принять на работу сотрудника – оператора ЭВМ
ОГРАНИЧЕНИЯ : знание кандидатами следующих дисциплин:
Устройство ЭВМ
Компьютерная графика
Издательское дело
Языки программирования.
АЛЬТЕРНАТИВЫ: требующися сотрудник может иметь диплом об окончании факультета ЭВМ, факультета Информационных Систем и Технологий, факультета Издательского Дела и факультета Компьютерной графики.
ТИП: однокритериальная, в условиях неопределённости, статическая
Исходный текст программы ( Реализовано на С++ ):
//--------------------------------------------------------------------------
#include
#include
#include
#include
#include
#include
//--------------------------------------------------------------------------
int Ready=80;
int MinAge=18;
int MaxAge=45;
int MinInterrupt=1;
int MaxInterrupt=31;
int Knowlege;
int Kn;
int Number;
int Num;
int UnReady;
int P[4];
int EqualRisk[4];
int Result[100][2];
int PRes[4]={0,0,0,0};
int PDir[4]={0,0,0,0};
double M[100];
double mx,dx,sx,kg,pp;
double Win[4][4];
double R[4][4];
double K[4][4]={{0.95,0.11,0.13,0.90},{0.09,0.15,0.12,0.10},
{0.10,0.14,0.95,0.10},{0.10,0.95,0.23,0.07}};
//--------------------------------------------------------------------------
void About()
{
clrscr();
cout<<" "<
cout<<" Лабораторная работа №6 "<
cout<<" по моделированию "<
cout<<" Тема : "<
cout<<" Моделирование процессов принятия решений "<
cout<<" "<
cout<<" Выполнил: студент гр.ЭВМд-31 "<
cout<<" Акимов С.В. "<
cout<<"Цель : принять на работу оператора ЭВМ "<
cout<<"Ограничения :-наличие специального образования "<
cout<<" -направление деятельности "<
cout<<"Альтернативы: "<
cout<<" - диплом ЭВМ "<
cout<<" - диплом Информационные Системы в Экономике "<
cout<<" - диплом Издательское Дело "<
cout<<" - диплом Компьютерная Графика "<
cout<<" Тип "<
cout<<" - однокритериальная "<
cout<<" - в условиях неопределенности "<
cout<<" - статическая "<
cout<<" "<
cout<<" Для продолжения - 'Enter' "<
getch();
}
//--------------------------------------------------------------------------
void ShowWinMatrice()
{
gotoxy(1,1); cout<<" Матрица выигрышей :";
gotoxy(2,2); cout<<" Устр-во Графика Издательское Языки ";
gotoxy(2,3); cout<<" ЭВМ дело С++,Pascal ";
gotoxy(1,4); cout<<"ЭВМ";
gotoxy(1,5); cout<<"ИСЭ";
gotoxy(1,6); cout<<"ИД ";
gotoxy(1,7); cout<<"КГ ";
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
{
gotoxy(5+12*j,4+i);
cout<
}
cout<
}
//--------------------------------------------------------------------------
void ShowRiskMatrice()
{
gotoxy(2,10); cout<<" Матрица рисков :";
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
{
gotoxy(5+12*j,12+i);
cout<
}
cout<
}
//--------------------------------------------------------------------------
int ReadKey()
{
int key;
gotoxy(1,23);
cout<<"Продолжение-'Enter',выход-'Esc'";
key=getch();
return key;
}
//--------------------------------------------------------------------------
void GenerateP()
{
int points[3];
for (int i=0;i<3;i++)
points[i]=random(100)+1;
for (i=0;i<3;i++)
for (int j=0;j<2;j++)
if (points[j+1]
{
int temp=points[j+1];
points[j+1]=points[j];
points[j]=temp;
}
int s=0;
for (i=0;i<3;i++)
{
P[i]=points[i]-s;
s=P[i]+s;
}
P[3]=100-s;
}
//--------------------------------------------------------------------------
void MakeWinMatrice()
{
GenerateP();
for (int i=0;i<4;i++)
for (int j=0;j<4;j++)
Win[i][j]=((double)(P[j]))*K[i][j];
for (i=0;i<4;i++)
{
double Age=(double)(MinAge+random(MaxAge-MinAge));
double Expirience;
if (Age<30) Expirience=Age*0.4;
else Expirience=(40-Age)*0.5;
for (int j=0;j<0;j++)
Win[i][j]=Win[i][j]+Expirience;
}
}
//--------------------------------------------------------------------------
int FindDirection()
{
int Max,Index;
Max=P[0];Index=0;
for (int i=0;i<4;i++)
if (P[i]>Max) { Max=P[i]; Index=i; };
return Index+1;
}
//--------------------------------------------------------------------------
int FindOptimum()
{
int Cmp1,Cmp2;
int Index;
double Max[4];
double Min;
for (int j=0;j<4;j++)
{
Max[j]=Win[0][j];
for (int i=0;i<4;i++)
if (Win[i][j]>Max[j]) Max[j]=Win[i][j];
}
for (j=0;j<4;j++)
for (int i=0;i<4;i++)
R[i][j]=Max[j]-Win[i][j];
for (int i=0;i<4;i++)
{
Max[i]=R[i][0];
for (int j=0;j<4;j++)
if (R[i][j]>Max[i]) Max[i]=R[i][j];
}
Min=Max[0]; Index=0;
for (i=0;i<4;i++)
if (Max[i]
M[Num]=Min;
//-----дополнение к методу Сэвиджа-----------
if (Knowlege>20&&Knowlege<40)
{
Number=0;
Cmp1=(int)(Min*1000);
for (i=0;i<4;i++)
{
Cmp2=(int)(Max[i]*100);
if (Cmp1==Cmp2)
{
EqualRisk[Number]=i;
Number++;
}
}
if (Number>1)
{
int MinSumRiskIndex=EqualRisk[0];
double SumRisk=0;
for (int i=0;i<4;i++)
SumRisk=SumRisk+R[EqualRisk[0]][i];
double SumRiski;
for (i=0;i
{
SumRiski=0;
for (int j=0;j<4;j++)
SumRiski=SumRiski+R[EqualRisk[i]][j];
if (SumRiski
{
SumRisk=SumRiski;
MinSumRiskIndex=EqualRisk[i];
}
}
Index=MinSumRiskIndex;
}
}
//--------------------------------------------
if (Knowlege>=40)
{
int ZeroRisk[4];
int NumberOfZero;
int MinSumRiskIndex;
NumberOfZero=0;
int dir=FindDirection()-1;
for (int i=0;i<4;i++)
if (R[i][dir]<0.1)
{
ZeroRisk[NumberOfZero]=i;
NumberOfZero++;
}
if (NumberOfZero>1)
{
int MinSumRiskIndex=ZeroRisk[0];
double SumRisk=0;
for (int i=0;i<4;i++)
SumRisk=SumRisk+R[ZeroRisk[0]][i];
double SumRiski;
for (i=0;i
{
SumRiski=0;
for (int j=0;j<4;j++)
SumRiski=SumRiski+R[ZeroRisk[i]][j];
if (SumRiski
{
SumRisk=SumRiski;
MinSumRiskIndex=ZeroRisk[i];
}
}
Index=MinSumRiskIndex;
}
if (NumberOfZero==1) Index=ZeroRisk[0];
}
//--------------------------------------------
return Index+1;
}
//--------------------------------------------------------------------------
double FindM()
{
double m;
double pi;
int cmp;
m=0;
for (int i=0;i
{
pi=0;
cmp=(int)(M[i]*100);
for (int j=0;j<10000;j++)
if (cmp==j) pi=pi+1/((double)(Num));
m=m+M[i]*pi;
}
return m;
}
//--------------------------------------------------------------------------
double FindD()
{
double d;
double pi;
int cmp;
d=0;
for (int i=0;i
{
pi=0;
cmp=(int)(M[i]*100);
for (int j=0;j<10000;j++)
if (cmp==j) pi=pi+1/((double)(Num));
d=d+(M[i]-mx)*(M[i]-mx)*pi;
}
return d;
}
//--------------------------------------------------------------------------
void WriteResultToFile()
{
ofstream fout("out.txt");
fout<<"Результаты моделирования : "<
fout<<"Количество проведенных опытов "<
fout<<"Результаты :"<
for (int i=0;i
{
fout<<"Преимущественное направление "<
switch(Result[i][0])
{
case 1:fout<<"- устройство ЭВМ"<
case 2:fout<<"- графика"<
case 3:fout<<"- издательское дело"<
case 4:fout<<"- языки программирования"<
}
fout<<"Будет взят специалист по ";
switch(Result[i][1])
{
case 1:fout<<"ЭВМ"<
case 2:fout<<"ИСЭ"<
case 3:fout<<"ИД"<
case 4:fout<<"КГ"<
}
fout<
}
fout<<"Расчетный коэффициэнт готовности 0.80"<
double q=((double)(Num-UnReady))/((double)(Num));
fout<<"Реальный коэффициэнт готовности "<
kg=q;
pp=((double)Kn)/((double)Num);
fout<<"Процент попадания "<
q=((double)(PRes[0]))/((double)(Num));
fout<<"Вероятность приема"<
fout<<"- специалиста с ЭВМ "<
q=((double)(PRes[1]))/((double)(Num));
fout<<"- специалиста с ИСЭ "<
q=((double)(PRes[2]))/((double)(Num));
fout<<"- специалиста с ИД "<
q=((double)(PRes[3]))/((double)(Num));
fout<<"- специалиста с КГ "<
fout<<"Вероятность преимущественного "<
fout<<"направления работ "<
q=((double)(PDir[0]))/((double)(Num));
fout<<"- устройство ЭВМ "<
q=((double)(PDir[1]))/((double)(Num));
fout<<"-графика "<
q=((double)(PDir[2]))/((double)(Num));
fout<<"-издательское дело "<
q=((double)(PDir[3]))/((double)(Num));
fout<<"- языки программирования"<
mx=FindM();
fout<<"Mатематическое ожидание Fopt "<
dx=FindD();
fout<<"Дисперсия Fopt "<
sx=sqrt(dx);
fout<<"Среднеквадратическое отклонение Fopt "<
fout.close();
}
//--------------------------------------------------------------------------
void InitGraph()
{
int Driver,Mode;
Driver=VGA;
Mode=VGAHI;
initgraph(&Driver,&Mode,"h:\\bc31\\bgi");
}
//--------------------------------------------------------------------------
void Close()
{
closegraph();
}
//--------------------------------------------------------------------------
void DrawPRes()
{
setcolor(WHITE);
for (int i=1;i<4;i++)
line(20+i*80,115,20+i*80,125);
int x1,x2,y1,y2;
int color=2;
for (i=0;i<4;i++)
{
x1=20+i*80+10;
x2=20+i*80+70;
y1=120-PRes[i]*100/((double)(Num));
y2=120;
setfillstyle(SOLID_FILL,color);
bar (x1,y1,x2,y2);
color++;
}
setcolor(WHITE);
line (20,20,20,120);
line (20,120,340,120);
char str[3];
for (i=1;i<5;i++)
{
y1=120-i*20;
line(18,y1,22,y1);
itoa(i*20,str,10);
outtextxy(1,y1-5,str);
}
setcolor(MAGENTA);
outtextxy( 30,20,"Вероятности приема специалистов");
outtextxy( 30,125," ЭВМ");
outtextxy(110,125," ИСЭ");
outtextxy(190,125," ИД ");
outtextxy(270,125," КГ ");
}
//--------------------------------------------------------------------------
void DrawPDir()
{
setcolor(WHITE);
line (20,140,20,240);
line (20,240,340,240);
for (int i=1;i<4;i++)
line(20+i*80,235,20+i*80,245);
int x1,x2,y1,y2;
int color=2;
for (i=0;i<4;i++)
{
x1=20+i*80+10;
x2=20+i*80+70;
y1=240-PDir[i]*100/((double)(Num));
y2=240;
setfillstyle(SOLID_FILL,color);
bar (x1,y1,x2,y2);
color++;
}
setcolor(WHITE);
char str[3];
line (20,140,20,240);
line (20,240,340,240);
for (i=1;i<5;i++)
{
y1=240-i*20;
line(18,y1,22,y1);
itoa(i*20,str,10);
outtextxy(1,y1-5,str);
}
setcolor(GREEN);
outtextxy( 30,140,"Вероятности задач");
outtextxy( 30,245,"Уст-во");
outtextxy(110,245,"Графика");
outtextxy(190,245,"Изд.дело");
outtextxy(270,245,"Си++,Паскаль");
}
//--------------------------------------------------------------------------
void DrawMDS()
{
setcolor(BLUE);
outtextxy(30,270,"Расброс критерия Fopt отномительно M[Fotp]");
setcolor(WHITE);
line (20,260,20,360);
line (20,360,340,360);
int x,y;
moveto(23,360);
setcolor(BLUE);
for (int i=0;i
{
x=23+i*3;
y=360-(int)(M[i]);
lineto(x,y);
}
setcolor(RED);
y=360-(int)(mx);
line(20,y,340,y);
setcolor(WHITE);
char str[3];
for (i=1;i<5;i++)
{
y=360-i*20;
line(18,y,22,y);
itoa(i*20,str,10);
outtextxy(1,y-5,str);
}
}
//--------------------------------------------------------------------------
void DrawText()
{
setcolor(LIGHTGRAY);
char str1[5];
char str2[50];
outtextxy(20,400,"Расчетный коэффициэнт готовности 0.80");
gcvt(kg,3,str1);
strcpy(str2,"Реальный коэффициент готовности ");
strcat(str2,str1);
outtextxy(20,420,str2);
gcvt(pp,3,str1);
strcpy(str2,"Процент попадания ");
strcat(str2,str1);
outtextxy(20,440,str2);
outtextxy(20,460,"Выход - 'Enter'");
}
//--------------------------------------------------------------------------
void main()
{
char path[12];
About();
clrscr();
cout<<"Внимание ! Отчет о моделировании будет помещен"<
cout<<"в файл 'out.txt' текущего каталога "<
cout<<"Продолжение 'Enter'"<
getch();
int key;
int r;
randomize();
Knowlege=0;
Kn=0;
Num=0;
UnReady=0;
do
{
clrscr();
r=random(100)+1;
if (r<=Ready)
{
MakeWinMatrice();
ShowWinMatrice();
int Res=FindOptimum();
int Dir=FindDirection();
Result[Num][0]=Dir;
Result[Num][1]=Res;
PRes[Res-1]=PRes[Res-1]+1;
PDir[Dir-1]=PDir[Dir-1]+1;
Num++;
ShowRiskMatrice();
cout<
cout<<"Преимущественное направление работ :"<
switch(Dir)
{
case 1:cout<<"- устройство ЭВМ"<
case 2:cout<<"- графика"<
case 3:cout<<"- издательское дело"<
case 4:cout<<"- языки программирования"<
}
cout<<"Будет взят специалист по ";
switch(Res)
{
case 1:cout<<"ЭВМ"<
case 2:cout<<"ИСЭ"<
case 3:cout<<"ИД"<
case 4:cout<<"КГ"<
}
gotoxy(60,2); cout<<"Испытание №"<
gotoxy(65,3); cout<<"Знания "<
if (Dir==1&&Res==1) Kn++;
if (Dir==2&&Res==4) Kn++;
if (Dir==3&&Res==3) Kn++;
if (Dir==4&&Res==4) Kn++;
if ((Dir==1&&Res==1)||
(Dir==2&&Res==4)||
(Dir==3&&Res==3)||
(Dir==4&&Res==4))
Knowlege=Knowlege+2;
else Knowlege--;
if (Knowlege<0) Knowlege=1;
if (Knowlege>100) Knowlege=Knowlege-2;
}
else
{
UnReady++;
clrscr();
cout<<"Менеджер не готов решить задачу"<
}
key=ReadKey();
}
while(key!=27&&Num<100);
WriteResultToFile();
InitGraph();
DrawPRes();
DrawPDir();
DrawMDS();
DrawText();
getch();
Close();
}
//------------------------------------------------------------------------------------------------------
Модель принятия решения преферансистом на этапе торговли.