Методические указания и примеры выполнения задания №6 " Моделирование процессов принятия решений"
Вид материала | Методические указания |
СодержаниеЦель: ограничения |
- Рабочая программа, методические указания по выполнению курсовой работы, темы курсовых, 1694.43kb.
- Программа дисциплины Моделирование экономических процессов для направления 080100., 53.79kb.
- Методические указания для выполнения курсовой работы по дисциплине «Теория принятия, 547.84kb.
- Методические указания к изучению курса «модели и методы принятия решений в анализе, 683.86kb.
- Методические указания к выполнению контрольных, курсовых работ По дисциплине Имитационное, 222.24kb.
- Анализ принятия управленческих решений, 54.28kb.
- Методические указания по изучению дисциплины и задания для выполнения, 272.59kb.
- Лекция №10: «Интеллектуальные системы принятия решений и управления в условиях конфликта», 581.94kb.
- Методические указания к выполнению лабораторной работы №23 по физике для студентов, 142.34kb.
- Методические указания для выполнения контрольных работ по курсу «Автоматика и автоматизация, 447.92kb.
ЦЕЛЬ:
ОГРАНИЧЕНИЯ:
АЛЬТЕРНАТИВЫ:
ТИП:
Исходный текст программы ( Реализовано на С++ ):
#include
#include
#include
#include
#include
void main()
{ clrscr();
int kol; //Сумма котрой располагает человек
int dor; //дорога
int mass2[5][2]={{3,4},{1,4},{1,2},{1,0},{1,0}};//Массив дорог
int mass1[5]={15200,13670,19893,10574,15611};//Массив стоимости компьютера в фирмах
int mass3[5]={10,7,14,7,10};//Массив срок поставки компьютера
int mass4[5]={12,12,0,6,0};//Массив гарантий на товар
int i,ind;
int j=0;
int k=0;
int good; //Удача
int fortuna; //Фортуна
int v[5]={0,0,0,0,0}; //Общее время покупки компьютера
int rez[5]; //Номера фирм
FILE *f;
f = fopen("c:\\lab6.out", "wt");
randomize();
kol=10000+(1+random(9))*1000;
for(i=0;i<5;i++)
{if(mass1[i]
if ((j==1)&&(k==0)) {ind=i;k=1;}}
if (j==1) {cout<<"Компьютер нужно покупать в ";
switch (ind)
{
case 0:cout<<"Элкоме";break;
case 1:cout<<"Симбирск М+";break;
case 2:cout<<"Аксиоме";break;
case 3:cout<<"Ретро";break;
case 4:cout<<"Computers";break;
}
exit(1);
}
if(j==5)
{cout<<"\nCуммы не хватает на покупку\n";
exit(1);}
else cout<<"\nCумма - "<
/* Формирование дороги
Приоритеты:
трамвай+пешком - 50%
пешком - 13%
трамвай - 12%
автобус+пешком - 25%
*/
dor=1+random(99);
if (dor<50) dor=1;
else if ((dor>=50)&&(dor<63)) dor=2;
else if ((dor>=63)&&(dor<75)) dor=3;
else dor=4;
cout<<"\nДорога для человек определяется так :";
switch (dor)
{
case 1:cout<<"поедет на трамвае и пойдет пешком";break;
case 2:cout<<"пойдет пешком";break;
case 3:cout<<"поедет на трамвае";break;
case 4:cout<<"поедет на автобусе и пойдет пешком";break;
}
if (dor==2) {cout<<"\nКомпьютер нужно покупать в Аксиоме\n";exit(1);}
if (dor==3) {cout<<"\nКомпьютер нужно покупать в Элкоме\n";exit(1);}
/* Удача
Приоритеты:
1 - прочитал объявление
2 - потерял прайс
3 - не то и не другое
*/
good=1+random(2);
cout<<"\n Удача: ";
switch (good)
{
case 1:cout<<"прочитал объявление";break;
case 2:cout<<"потерял прайс";break;
case 3:cout<<"изменений нет";break;
}
/* Фортуна
Приоритеты:
1 - курс $ повысился
2 - курс $ понизился
3 - остался без изменений
*/
fortuna=1+random(2);
cout<<"\n Фортуна :";
switch (fortuna)
{
case 1:cout<<"курс $ повысился";break;
case 2:cout<<"курс $ упал ";break;
case 3:cout<<"изменений нет";break;
}
/* Средняя цена компьютера
mass1 - Первоначальная цена
mass1=mass1+50 - курс $ повысился
mass1=mass1-60 - курс $ упал
*/
for (i=0;i<5;i++)
if (fortuna!=3)
if (fortuna==1) mass1[i]=mass1[i]+50;
else mass1[i]=mass1[i]-60;
for(i=0;i<5;i++)
{if(mass1[i]
if ((j==1)&&(k==0)) {ind=i;k=1;}}
if (j==1) {cout<<"\nКомпьютер нужно покупать в ";
switch (ind)
{
case 0:cout<<"Элкоме";break;
case 1:cout<<"Симбирск М+";break;
case 2:cout<<"Аксиоме";break;
case 3:cout<<"Ретро";break;
case 4:cout<<"Computers";break;
}
exit(1);
}
if(j==5)
{cout<<"\nCуммы не хватает на покупку\n";
exit(1);}
for(i=0;i<5;i++)
cout<<"\nОкончательная цена компьютеров - "<
// Выбор фирм которые подходят по стоимости
j=0;
for(i=0;i<5;i++)
if(mass1[i]
/* Среднее время покупки компьютера (не более 15 дней)
v=v+mass3 - поставка компьютера в фирму
v=v-2 - прочитал объявление
v=v+3 - потерял прайс
*/
for(i=0;i<5;i++)
{ v[i]=mass3[i];
if (good!=3)
if (good==1) v[i]=v[i]-2;
else v[i]=v[i]+3;
}
cout<<"\n Среднее время покупки компьютера в каждой фирме:\n";
for (i=0;i<5;i++)
{ cout<
cout<<" ";}
// Принятие решения
if (j<1) cout<<"Фирмы не подходят по характеристикам";
i=0;
while(i
if (v[rez[i]]>15)
{for(int d=i;d
rez[d]=rez[d+1];
j--;}
else i++;
if (j<1) cout<<"Фирмы не подходят по характеристикам";
i=0;
while(i
if (mass4[rez[i]]<1)
{for(int d=i;d
rez[d]=rez[d+1];
j--;}
else i++;
if (j<1) cout<<"Фирмы не подходят по характеристикам";
for(i=0;i
for(int a=0;a<2;a++)
{if (mass2[rez[i]][a]==dor)
{cout<<"\nРезультат - фирма найдена - это ";
switch (rez[i])
{
case 0:cout<<"Элком";break;
case 1:cout<<"Симбирск М+";break;
case 2:cout<<"Аксиома";break;
case 3:cout<<"Ретро";break;
case 4:cout<<"Computers";break;
}
fprintf(f,"|-------------------------------------------------|\n");
fprintf(f,"| Фирма | Цена | Гарантия | Срок |\n");
fprintf(f,"| | компьютера | на покупку | поставки |\n");
fprintf(f,"|(название) | (рубли) | (месяцы) | (дни) |\n");
fprintf(f,"|-----------|-------------|------------|----------|\n");
fprintf(f,"| Элком | 15200 | 12 | 10 |\n");
fprintf(f,"|Симбирск М+| 13670 | 12 | 7 |\n");
fprintf(f,"| Аксиома | 19893 | 0 | 14 |\n");
fprintf(f,"| Ретро | 10574 | 6 | 7 |\n");
fprintf(f,"| Computers | 15611 | 0 | 10 |\n");
fprintf(f,"|-------------------------------------------------|\n\n");
fprintf(f,"|-----------------------------------------------|\n");
fprintf(f,"| Фирма | |\n");
fprintf(f,"| | Как добраться до фирмы |\n");
fprintf(f,"|(название) | |\n");
fprintf(f,"|-----------|-----------------------------------|\n");
fprintf(f,"| Элком | трамвай, автобус+пешком |\n");
fprintf(f,"|Симбирск М+| трамвай+пешком,автобус+пешком |\n");
fprintf(f,"| Аксиома | трамвай+пешком, пешком |\n");
fprintf(f,"| Ретро | трамвай+пешком |\n");
fprintf(f,"| Computers | трамвай+пешком |\n");
fprintf(f,"|-----------------------------------------------|\n\n");
fprintf(f,"Фирма, которую выбрал человек - ");
switch (rez[i])
{
case 0:fprintf(f,"Элком\n");break;
case 1:fprintf(f,"Симбирск М+\n");break;
case 2:fprintf(f,"Аксиома\n");break;
case 3:fprintf(f,"Ретро\n");break;
case 4:fprintf(f,"Computers\n");break;
}
fprintf(f,"Сумма, которой располагает человек - %2d\n",kol);
fprintf(f,"Фортуна - ");
switch (fortuna)
{
case 1:fprintf(f,"курс $ повысился (+50 р)\n");break;
case 2:fprintf(f,"курс $ упал (-60 р)\n");break;
case 3:fprintf(f,"изменений нет\n");break;
}
fprintf(f,"Цена компьютера в этой фирме - %2d\n",mass1[rez[i]]);
fprintf(f,"Удача у человека - ");
switch (good)
{
case 1:fprintf(f,"прочитал объявление( -2 дня)\n");break;
case 2:fprintf(f,"потерял прайс (+3 дня)\n");break;
case 3:fprintf(f,"изменений нет\n");break;
}
fprintf(f,"Время необходимое для покупки -%2d дней\n",v[rez[i]]);
fprintf(f,"Дорога по которой отправится человек - ");
switch (dor)
{
case 1:fprintf(f,"поедет на трамвае и пойдет пешком\n");break;
case 2:fprintf(f,"пойдет пешком\n");break;
case 3:fprintf(f,"поедет на трамвае\n");break;
case 4:fprintf(f,"поедет на автобусе и пойдет пешком\n");break;
}
exit(1);}}
fclose(f);
getch();
}
Моделирование задачи автодиллера.
ЦЕЛЬ:
ОГРАНИЧЕНИЯ:
АЛЬТЕРНАТИВЫ:
ТИП:
Исходный текст программы ( Реализовано на С++ ):
K[1][0]=0.1;K[1][1]=0.15;K[1][2]=0.15;K[1][3]=0.1;
K[2][0]=0.1;K[2][1]=0.2;K[2][2]=0.95;K[2][3]=0.1;
K[3][0]=0.1;K[3][1]=0.95;K[3][2]=0.3;K[3][3]=0.1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
SaveToFile();
ViewGraph();
Dr->ShowModal();
if (MessageDlg("Результаты записаны в файл res.txt.\n"
"Желаете просмотреть его сейчас?",mtInformation,TMsgDlgButtons()
<< mbYes<
{
ViewRes->Res->Lines->LoadFromFile("res.txt");
ViewRes->ShowModal();
}
}
//---------------------------------------------------------------------------
Выбор экономичного пути на заданном рельефе.
ЦЕЛЬ:
ОГРАНИЧЕНИЯ:
АЛЬТЕРНАТИВЫ:
ТИП:
Исходный текст программы ( Реализовано на С++ ):
#include
#include
#include
#include
#include
int arr[20][20]={{5,1,5,1,2}, // матрица оценки подъёмов
{5,5,5,3,1},
{1,5,5,3,1},
{2,1,2,1,3},
{3,3,3,1,5}}
,arr2[20][20];
int num=5
,cash;
int x1,y1,x2,y2;
// Информация, возникающая в голове человека при оценке его
// дальнейшего пути
struct item2{
int x,y; // Текущее местоположение
int x2,y2; // Рассматриваемое (следующее)
int cas, // Оценка затраты сил на преодаление пути
sum; // Стоимость прихода в новую точку от начала
};
struct item{
item2 mem;
item *next;
};
class list{
item *SO;
item *SC;
public:
list(){ SO=SC=NULL; }
void AddOpen(item2 &s);
int AddClose();
friend void OpenCS(list &);
void FindWay();
};
void OpenCS(list &l)
{
item *go=l.SC;
item2 *New;
int way,way2;
while(go->next) go=go->next;
if((go->mem.x+1)
New = new item2;
New->x2=go->mem.x;
New->y2=go->mem.y;
New->y=go->mem.y;
New->x=go->mem.x+1;
way=way2=0;
// Вычисление оценки крутизны спуска или подъёма
way=arr[New->y][New->x]-arr[New->y2][New->x2];
way=(way<0)?1:(2+way*2);
// Оценка пути, предстоящего пройти до финиша
if((New->x)
way2=New->x-x2;
if((New->y)
way2=way2+New->y-y2;
New->cas=way;New->sum=way2+way;
if(way<10)l.AddOpen(*New);
}
if((go->mem.x-1)>=0){ // Смотрим слева
New = new item2;
New->x2=go->mem.x;
New->y2=go->mem.y;
New->x=go->mem.x-1;
New->y=go->mem.y;
way=way2=0;
way=arr[New->y][New->x]-arr[New->y2][New->x2];
way=(way<0)?1:(2+way*2);
if((New->x)
way2=New->x-x2;
if((New->y)
way2=way2+New->y-y2;
New->cas=way; New->sum=way+way2;
if(way<10) l.AddOpen(*New);
}
if((go->mem.y+1)
New = new item2;
New->sum=0; New->cas=0;
New->x2=go->mem.x;
New->y2=go->mem.y;
New->x=go->mem.x;
New->y=go->mem.y+1;
way=way2=0;
way=arr[New->y][New->x]-arr[New->y2][New->x2];
way=(way<0)?1:(2+way*2);
if((New->x)
way2=New->x-x2;
if((New->y)
way2=way2+New->y-y2;
New->cas=way; New->sum=way + way2;
if(way<10) l.AddOpen(*New);
}
if((go->mem.y-1)>=0){ // Смотрим вверху
New = new item2;
New->x2=go->mem.x;
New->y2=go->mem.y;
New->x=go->mem.x;
New->y=go->mem.y-1;
way=way2=0;
way=arr[New->y][New->x]-arr[New->y2][New->x2];
way=(way<0)?1:(2+way*2);
if((New->x)
way2=New->x-x2;
if((New->y)
way2=way2+New->y-y2;
New->cas=way; New->sum=way+way2;
if(way<10) l.AddOpen(*New);
}
}
void list::AddOpen(item2 &s)
{
int flag=0;
item *find = SC;
if(find)
while(find){
if(find->mem.x==s.x && find->mem.y == s.y)
flag=1;
find=find->next;
}
if(!flag){
item *go = new item;
go->mem.x=s.x;
go->mem.y=s.y;
go->mem.x2=s.x2;
go->mem.y2=s.y2; go->mem.sum=s.sum;
go->mem.cas=s.cas;
go->next=SO;
SO=go;
}
}
int list::AddClose()
{
item *go = SC;
item *find = SO;
int i=0,sum=9999,j=0;
if(!find) {
cout << "Путь не найден !" ;
exit(0);
}
if(find){
sum=find->mem.sum;
while(find){
if((find->mem.sum)
sum=find->mem.sum;
i=j;
}
find=find->next;
j++;
}
}
find=SO; j=0;
if(find && i)
for(j=0; j<(i-1) || (!find); j++)
find=find->next;
if(!i){
if(!SC){
SC=SO ;
SO=SO->next;
SC->next=NULL;
} else {
while (go->next) go=go->next;
go->next=SO;
SO=SO->next;
go->next->next=NULL;
}
} else
if(SC){
while (go->next) go=go->next;
go->next=find->next;
if (find->next->next) find->next=find->next->next;
else find->next=NULL;
go->next->next=NULL;
} else
if(find) {
SC=SO ;
SO=NULL;
SC->next=NULL;
} else return -1;
go=SC;
while(go){
randomize();
float ust=(random(99)+1)/10;
int err=random(99)+1;
int err2=random(99)+1;
div_t x = div(err,10);
div_t y = div(err2,10);
// if(go->mem.x==3) x.rem = 0;
if(go->mem.cas>30 && ust>4.3)
{
cout << "Лыжник доедет до пункта (" << go->mem.x << ":"
<< go->mem.y << ") а дальше ехать у него не хватит сил\n";
x2=go->mem.x;
y2=go->mem.y;
return 1;
}
if(!y.rem) {
cout << "Лыжник доехал до пункта (" << go->mem.x << ":"
<< go->mem.y << ") и у него сломались лыжи\n";
x2=go->mem.x;
y2=go->mem.y;
return 1;
}
if(!x.rem) {
cout << "Лыжник доехал до пункта (" << go->mem.x << ":"
<< go->mem.y << ") и у него кончились запасы продовольствия\n";
x2=go->mem.x;
y2=go->mem.y;
return 1;
}
if(go->mem.x == x2 && go->mem.y == y2 ) return 1;
go=go->next;
}
return 0;
}
void list::FindWay()
{
item *go=SC;
int x,y,sum=0,f,l=0;
int arrx[20],arry[20];
cout << " (" << x2 << "," << y2 << ") ";
arrx[l]=x2;arry[l]=y2; l++;
while((go->mem.x!=x2) || (go->mem.y != y2))
go=go->next;
while((go->mem.x2 != x1) || (go->mem.y2 != y1))
{
x=go->mem.x2; y=go->mem.y2;
cout << " (" << x << "," << y << ") ";
sum=sum+go->mem.sum;
arrx[l]=x;arry[l]=y;
l++;
go=SC;
while((go->mem.x!=x) || (go->mem.y!=y)) go=go->next;
}
cout << " (" << x1 << "," << y1 << ")\n ";
arrx[l]=x1;arry[l]=y1;
l++;
cout << "Стоимость пути = " << sum ;
cout << "\nX " ;
for(int k=0;k
cout.width(4);
cout << " " << k;}
cout << "\nY\n";
for(int i=0;i
cout << i << " ";
for(int j=0;j
f=1;
for(int d=0;d
if(arrx[d]==j && arry[d]==i) f=0;
}
if(!f){
cout.width(3);
cout << "*"<< arr[i][j] << " " ;
} else {
cout.width(3);
cout << " " << arr[i][j] << " " ;
}
}
cout << endl;
}
}
void Dr(int num)
{
cout << "X " ;
for(int k=0;k
cout.width(4);
cout << k;}
cout << "\nY\n";
for(int i=0;i
cout << i << " ";
for(int j=0;j
cout.width(3);
cout << arr[i][j] << " " ;
}
cout << endl;
}
}
void Find()
{
list List;
item2 one;
int flag=0;
one.x=x1; one.y=y1; one.cas=0;
one.x2=x1; one.y2=y1; one.sum=0;
if(x2>x1) cash=x2-x1; else cash=x1-x2;
if(y2>y1) cash=cash+y2-y1; else cash=cash+y1-y2;
List.AddOpen(one);
while(!flag){
flag = List.AddClose();
OpenCS(List);
}
cout << "Путь найден ! - ";
List.FindWay();
}
void main()
{
clrscr();
Dr(5);
cout << "Укажите начало пути (X,Y) :";
cin >> x1; cin >> y1;
cout << "Укажите конец пути (X,Y) :";
cin >> x2; cin >> y2;
Find();
}
Модель задачи перевозки грузов.
ЦЕЛЬ:
ОГРАНИЧЕНИЯ:
АЛЬТЕРНАТИВЫ:
ТИП:
Исходный текст программы ( Реализовано на С++ ):
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*
Пояснения к программе
В случае очень ценного груза больший приоритет имеет качество дороги
В случае коэф. повреждения < 15% приоритет имеет качество дороги
Если мал срок доставки(5
При прочих условиях ищется дорога с наименьшей длинной и наилучшем качеством
Если коэффициент готовности человека больше или равен 0.75,
то при прочих плохих условиях он может поехать по дороге плохого качества
*/
struct Road // структура содержащая все характеристики дороги
{ int quality; // качество дороги
int length; // длина дороги (км)
float security;// безопасность проезда по дороге(руб/км)
// затраты на безопасность составляют рубли на каждый км.
int rasresh; //0-дорога запрещена 1-дорога разрешена
};
Road RoadArray [3]; //три дороги
void main()
{
int Exit=0; //флаг выхода из моделирования
int flag=0; //выход в случае не удачной модели
float Gotov; // коэффициент готовности человека-оператора к данной работе
unsigned int Srok; // max срок доставки (в часах)
unsigned int Resurs; // ресурсы (в руб)
unsigned int Povreg; // степень повреждения (в %)
unsigned long Stoim; // стоимость груза
randomize; // генератор случайных чисел
do
{
/* Информация об авторе */
textbackground(7);
clrscr();
textattr(0x7F);
cputs("Лабораторная работа N6\n\r");
textattr(0x7E);
cputs("\"Моделирование работы\n\r");
cputs("человека-оператора\"\n\r");
textattr(0x71);
cputs("Сделал Насибулов Ш.М.\n\rЭВМд-32 1999\n\n\r");
Srok=random(20)+5; //МАХ. срок доставки груза (в часах)
Resurs=random(801)+500; //МАХ. имеющиеся ресурсы (в руб)
Povreg=random(21)+10; //МАХ. допустимая степень повреждения (в %)
Stoim=random(5000); //Стоимость перевозимого груза (в руб)
Stoim=Stoim*1000;
cout<<"МАХ. срок доставки груза (в часах): "<
cout<<"МАХ. имеющиеся ресурсы (в руб): " <
cout<<"МАХ. допустимая степень повреждения (в %): "<
cout<<"Стоимость перевозимого груза (в руб): "<
Gotov=random(500)/1000.0+0.5;
cputs("Коэффициент готовности человека-оператора к данной работе: ");
printf("%f\n\r",Gotov);
for(int i=0;i<3;i++)
{
//Генерируем характеристики дорог
RoadArray[i].quality = random(3);
RoadArray[i].length = random(490)+300;
RoadArray[i].security= random(100);
RoadArray[i].security= RoadArray[i].security/100+0.5;
//В поле rasresh заносим флаг разрешения исходя из имеющихся ресурсов
if( RoadArray[i].length * RoadArray[i].security > Resurs)
RoadArray[i].rasresh=0;
else RoadArray[i].rasresh=1;
}
for( i=0;i<3;i++)
{
textcolor(4);
cout<<"Номер дороги: "<
textcolor(1);
cout<<"Качество дороги:";
if(RoadArray[i].quality==0)
cout<<"Плохое. "<<" ";
if(RoadArray[i].quality==1)
cout<<"Удовлет."<<" ";
if(RoadArray[i].quality==2)
cout<<"Хорошее."<<" ";
cout<<"Длина дороги:";
cout<
cout<<"Безопасность(руб/км):";
cout<
}
int k=0;
for( i=0;i<3;i++)
{if(RoadArray[i].rasresh==0)
{cout<
k++;
}
}
flag=0; //разрешаем моделирование
//Если у человека не хватает ресурсов, то сообщение об этом и выход из моделир.
if(k==3)
{
cout<<"Человек не готов к выполнению данной задачи(не хватает ресурсов)"<
flag=1; //не удачная модель
}
if(flag==0 && Gotov) //удачная модель (есть хотя бы одна разрешенная дорога)
{
if(k==2) //если разрешена лишь одна дорога, то в любом случае выбираем ее
for(i=0;i<3;i++)
if(RoadArray[i].rasresh==1)
{
cout<<"Человек выбрал "<
flag=1; //выходим из моделирования
}
}
if(flag==0 && Gotov) //если моделирование продолжается
{
//Если груз очень ценнен(>3000000), то больший приоритет имеет качество дороги
if(Stoim>3000000 && Povreg<15)
{
if(k==0) //все дороги разрешены (ищем дорогу с мах качеством)
{
int kac=RoadArray[0].quality;
int ind=0;
for(i=1;i<3;i++)
if(RoadArray[i].quality >kac) {kac=RoadArray[i].quality;ind=i;}
textattr(0x7E);
cout<<"Человек выбрал "<
textattr(0x71);
flag=1;
}
}
}
if(flag==0 && Gotov)//если моделирование продолжается
{
//Если мал срок доставки(5
if(Srok<10)
{
if(k==0) //все дороги разрешены (ищем дорогу с min длиной)
{
int len=RoadArray[0].length;
int ind=0;
for(i=1;i<3;i++)
if(RoadArray[i].length
textattr(0x7E);
cout<<"Человек выбрал "<
textattr(0x71);
flag=1;
}
}
}
int q0=0;
int l0=0;
int i0=0;
if(flag==0 && Gotov)//если моделирование продолжается
{
// Ищем среди всех разрешенных дорог - дорогу с наименьшей длинной и с наилучшем
// качеством
if(k==0) //разрешены 3 дороги
{ i0=0;
l0=RoadArray[0].length;
q0=RoadArray[0].quality;
for(i=1;i<3;i++)
if(RoadArray[i].length
{i0=i;
l0=RoadArray[i].length;
q0=RoadArray[i].quality;
}
textattr(0x7E);
cout<<"Человек выбрал "<
textattr(0x71);
flag=1;
}
}
if(flag==0 && Gotov)//если моделирование продолжается
{
if(k==1) //разрешены 2 дороги
{
for(i=0;i<3;i++)
{if(RoadArray[i].rasresh==1)
{
i0=i;
l0=RoadArray[i].length;
q0=RoadArray[i].quality;
break;
}
}
for(i=0;i<3;i++)
if(RoadArray[i].length
{i0=i;
l0=RoadArray[i].length;
q0=RoadArray[i].quality;
}
textattr(0x7E);
cout<<"Человек выбрал "<
textattr(0x71);
flag=1;
}
}
cputs("\n\rПовторить выполнение моделирования (Да - Enter)(Нет - Любую клавишу):");
Exit = getch();
}
while (Exit==13);
}
Модель задачи коммивояжёра.
#include
#include
#include
#include
#include
#include
struct way{
int from; //путь из from в to
int to;
};
struct item // элемент списка
{ way del; // удаляемый путь
int value; // оценка стоимости
item * next; // указатель на след. элемент
item * negnext; // указатель на след. элемент (не)
item * prev; // указатель на пред. элемент
};
struct List{ // Элемент списка (хранит путь)
way road;
List *next;
};
// определение класса для работы с деревом поиска
class Graph {
List * First; // начало списка пути
item *Root; // корень дерева
int nmap; // размер исходной матрицы
int nduble; // размер изменяемой матрицы
unsigned Prise[9][9]; // матрица стоимостей переходов
unsigned Time[9][9]; // маирица затрат времени
unsigned map[9][9]; // исходная матрица
unsigned duble[9][9]; // изменяемая маирица (по ней находится путь)
public:
Graph();
int prived (int); // приведениематрицы
int zeros (int ,int&, int &); // оценка нулей
int del (int, int, int); // удаление строки и тсолбца
void find (); // нахождение пути
void print(); // вывод матрицы и найденного пути
void sortlist(); // сортировка пути
item* lasttwo(item *); // обработка матрицы 2х2
List* Clear(List*); // очистка списка пути
void sum();
};
// определение функций-членов класса
Graph::Graph()
{ cout<<"Введите количество магазинов (2..8)"<
do
nmap=getche()-48;
while ((nmap>8)||(nmap<2));
nduble=nmap;
randomize();
//Стоимость пути
for (int i=1; i<=nmap; i++)
for (int j=1; j<=nmap; j++)
{ if (i!=j)
Prise[i][j]=random(100);
else
Prise[i][j]=32000;
}
//Затраты времени
for (i=1; i<=nmap; i++)
for (int j=1; j<=nmap; j++)
{ if (i!=j)
Time[i][j]=random(100);
else
Time[i][j]=32000;
}
}
void Graph::sum()
{ float k1,k2;
k1=k2=1;
cout<
cin>>k1;
cout<
cin>>k2;
//нормализация
if (k1>k2)
{k2=k2/k1;
k1=1;
}
else
{k1=k1/k2;
k2=1;
}
for (int i=1; i<=nmap; i++)
for (int j=1; j<=nmap; j++)
{if (i!=j)
map[i][j]=duble[i][j]=(int)(Prise[i][j]*k1)+(int)(Time[i][j]*k2);
else map[i][j]=duble[i][j]=32000;
}
for (i=0; i<=nmap; i++)
{map[0][i]=map[i][0]=duble[0][i]=duble[i][0]=i;
Prise[0][i]=Prise[i][0]=Time[0][i]=Time[i][0]=i;
}
Root=new item;
Root->del.from=Root->del.to=32000;
Root->next=Root->negnext=Root->prev=NULL;
}
int Graph::prived(int razm) // после работы функции в каждом
{ int i, j, delta=0, find=0; // сстолбце и строке матрицы есть
for (i=1; i<=razm; i++) // хотябы 1 нуль
{ for (j=1; j<=razm; j++) // функция возвращает стоимоссть данного
if (duble[i][j]==0) // преобразования
{ find=1;
break;
}
if (!find)
{ int min;
min=duble[i][1];
for (j=1; j<=razm; j++)
if (duble[i][j]
delta=delta+min;
for (j=1; j<=razm; j++)
duble[i][j]=duble[i][j]-min;
}
find=0;
}
for (j=1;j<=razm; j++)
{ for (i=1; i<=razm; i++)
if (duble[i][j]==0)
{ find=1;
break;
}
if (!find)
{ int min;
min=duble[1][j];
for (i=1; i<=razm; i++)
if (duble[i][j]
delta=delta+min;
for (i=1; i<=razm; i++)
duble[i][j]=duble[i][j]-min;
}
find=0;
}
return delta;
}
int Graph::zeros (int razm,int &x, int &y) // функция возвращает оценку
{ int i, j, maxprise=0; // самого дорогого нуля
x=y=100; // и помещает в x и y номер
for (i=1; i<=razm; i++) // строки и столбца с
for (j=1; j<=razm; j++) // максимальной оценкой
if (duble[i][j]==0)
{ int min, prise=0;
min=32000;
for (int k=1; k<=razm; k++)
if ((duble[i][k]
prise=prise+min;
min=32000;
for (k=1; k<=razm; k++)
if ((duble[k][j]
prise=prise+min;
if (prise>maxprise)
{ maxprise=prise;
x=duble[i][0];
y=duble[0][j];
}
}
return maxprise;
}
void Graph::print()
{
cout<
for (int i=0; i<=nmap; i++)
{ for (int j=0; j<=nmap; j++)
{ cout.flags(ios::left);
cout.width(6);
cout.fill(' ');
cout<
}
cout<
}
cout<
for (i=0; i<=nmap; i++)
{ for (int j=0; j<=nmap; j++)
{ cout.flags(ios::left);
cout.width(6);
cout.fill(' ');
cout<
}
cout<
}
getch();
clrscr();
cout<
for (i=0; i<=nmap; i++)
{ for (int j=0; j<=nmap; j++)
{ cout.flags(ios::left);
cout.width(6);
cout.fill(' ');
cout<
}
cout<
}
List *point=First;
cout<
cout<
road.from<<" ";
while (point)
{
cout<
road.to<<" ";
point=point->next;
}
}
void Graph::sortlist() // ф-я расставляет элементы
{ List *tmp,*point=First, *point1=First; // списка (путь) так, чтобы
int find=1, n=0, i=0; // поле to элеемнта
while (point) // было равно полю from
{ n++; // следующего элемента
point=point->next;
}
while (point1)
{
find=0;
point=First;
while (point)
{ if (point1->road.to==point->road.from)
{
tmp=point1;
while ((tmp->next!=point)&&(tmp))
tmp=tmp->next;
if (!tmp)
{ tmp=First;
while (tmp->next!=point1)
tmp=tmp->next;
List *tmp1=First;
if (point!=First)
while (tmp1->next!=point)
tmp1=tmp1->next;
tmp->next=point1->next;
point1->next=point;
if (tmp1==First) First=point1;
else tmp1->next=point1;
find=1;
point1=tmp;
}
else
{ tmp->next=point->next;
point->next=point1->next;
point1->next=point;
find=1;
}
break;
}
point=point->next;
}
if ((!find)&&(point1==First))
{ i++;
tmp=point=First;
while (point->next)
point=point->next;
point->next=tmp;
First=First->next;
tmp->next=NULL;
if (First)
if (i<=n) point1=First;
else point1=point->next;
}
else
point1=point1->next;
}
}
List* Graph::Clear(List*p)
{ List*point;
while (p)
{ point=p;
p=point->next;
delete point;
}
return p;
}
int Graph::del (int razm, int x, int y) // удаление строки и столбца,
{ int i, j, k; // содержащих самый дорогой нуль
for (i=1; i<=razm; i++) // также запрещается переход,
if (duble[i][0]==x) k=i; // замыкающий найденный путь
for (i=k; i
for (j=0; j<=razm; j++)
duble[i][j]=duble[i+1][j];
for (j=1; j<=razm; j++)
if (duble[0][j]==y) k=j;
for (j=k; j
for (i=0; i<=razm; i++)
duble[i][j]=duble[i][j+1];
for (i=1; i
for (j=1; j
if ((duble[i][0]==y)&&(duble[0][j]==x))
duble[i][j]=32000;
sortlist();
List *point=First;
if (point)
while (point->next)
{ if (point->road.to!=point->next->road.from) break;
point=point->next;
}
for (i=1; i
for (j=1; j
if ((duble[i][0]==point->road.to)&&(duble[0][j]==First->road.from))
duble[i][j]=32000;
return --razm;
}
item* Graph::lasttwo(item *p)
{ List *point;
item *tmp1, *tmp2;
tmp2=new item;
tmp1=new item;
p->next=tmp1;
tmp1->prev=p;
tmp1->next=tmp1->negnext=NULL;
tmp1->value=p->value;
tmp1->del.from=duble[1][0];
tmp2->del.from=duble[2][0];
if ((duble[1][1]==0)&&(duble[2][2]==0))
{
tmp1->del.to=duble[0][1];
tmp2->del.to=duble[0][2];
}
else
{
tmp1->del.to=duble[0][2];
tmp2->del.to=duble[0][1];
}
p=p->next;
p->next=tmp2;
tmp2->prev=p;
tmp2->next=tmp2->negnext=NULL;
tmp2->value=p->value;
point=new List;
point->road.from=tmp1->del.from;
point->road.to=tmp1->del.to;
List *t=First;
if (t)
{
while(t->next)
t=t->next;
point->next=NULL;
t->next=point;
}
else
{ First=point;
point->next=NULL;
}
point=new List;
point->road.from=tmp2->del.from;
point->road.to=tmp2->del.to;
t=First;
if (t)
{
while(t->next)
t=t->next;
point->next=NULL;
t->next=point;
}
else
{ First=point;
point->next=NULL;
}
return p;
}
void Graph::find() // поиск пути
{ First=NULL; // рпоходит до конца по левой ветке
int maxvalue; // дерева. Запоминается путь и его
Root->value=prived(nduble); // стоимость. Все вершины с такой же
item *tmp; // или более дорогой стоимостью удаляются.
int line=1, stolb=1; // После возвращения к корню проходит по
tmp=Root; // неудаленному пути и если матрица не
while (nduble>2) // полностьью удалена, то создаеься
{ List *point; // дальнейший путь (если ст-ть созданной
item *tmp1, *tmp2; // вершины больше стоимости пути, то
tmp1=new item; // верршина удаляется и дальше не
tmp2=new item; // просматрривается). Если путь меньше
tmp->negnext=tmp2; // старого, то он запоминается. Так продолж.
tmp2->prev=tmp; // пока все вершины кроме корня не удалены
tmp2->next=tmp2->negnext=NULL;
tmp2->value=zeros(nduble,line,stolb)+tmp->value;
point=new List;
point->road.from=line;
point->road.to=stolb;
List *t=First;
if (t)
{
while(t->next)
t=t->next;
point->next=NULL;
t->next=point;
}
else
{ First=point;
point->next=NULL;
}
nduble=del(nduble,line,stolb);
tmp2->del.from=-line;
tmp2->del.to=-stolb;
tmp->next=tmp1;
tmp1->prev=tmp;
tmp1->next=tmp1->negnext=NULL;
tmp1->value=prived(nduble)+tmp->value;
tmp1->del.from=line;
tmp1->del.to=stolb;
tmp=tmp->next;
}
tmp=lasttwo(tmp);
sortlist();
maxvalue=tmp->next->value;
List *First1=First;
First=NULL;
maxvalue=tmp->value;
while ((Root->next)||(Root->negnext))
{ int i,j;
for (i=0; i<=nmap; i++)
for (j=0; j<=nmap; j++)
duble[i][j]=map[i][j];
nduble=nmap;
while (tmp!=Root)
{ if (tmp->next)
if (tmp->next->value>=maxvalue)
{ delete tmp->next;
tmp->next=NULL;
}
if (tmp->negnext)
if (tmp->negnext->value>=maxvalue)
{ delete tmp->negnext;
tmp->negnext=NULL;
}
if ((!tmp->next)&&(!tmp->negnext))
{ item *tmp1=tmp;
tmp=tmp->prev;
if (tmp->next==tmp1) tmp->next=NULL;
else tmp->negnext=NULL;
delete tmp1;
}
else tmp=tmp->prev;
}
if ((Root->negnext)&&(Root->negnext->value>=maxvalue))
{ delete Root->negnext;
Root->negnext=NULL;
continue;
}
Root->value=prived(nduble);
int line=1, stolb=1;
int exit;
tmp=Root;
while (nduble>2)
{ List *point;
item *tmp1, *tmp2;
exit=0;
tmp1=tmp->next;
if (tmp1)
{ zeros(nduble,line,stolb);
nduble=del(nduble,line,stolb);
prived(nduble)+tmp->value;
tmp=tmp->next;
point=new List;
point->road.from=tmp->del.from;
point->road.to=tmp->del.to;
List *t=First;
if (t)
{
while(t->next)
t=t->next;
point->next=NULL;
t->next=point;
}
else
{ First=point;
point->next=NULL;
}
continue;
}
tmp2=tmp->negnext;
if (tmp2)
{ tmp=tmp->negnext;
for (i=1; i
for (j=1; j
if ((duble[i][0]==-tmp->del.from)&&(duble[0][j]==-tmp->del.to))
duble[i][j]=32000;
prived(nduble);
continue;
}
if ((!tmp->next)&&(!tmp->negnext)&&(tmp->value
{ if (tmp==Root)
{ exit=1;
break;
}
tmp1=new item;
tmp2=new item;
tmp->negnext=tmp2;
tmp2->prev=tmp;
tmp2->next=tmp2->negnext=NULL;
tmp2->value=zeros(nduble,line,stolb)+tmp->value;
nduble=del(nduble,line,stolb);
tmp2->del.from=-line;
tmp2->del.to=-stolb;
tmp->next=tmp1;
tmp1->prev=tmp;
tmp1->next=tmp1->negnext=NULL;
tmp1->value=prived(nduble)+tmp->value;
tmp1->del.from=line;
tmp1->del.to=stolb;
if (tmp1->value>=maxvalue)
{ delete tmp->next;
tmp->next=NULL;
}
else
{ point=new List;
point->road.from=tmp1->del.from;
point->road.to=tmp1->del.to;
List *t=First;
if (t)
{
while(t->next)
t=t->next;
point->next=NULL;
t->next=point;
}
else
{ First=point;
point->next=NULL;
}
}
if (tmp2->value>=maxvalue)
{ delete tmp->negnext;
tmp->negnext=NULL;
}
if ((!tmp->next)&&(!tmp->negnext))
{ exit=1;
First=Clear(First);
break;
} else
{ if (tmp->next)
{ tmp=tmp->next;
continue;
}
if (tmp->next)
tmp=tmp->next;
}
}
}
if(!exit)
{ //List *point;
tmp=lasttwo(tmp);
if (maxvalue>tmp->value)
{ First1=Clear(First1);
First1=First;
First=NULL;
sortlist();
maxvalue=tmp->value;
}
}
}
List *point;
while (First)
{ point=First;
First=point->next;
delete point;
}
First=First1;
sortlist();
print();
delete Root;
First=Clear(First);
cout<
}
void main()
{ clrscr();
randomize();
Graph a;
int kod=0;
int t=random (10);
int k=100*(exp(-t/7)+0.12*(-11.9*exp(-t/5)+exp(-12*t)*0.1+11.8*exp(-t/7)));
int l=random(100);
if (k>l)
{while (kod!=27)
{clrscr();
a.sum();
a.find();
cout<
cout<
<<"любую другую клавишу."<
kod=getch();
}
}
else
{cout<
getch();
}
}
Модель выбора оптимального маршрута движения.
#include
#include
#include
#include
#include
#include
#include
#include
//Объявление всех используемых в программе переменных
int i,j,k,l;//Переменные управления циклами
float al;//промежуточные переменные
float timm,cocl,bez,way,hh;
int num,temp;
//объявление всех матриц в том числе
//и для промежуточного использования
float mas[5][3];
float prom[5][30];
int kol[5];
float tik[4];
float tik2[5];
float mas1[5];
float mas2[4];
float risk[5][4];
float ll[5];
float speed;
float maxi;
float mini;
int moda;
int opred[5];
float disp[5];
float l0;//интенсивность забывания информации(в месяцах)
float lu1;//интенсивность восстановления знаний(в минутах)
float l1;//интенсивность забывания после восстановления
float liop;
float p0,p2;
float mytime;//время
int var;
int kolich[5];
float ver[5];
int kk;
int ujk;
void main()
{
//переопределение потокового ввода-вывода для записи в 3 файла
//в файле ddd.111 хранятся сами решения
//в матрицы рисков и выигрышей
//в коэффициент готовности и выводы по нему
ofstream f("ddd.111");
ofstream f1("ddd.222");
ofstream f2("ddd.333");
//подсчёт коэффициента готовности и вывод его в файл
randomize();
l0=0.001+random(5)/100.0;l1=0.001+random(5)/100.0;lu1=0.99;
mytime=random(12);
p0=(pow(2.17,(-l0*mytime)));
liop=((l0-lu1)*(pow(2.17,(-l1*mytime)))+(l1-l0)*(pow(2.17,(-lu1*mytime)))+(lu1-l1)*(pow(2.17,(-l0*mytime))));
p2=((lu1*l0)/((l1-lu1)*(lu1-l0)*(l0-l1)))*liop;
f2<<"Коэффициент готовности на момент времени t = "<
f2<<"составляет Кг= "<
f2<<"Это значит,что оператор с заданными характеристиками"<
f2<<"изменений знаний в период времени "<
f2<<"А именно:"<
f2<<"Интенсивность забывания единиц деятельности = "<
f2<<"Интенсивность восстановления = "<
f2<<"Интенсивность забывания после этого восстановления = "<
f2<<"в состоянии выполнить в среднем "<<(p0+p2)*100<
f2<<"oпределённых единиц деятельности из"<
f2<<"100 предъявленных ему в случайный момент времени"<
clrscr();
f<<"Файл содержащий результаты выбора решений"<
f1<<"Файл содержит распечатки матриц выйгрышей и рисков"<
//основной цикл всех расчётов
for(int kkk=1;kkk<21;kkk++)
{
kolich[0]=0;
kolich[1]=0;
kolich[2]=0;
kolich[3]=0;
kolich[4]=0;
opred[0]=0;
opred[1]=0;
opred[2]=0;
opred[3]=0;
opred[4]=0;
moda=0;
randomize();
f1<
f1<<"Кол-во машин = "<
f<<"Кол-во машин = "<
f<<"Варианты решений при 10-ти испытаниях"<
temp=0;
ujk=0;
//в этом цикле каждый раз строятся матрицы выигрышей и рисков
for(int kkkk=10;kkkk<110;kkkk=kkkk+10)
{
hh=20;
kk=random(kkkk);
ll[0]=hh;
ll[1]=kk+25;
ll[2]=kk+50;
ll[3]=kk+90;
ll[4]=kk+110;
mas[0][1]=1.0;
way=(sqrt(pow(hh,2)+pow(ll[0],2)));
mas[1][1]=way/(hh+ll[1]);
for(i=2;i<5;i++)
{
mas[i][1]=way/(mas[1][1]+2*ll[i]);
}
bez=1.0;
for(i=0;i<4;i++)
{
mas[i][0]=((bez/(kkk*((ll[4]+hh)/(hh+ll[i])))));
}
mas[4][0]=1.0;
mas[3][0]=mas[3][0];
mas[0][2]=1.0;
for(i=1;i<5;i++)
{
mas[i][2]=mas[i][1]/1.33;
}
for(j=0;j<3;j++)
{
maxi=0;
for(i=0;i<5;i++)
{
if(mas[i][j]>maxi)
{
maxi=mas[i][j];
tik[j]=maxi;
}
}
}
for(j=0;j<3;j++)
{
for(i=0;i<5;i++)
{
risk[i][j]=tik[j]-mas[i][j];
}
}
for(i=0;i<5;i++)
{
maxi=0;
for(j=0;j<3;j++)
{
if(risk[i][j]>maxi)
{
maxi=risk[i][j];
tik2[i]=maxi;
}
}
}
mini=1.0;
for(i=0;i<5;i++)
{
if(tik2[i]
{
mini=tik2[i];
var=i;
}
}
prom[0][temp]=way;
prom[1][temp]=hh+kk+25;
prom[2][temp]=hh+2*(kk+50);
prom[3][temp]=hh+2*(kk+90);
prom[4][temp]=hh+2*(kk+110);
temp++;
switch (var)
{
case 0:
{
kolich[0]++;
opred[0]=kolich[0];
break;
}
case 1:
{
kolich[1]++;
opred[1]=kolich[1];
break;
}
case 2:
{
kolich[2]++;
opred[2]=kolich[2];
break;
}
case 3:
{
kolich[3]++;
opred[3]=kolich[3];
break;
}
case 4:
{
kolich[4]++;
opred[4]=kolich[4];
break;
}
};
//вывод результатов в файл
f<
f1<
f<
f1<<"Матрица выйгрышей";
for(i=0;i<5;i++)
{
f1<
for(j=0;j<3;j++)
{
f1<<" "<
}
}
f1<
f1<<"Матрица рисков";
for(i=0;i<5;i++)
{
f1<
for(j=0;j<3;j++)
{
f1<<" "<
}
}
f1<
}
ver[0]=kolich[0]/10.0;
ver[1]=kolich[1]/10.0;
ver[2]=kolich[2]/10.0;
ver[3]=kolich[3]/10.0;
ver[4]=kolich[4]/10.0;
int maxus=0;
for(int h=0;h<5;h++)
{
if(opred[h]>maxus)
{
maxus=opred[h];
moda=h;
}
}
//вывод результатов в файл
f<<"Вероятность выбора 0-го решения "<
f<<"Вероятность выбора 1-го решения "<
f<<"Вероятность выбора 2-го решения "<
f<<"Вероятность выбора 3-го решения "<
f<<"Вероятность выбора 4-го решения "<
for( h=0;h<5;h++)
{
if(opred[h]==maxus)
{
f<<"Мода "<