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

Вид материалаМетодические указания
Подобный материал:
1   2   3   4   5   6   7   8   9   10

}

}

}

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 };