Методические указания и примеры выполнения задания №6 " Моделирование процессов принятия решений"

Вид материалаМетодические указания

Содержание


ЦЕЛЬ: Выйграть игру (используя и приобретая навыки управления обьектами в игре). ОГРАНИЧЕНИЯ
ТИП: Однокритериальная, статистическая, стохастическая.Исходный текст программы ( Реализовано на С++ )
ТИП: однокритериальная, в условиях неопределённости, статическаяИсходный текст программы ( Реализовано на С++ )
Подобный материал:
1   2   3   4   5   6   7   8   9   10

Игра



 


ЦЕЛЬ: Выйграть игру (используя и приобретая навыки управления обьектами в игре).

ОГРАНИЧЕНИЯ : Правила игры.

АЛЬТЕРНАТИВЫ: Имеется 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();

}

//------------------------------------------------------------------------------------------------------


Модель принятия решения преферансистом на этапе торговли.