Методические указания и примеры выполнения задания №6 " Моделирование процессов принятия решений"
Вид материала | Методические указания |
- Рабочая программа, методические указания по выполнению курсовой работы, темы курсовых, 1694.43kb.
- Программа дисциплины Моделирование экономических процессов для направления 080100., 53.79kb.
- Методические указания для выполнения курсовой работы по дисциплине «Теория принятия, 547.84kb.
- Методические указания к изучению курса «модели и методы принятия решений в анализе, 683.86kb.
- Методические указания к выполнению контрольных, курсовых работ По дисциплине Имитационное, 222.24kb.
- Анализ принятия управленческих решений, 54.28kb.
- Методические указания по изучению дисциплины и задания для выполнения, 272.59kb.
- Лекция №10: «Интеллектуальные системы принятия решений и управления в условиях конфликта», 581.94kb.
- Методические указания к выполнению лабораторной работы №23 по физике для студентов, 142.34kb.
- Методические указания для выполнения контрольных работ по курсу «Автоматика и автоматизация, 447.92kb.
}
}
}
f.close();
f1.close();
f2.close();
cout<<"ВНИМАНИЕ"<
cout<<"Результаты всей работы хранятся в файлах"<
cout<<"ddd.111,ddd.222,ddd.333"<
delay(1000);
}
Оптимизация трассировки городского водопровода.
ЦЕЛЬ:
ОГРАНИЧЕНИЯ:
АЛЬТЕРНАТИВЫ:
ТИП:
Исходный текст программы ( Реализовано на С++ ):
#include
#pragma hdrstop
#include
#include
#include "about.h"
#include "mainunit.h"
#include
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
int BoardMas[10][10];
int BeginX,BeginY;
int EndX,EndY;
TForm1 *Form1;
//-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
CntOpen = 0;
CntClose = 0;
Image->Canvas->Brush->Color=clBlack;
Image->Canvas->FillRect(Rect(0,0,320,320));
}
//-------------------------------------------------------------------
void __fastcall TForm1::GenerateButtonClick(TObject *Sender)
{
//Очищаем все списки
open.clear();
close.clear();
path.clear();
//Очищаем выводимый текст
GenState->Text="0";
PerState->Text="0";
DisState->Text="0";
LengthPath->Text="0";
PricePath->Text="0";
//Генерируем поле
int i,j,tmp;
randomize();
for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
tmp=random(6);
BoardMas[i][j]=tmp;
ImageList->Draw(Image->Canvas,i*32,j*32,tmp);
}
}
//Обновляем изображение поля
Image->Refresh();
}
//-------------------------------------------------------------------
void __fastcall TForm1::ImageMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
int pX=X/32,pY=Y/32;
//Редактирования карты
if (SpeedButton1->Down){
BoardMas[pX][pY]=0;
ImageList->Draw(Image->Canvas,pX*32,pY*32,0);
Image->Refresh();
}
if (SpeedButton2->Down){
BoardMas[pX][pY]=1;
ImageList->Draw(Image->Canvas,pX*32,pY*32,1);
Image->Refresh();
}
if (SpeedButton3->Down){
BoardMas[pX][pY]=2;
ImageList->Draw(Image->Canvas,pX*32,pY*32,2);
Image->Refresh();
}
if (SpeedButton4->Down){
BoardMas[pX][pY]=3;
ImageList->Draw(Image->Canvas,pX*32,pY*32,3);
Image->Refresh();
}
if (SpeedButton5->Down){
BoardMas[pX][pY]=4;
ImageList->Draw(Image->Canvas,pX*32,pY*32,4);
Image->Refresh();
}
if (SpeedButton6->Down){
BoardMas[pX][pY]=5;
ImageList->Draw(Image->Canvas,pX*32,pY*32,5);
Image->Refresh();
}
//Установка начальной и конечной точки проложения трубопровода
if (BeginButton->Down){
BeginX=pX;
BeginY=pY;
BeginButton->Down=false;
StatusBar->Panels->Items[1]->Text="Старт X: "+AnsiString(pX) +
" Y: "+AnsiString(pY);
}
if (EndButton->Down){
EndX=pX;
EndY=pY;
EndButton->Down=false;
StatusBar->Panels->Items[2]->Text="Финиш X: "+AnsiString(pX) +
" Y: "+AnsiString(pY);
}
}
//-------------------------------------------------------------------
void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
StatusBar->Panels->Items[0]->Text="X: "+AnsiString(X/32) + " Y: "+AnsiString(Y/32);
}
//-------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
//Высвобождаем списки
open.clear();
close.clear();
path.clear();
}
//-------------------------------------------------------------------
void __fastcall TForm1::StartFindClick(TObject *Sender)
{
//Очищаем все списки
open.clear();
close.clear();
path.clear();
//Очищаем выводимый текст
GenState->Text="0";
PerState->Text="0";
DisState->Text="0";
LengthPath->Text="0";
PricePath->Text="0";
beginState = TState(BeginX,BeginY,-1,-1,0,
abs((BeginX-EndX)+(BeginY-EndY))*2);
endState = TState(EndX,EndY,-1,-1,0,0);
if(beginState==endState)
{
MessageDlg(
"Исходная точка является конечной !?!?",
mtInformation, TMsgDlgButtons() << mbOK,0);
}
else {
CntOpen=0;
CntClose=0;
TState N;
// ************************ 1 ***************************
N=beginState;
open.push_back(N);
// ************************ 2 ***************************
while(!open.empty())
{
// дадим возможность Windows немного поработать
Application->ProcessMessages();
// ************************ 3 ***************************
int Price_F_NI=0xFFFF;//В начале оценка всегда самая большая
for (BI=open.begin();BI!=open.end();BI++)
if ( (*BI).G+(*BI).H < Price_F_NI )
{
Price_F_NI=(*BI).G+(*BI).H;
Select_F_Min=BI;
}
N=*Select_F_Min;
// ************************ 4 ***************************
if (N==endState){
int PathLength=0; //длина пути
int PathPrice =0; //стоимость пути
CntPath=path.begin();
path.push_back(N);
PathPrice=N.G;
//Строим путь
BI=close.end();
while (BI!=close.begin()){
// дадим возможность Windows немного поработать
Application->ProcessMessages();
if ((*BI).X==N.XOld && (*BI).Y==N.YOld){
path.insert(path.begin(),*BI);
N=*BI;
BI=close.end();
PathLength++;
}
BI--;
}
// path.insert(path.begin(),beginState);
LengthPath->Text=IntToStr(PathLength+1);
PricePath ->Text=IntToStr(PathPrice);
//Прорисовываем путь на экран
Image->Canvas->Brush->Color=clBlack;
Image->Canvas->MoveTo((beginState.X+1)*32-16,
(beginState.Y+1)*32-16);
Image->Canvas->Pen->Color=clRed;
for (CntPath=path.begin();CntPath!=path.end();CntPath++)
Image->Canvas->LineTo(((*CntPath).X+1)*32-16,((*CntPath).Y+1)*32-16);
MessageDlg("Водопровод проложен !!! ",
mtInformation, TMsgDlgButtons() << mbOK,0);
return;
}
// ************************ 5 ***************************
//Переносим из "Открыт" в "Закрыт"
open.erase(Select_F_Min);
close.push_back(N);
int num=N.NumChildren();
//Выводим кол-во сгенерированных вершин
GenState->Text=IntToStr(StrToInt(GenState->Text)+num);
//Выводим кол-во раскрытых вершин
DisState->Text=IntToStr(CntClose++);
for (int i=1;i<=num;i++) {
//Генерируем повое состояние
TState NewState=N.ChildState(i);
bool present=false;
//Ищем его в списке открыт
for (BI=open.begin();BI!=open.end();BI++)
if (NewState==(*BI)){
if ((NewState.G+NewState.H)<((*BI).G+(*BI).H)){
open.erase(BI);
break;
}
else {
present=true;
break;
}
}
//Ищем его в списке закрыт
for (BI=close.begin();BI!=close.end();BI++)
if (NewState==(*BI)){
if ((NewState.G+NewState.H)<((*BI).G+(*BI).H)){
close.erase(BI);
break;
}
else {
present=true;
break;
}
}
//Заносим в список
if (present==false) {
open.push_back(NewState);
//Выводим кол-во перспективных вершин
PerState->Text=IntToStr(CntOpen++);
}
}
}//while
MessageDlg("Облом !!! Водопровод проложить не удаётся.",
mtInformation, TMsgDlgButtons() << mbOK,0);
return;
}//else
}
//-------------------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender)
{
Close();
}
//-------------------------------------------------------------------
void __fastcall TForm1::AboutMenuClick(TObject *Sender)
{
AboutForm->ShowModal();
}
//-------------------------------------------------------------------
void __fastcall TForm1::SaveClick(TObject *Sender)
{
int i,j;
char a[100];
AnsiString b;
if(SaveDialog->Execute()){
//**************
b=SaveDialog->FileName+".map";
strcpy(a,b.c_str());
ofstream FL(a);
FL.close();
for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
FL.open(a,ios::app);
FL << BoardMas[i][j] << " ";
FL.close();
}
}
FL.close();
}
}
//-------------------------------------------------------------------
void __fastcall TForm1::OpenClick(TObject *Sender)
{
int i,j;
char a[100];
AnsiString b;
int tmp;
if(OpenDialog->Execute()){
//**************
b=OpenDialog->FileName;
strcpy(a,b.c_str());
ifstream FL(a);
FL.close();
FL.open(a,ios::app);
for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
FL >> tmp;
tmp = tmp & 0x0F;
BoardMas[i][j]=tmp;
ImageList->Draw(Image->Canvas,i*32,j*32,tmp);
}
}
FL.close();
//Обновляем изображение поля
Image->Refresh();
}
}
Модель формирования заданий на проектирование систем «человек – оператор – человек».
ЦЕЛЬ:
ОГРАНИЧЕНИЯ:
АЛЬТЕРНАТИВЫ:
ТИП:
Исходный текст программы (Реализовано на Pascal):
uses crt;
const
s1='Иванов'; s2='Петров';s3='Cидоров';s4='Нуклеинов';s5='Парамонов';
var
ff:array[1..5] of string; {ff- массив фамилий участников проекта }
v:array[1..5] of integer;{v-время работы 'канала'- участника проекта }
q:array[1..5] of integer;{q-массив трудоемкостей участников проекта }
pr:array[1..5] of integer;{pr-массив процессоров у участников проекта }
i,j:integer; {различные счетчики }
ja, {ja-выбранный язык программирования }
st, {st-стиль окна, выбранный Сидоровым }
gr, {gr-кому достанется работа с графикой }
fo, {fo-номер человека,которому улыбнулась Фортуна }
ne:integer; {ne-номер 'неудачника' }
begin
textattr:=7; clrscr;
ff[1]:='Иванов'; ff[2]:='Петров'; ff[3]:='Cидоров';
ff[4]:='Нуклеинов'; ff[5]:='Парамонов';
writeln(' Имеется таблица с информацией о 5 участниках курсового проекта:');
for i:=1 to 67 do write('-'); writeln;
writeln('| Фамилия | Имеет опыт со следующими видами работ | Язык | ');
for i:=1 to 67 do write('-'); writeln;
writeln('| Иванов | Графика | C++ |');
writeln('| Петров | Графика; обработка массивов записей | PAS |');
writeln('| Сидоров | Графика; работа с меню | PAS,C++ |');
writeln('| Нуклеинов | Работа с динамической памятью | PAS,C++ |');
writeln('| Парамонов | Работа с прерываниями; знания математики | ASM |');
for i:=1 to 67 do write('-'); writeln;
{ Выбор языка программирования }
{ Приоритеты языков: PAS - 90% ; C++ - 7% ; ASM - 3% }
randomize;
ja:=random(100)+1;
if ja<91 then ja:=1
else if ja<98 then ja:=2 else ja:=3;
writeln;
writeln('Программа (наш оператор) сгенерировала следующeе :');
write(' Языком программирования был выбран ');
if ja=1 then write('Паскаль')
else if ja=2 then write('С++') else write('язык Ассемблера');
readkey;
{ Определение, кому достанется работа с графикой }
{ Приоритеты: Ивaнов-88% ; Петров,Сидоров-6%}
gr:=random(100)+1;
if gr<89 then gr:=1
else if gr<95 then gr:=2
else gr:=3;
writeln(';');write(' Работа с графикой досталась ');
if gr=1 then write('Ивaнов')
else if gr=2 then write('Петров')
else write('Сидоров');
writeln('y;');
readkey;
if (ja>1) or (gr>1) then { Выход из программы }
begin
writeln; textattr:=46;
writeln(' Сгенерированная модель неэффективна! Произведение дальнейшего');
writeln('моделирования системы нецелесообразно!');
writeln; textattr:=57;
if (ja>1) then
writeln(' Знанием выбранного языка обладают не все члены проекта')
else
writeln(' При данном выборе ''простой'' Иванова равен 1.');
end
else
begin
{ Выбор Сидоровым вида выплывающего окна:}
{ Приоритеты сторон: справа-32% ; слева-30% ; сверху-25% ; снизу-13%}
st:=random(100)+1;
if st<33 then st:=1
else if st<63 then st:=2
else if st<88 then st:=3
else st:=4;
writeln;write(' Сидоровым был выбран ''');
if st=1 then write('горизонтальный справа''')
else if st=2 then write('горизонтальный слева''')
else if st=3 then write('вертикальный сверху''')
else write('вертикальный снизу''');
writeln(' тип выплывающего окна;');
readkey;clrscr;
{ Распределение оборудования.Виды оборудования(процессора): }
{ 1. Pentium-100 }
{ 2. Pentium-120 }
{ 3. Pentium-133 }
{ 4. Pentium-150 }
{ 5. Pentium-166 }
pr[1]:=random(5)+1;
pr[2]:=random(5)+1;
if pr[1]=pr[2] then pr[2]:=pr[1]+1;
if pr[2]>5 then pr[2]:=1;
pr[3]:=random(2)+1;
if pr[3]=1 then
begin
if (pr[1]<>3) and (pr[2]<>3) then pr[3]:=3;
if (pr[1]<>2) and (pr[2]<>2) then pr[3]:=2;
if (pr[1]<>1) and (pr[2]<>1) then pr[3]:=1;
end
else
begin
if (pr[1]<>3) and (pr[2]<>3) then pr[3]:=3;
if (pr[1]<>4) and (pr[2]<>4) then pr[3]:=4;
if (pr[1]<>5) and (pr[2]<>5) then pr[3]:=5;
end;
pr[4]:=random(2)+1;
if pr[4]=1 then
begin
if (pr[1]<>4) and (pr[2]<>4) and (pr[3]<>4) then pr[4]:=4;
if (pr[1]<>3) and (pr[2]<>3) and (pr[3]<>3) then pr[4]:=3;
if (pr[1]<>2) and (pr[2]<>2) and (pr[3]<>2) then pr[4]:=2;
if (pr[1]<>1) and (pr[2]<>1) and (pr[3]<>1) then pr[4]:=1;
end
else
begin
if (pr[1]<>2) and (pr[2]<>2) and (pr[3]<>2) then pr[4]:=2;
if (pr[1]<>3) and (pr[2]<>3) and (pr[3]<>3) then pr[4]:=3;
if (pr[1]<>4) and (pr[2]<>4) and (pr[3]<>4) then pr[4]:=4;
if (pr[1]<>5) and (pr[2]<>5) and (pr[3]<>5) then pr[4]:=5;
end;
for i:=1 to 5 do
if (pr[1]<>i) and (pr[2]<>i) and (pr[3]<>i) and (pr[4]<>i) then pr[5]:=i;
writeln;
writeln(' Были сгенерированы следующие виды процессоров участников:');
writeln(' Иванов имеет ',pr[1],'-й вид процессора');
writeln(' Петров имеет ',pr[2],'-й вид процессора');
writeln(' Cидоров имеет ',pr[3],'-й вид процессора');
writeln(' Нуклеинов имеет ',pr[4],'-й вид процессора');
writeln(' Парамонов имеет ',pr[5],'-й вид процессора');
writeln;
writeln('Примечание : | Номер процессора | Процессор |');
writeln(' | 1 | Pentium-100 |');
writeln(' | 2 | Pentium-120 |');
writeln(' | 3 | Pentium-133 |');
writeln(' | 4 | Pentium-150 |');
writeln(' | 5 | Pentium-166 |');
{ Генерация человека, которому 'повезло': нашел доп. лит-ру, либо }
{ товарища умного и т.д. Если выпало число 6 - счастливчика нет.}
fo:=random(6)+1;
if fo<6 then
begin
readkey;
writeln;
writeln(' ',ff[fo],'y повезло. Он купил нужную для себя книгу.');
writeln(' Это обстоятельство снизило время его работы на 2 часа.')
end;
{ Генерация 'несчастливца' у него как-то стерлись некотор. данные }
ne:=random(6)+1;
if ne<6 then
begin
readkey;
writeln;
if ne=fo then write(' Теперь ');
writeln(' ',ff[ne],'y не повезло. Однажды в его доме отключили');
writeln(' электричество, в рез-те чего потерялись некоторые данные.');
writeln(' Это обстоятельство увеличило время его работы на 3 часа.')
end;
{ Определение степени участия человека в проекте: }
{ Каждый вид работы - равная доля единицы }
{ Т.к. всего 5 видов работ, то при равности сложностей работ }
{ на каждую работу выходит по 0.2 доли общей работы }
{ Т.о. получаем следующие нагрузочные коэффициенты(k) участников: }
{ Иванов - 0.067; Петров-0.139; Сидоров-0.267; }
{ Нуклеинов-0.127; Парамонов-0.400 }
{ Среднее время делания проекта его участником v=30 часов }
{ Время зависит от предыдущих генераций: }
{ v=v+(5-pr[i])*1.5 - увеличение времени из-за плох. процессора; }
{ v=v+(st-1)*0.3-1 - спец. увеличение времени для Сидорова; }
{ v=v-fo - уменьшение за счет 'улыбки Фортуны' }
{ v=v+ne - временная прибавка 'несчастливцам' }
for i:=1 to 5 do
begin
v[i]:=30+round((5-pr[i])*1.5);
if i=3 then v[3]:=v[3]+round((st-1)*0.2-2);
if i=fo then v[i]:=v[i]-2;
if i=ne then v[i]:=v[i]+3;
end;
readkey; clrscr;
writeln('Временные затраты участников на делание частей проекта');
for i:=1 to 55 do write('-');writeln;
writeln('| Фамилия | Время работы участника проекта |');
for i:=1 to 55 do write('-');writeln;
for i:=1 to 5 do
begin
writeln('| ',ff[i]);
gotoxy(18,i+4);
writeln('| ',v[i],' |' );
end;
for i:=1 to 55 do write('-');writeln;
{ Трудоемкость участника СМО Q=v*k }
q[1]:=round(0.067*v[1]);
q[2]:=round(0.139*v[2]);
q[3]:=round(0.267*v[3]);
q[4]:=round(0.127*v[4]);
q[5]:=round(0.400*v[5]);
writeln;
writeln(' Таблица трудоемкостей участников ');
for i:=1 to 55 do write('-');writeln;
writeln('| Фамилия | Трудоемкость участника проекта |');
for i:=1 to 55 do write('-');writeln;
for i:=1 to 5 do
begin
writeln('| ',ff[i]);
gotoxy(18,i+15);
writeln('| ',q[i]:2,' |' );
end;
for i:=1 to 55 do write('-');writeln;
end;
readkey;
end.
Модель формирования заданий на коммерческое программирование
ЦЕЛЬ:
ОГРАНИЧЕНИЯ:
АЛЬТЕРНАТИВЫ:
ТИП:
Исходный текст программы ( Реализовано на С++ ):
//----------------------------------------------------------
#include
#include
#include
#include
#include
//----------------------------------------------------------
enum bool { TRUE=1, FALSE=0 };
6>6>88>63>33>95>89>98>91>