Лабораторные работы (2011) (TI_lab_1)

Посмотреть архив целиком

Московский энергетический институт

(Технический университет)















Лабораторная работа №1

«Проектирование с помощью инструментального комплекса СИМПР»

По курсу

Теория игр и исследование операций













Студент

Макашова М.Б.

Группа

А-13-07

Преподаватель

Еремеев А.П.











2011 г.



Содержание



Содержание…………………………………………………………………………………………………...2


Постановка задачи …………………………………………………………………………………..…….…3


Описание предметной области………………………………………………………………..…………….3


Описание интерфейса………………………………………………………………………………………..3


Описание табличной модели ………………………………………………….…………………………….5


Приложение……………………………………………………………………………………..……………7


Результаты трансляции………………………………………………………………………..……………13


































Постановка задачи.

Сформировать модель принятия решений с помощью интеллектуального комплекса СИМПР в виде совокупности таблиц решений и написать модуль - интерпретатор для данной модели. В таблицах должны быть записаны варианты поведения объекта в выбранной предметной области, и путем обмена этой информацией с программной моделью, на экран должны отображаться действия, описанные в СИМПРе, соответствующие заданным

Описание предметной области

Имеется 10 абонентов, у каждого из которых происходит определённое событие: ДТП, пожар или взрыв. В результате происшествия могут быть раненые. В зависимости от типа события и наличия/отсутствия раненых, каждому абоненту ставится в соответствие некоторый список телефонных номеров (из множества 01, 02, 03), которые ему желательно набирать в порядке приоритета.

Абоненты пытаются позвонить по телефонам экстренных служб в порядке их следования в списках абонентов. Однако если наиболее приоритетные линии заняты, абонент может попытаться дозвониться на прочие номера из списка (не более 3 номеров в списке каждого абонента).

Если абоненту удалось дозвониться, то он занимает соответствующую линию и не может звонить на другие номера, пока не освободит линию.

По окончании звонка, абоненту высылается машина соответствующего профиля. Машина экстренной службы, по завершении задания, возвращается в бокс.

Процесс завершается, когда все абоненты обслужены и все машины вернулись в боксы.



Описание интерфейса

Абонент обозначается телефонной трубкой определённого цвета.Каждому абоненту случайным образом генерируется случайное событие, состоящее из некоторой опасной ситуации (взрыв, ДТП, пожар) (отображается на картинке справа от трубки) и показателя наличия/отсутствия раненых.

В соответствии с Таблицей 1, по случайному событию определяется список телефонных номеров, по которым абоненту необходимо позвонить(список снизу от изображения события).

Если абонент занял линию, то напротив службы в его списке, который он звонит в данный момент, ставится зелёная галка.

Если к абоненту приехала служебная машина, то, аналогично, напротив соответствующей службы в списке абонента ставится красная галка.

Когда абонент занимает линию, у службы, на номер которой он звонит, в левом верхнем углу появляется изображение телефона с цветом этого абонента. В это время линия занимается и пока не освободится, никто из абонентов до неё не дозвонится. Кроме того, абонент не может звонить сразу в несколько служб.



В начальном состоянии у каждой службы имеется по 2 свободные машины.





После выезда из бокса машины перемещаются по дороге. Машина должна доехать до абонента, обслужить его и снова вернуться в бокс. Если эта машина больше не нужна, она остаётся в боксе.

При подъезде к необходимому абоненту, машина, аналогично галкам, становится на некоторое время (при вычислении времени также присутствует случайная компонента) в списке абонентов напротив службы, которую представляет (“обслуживает абонента”)



В конечном состоянии все абоненты дозвонились до нужных служб и все машины обслужили всех абонентов.



Символы на форме и их назначение:

  • Каждому абоненту соответствует определённы цвет телефонной трубки



  • Для всякого абонента генерируется одно из трёх случайных событий

При занятии абонентом какой-либо линии экстренной службы, на боксе этой службы появляется изображение телефона цвета соответствующего абонента

Если абоненту удалось занять линию, в его списке номеров на соответствующей позиции ставится зелёная галочка

Как только автомобиль подъехал к абоненту, в списке абонента напротив соответствующей службы ставится красная галочка

Описание табличной модели

Данная модель включает в себя 3 таблицы:

Правил: 30

Условий: 28

Действий: 21




С помощью Таблицы 1 заполняется список телефонных номеров абонента, по которым ему необходимо позвонить. Этот список формируется в зависимости от ситуации и наличию/отсутствию раненых.



С помощью Таблицы 1 заполняется список телефонных номеров абонента, по которым ему необходимо позвонить. Этот список формируется в зависимости от ситуации и наличию/отсутствию раненых.


Таблица 2 отвечает за звонки абонентов в те или иные службы, за занятость линий служб.


Таблица 3 контролирует выезд машин к абонентам, которым это необходимо, их обслуживание, перемещении машин по дороге, возврат машин в боксы.

Таблицы 2 и 3 сообщаются.










Таблица 2 отвечает за звонки абонентов в те или иные службы, за занятость линий служб.




Приложение: выдержки из кода (Delphi)

procedure TForm2.WndProc(var Message: TMessage);

var res: boolean;

begin

if message.Msg=msgSIMPR then

begin

//ПОЛУЧИЛИ СООБЩЕНИЕ!!!!!!!!!!

Res:=false;

if message.WParamHi=0 then

begin

//УСЛОВИЕ!!!!!!!!!!

case message.WParamLo of

//таблица1

// Экстренные события

1 : begin

case message.LParam of

1: begin // условие 1

// активен ли таймер?

if (TimerNext.Enabled=true) then Res:=true;

if Res then Memo1.Lines.Add('условие 1: активен ли таймер? Да')

else Memo1.Lines.Add('условие 1: активен ли таймер? Нет');

end;


2: begin // условие 2

//ДТП

if (_codevent =1) then Res:=true;

if Res then Memo1.Lines.Add('условие 2: ДТП? Да')

else Memo1.Lines.Add('условие 2: ДТП? Нет');

end;

3: begin // условие 3

// взрыв

if (_codevent=2) then Res:=true;

if Res then Memo1.Lines.Add('условие 3: Взрыв? Да')

else Memo1.Lines.Add('условие 3: Взрыв? Нет');

end;

4: begin // условие 4

// пожар

if (_codevent=3) then Res:=true;

if Res then Memo1.Lines.Add('условие 4: Пожар? Да')

else Memo1.Lines.Add('условие 4: Пожар? Нет');

end;

5: begin // условие 5

// есть ли раненые

if (_codwounded=1) then Res:=true;

if Res then Memo1.Lines.Add('условие 5: Есть ли раненые? Да')

else Memo1.Lines.Add('условие 5: Есть ли раненые? Нет');

end;

6: begin // условие 1

// менее 10 абонентов?

if (N1 <=10) then Res:=true;

if Res then Memo1.Lines.Add('условие 6: Менее 10 абонентов? Да')

else Memo1.Lines.Add('условие 6: Менее 10 абонентов? Нет');

end;

end; {case}

end; {1}




//таблица2

2 : begin

// Вызовы

case message.LParam of

1: begin // условие 1

//Активен ли таймер ожидания?

if (TimerWait.Enabled=true) then Res:=true;

if Res then Memo1.Lines.Add('условие 1: Активен ли таймер ожидания? Да')

else Memo1.Lines.Add('условие 1: Активен ли таймер ожидания? Нет');

end;

2: begin // условие 2

// свободен ли 1-ая линия из списка абонента?

if IsFree(N2,1) then Res:=true;

if Res then Memo1.Lines.Add('условие 2: свободен ли 1-ая линия из списка абонента? Да')

else Memo1.Lines.Add('условие 2: свободен ли 1-ая линия из списка абонента? Нет');

end;

3: begin // условие 3

// свободен ли 2-ая линия из списка абонента?

if IsFree(N2,2) then Res:=true;

if Res then Memo1.Lines.Add('условие 3: свободен ли 2-ая линия из списка абонента? Да')

else Memo1.Lines.Add('условие 3: свободен ли 2-ая линия из списка абонента? Нет');

end;

4: begin // условие 4

// свободен ли 3-ая линия из списка абонента?

if IsFree(N2,3) then Res:=true;

if Res then Memo1.Lines.Add('условие 4: свободен ли 3-ая линия из списка абонента? Да')

else Memo1.Lines.Add('условие 4: свободен ли 3-ая линия из списка абонента? Нет');

end;

5: begin // условие 5

// всем ли позвонил текущий абонент?

if (all_called(N2)) then Res:=true;

if Res then Memo1.Lines.Add('условие 5: всем ли позвонил текущий абонент? Да')

else Memo1.Lines.Add('условие 5: всем ли позвонил текущий абонент? Нет');

end;

6: begin // условие 6

// все ли всем позвонили?

if (all_over_therang) then Res:=true;

if Res then Memo1.Lines.Add('условие 6: все ли всем позвонили? Да')

else Memo1.Lines.Add('условие 6: все ли всем позвонили? Нет');

end;

7: begin // условие 7

// звонит ли кому-то абонент сейчас?

if (masabonent[N2].busy=True) then Res:=true;

if Res then Memo1.Lines.Add('условие 7: звонит ли кому-то абонент сейчас? Да')

else Memo1.Lines.Add('условие 7: звонит ли кому-то абонент сейчас? Нет');

end;

8: begin // условие 8

//звонящих абонентов менее 10?

if (N2 <=10) then Res:=true;

if Res then Memo1.Lines.Add('условие 8: звонящих абонентов менее 10? Да')

else Memo1.Lines.Add('условие 8: звонящих абонентов менее 10? Нет');

end;

9: begin // условие 9

// есть ли ещё кандидаты на машину?

if ListNotEmpty() then Res:=true;

if Res then Memo1.Lines.Add('условие 9: есть ли ещё кандидаты на машину? Да')

else Memo1.Lines.Add('условие 9: есть ли ещё кандидаты на машину? Нет');

end;

end; {case}

end; {2}




//таблица 3

3 : begin

// Выезд машины

case message.LParam of

1: begin // условие 1

//Активен ли таймер ожидания?

if (WaitStep.Enabled=true) then Res:=true;

if Res then Memo1.Lines.Add('условие 1: Активен ли таймер ожидания? Да')

else Memo1.Lines.Add('условие 1: Активен ли таймер ожидания? Нет');

end;

2: begin // условие 2

// свободна ли текущая машина?

if IsFreeCar(NumCar) then Res:=true;

if Res then Memo1.Lines.Add('условие 2 : Cвободна ли текущая машина? Да')

else Memo1.Lines.Add('условие 2 : Cвободна ли текущая машина? Нет');

end;

3: begin // условие 3

// Нужна ли текущая машина?

if IsNeedCar(NumCar) then Res:=true;

if Res then Memo1.Lines.Add('условие 3 : Нужна ли текущая машина? Да')

else Memo1.Lines.Add('условие 3 : Нужна ли текущая машина? Нет');

end;

4: begin // условие 4

// доехала ли до т.1 ?

if IsNeedPoint(0,420,NumCar,1) then Res:=true;

if Res then Memo1.Lines.Add('условие 4 : доехала ли до т.1 ? Да')

else Memo1.Lines.Add('условие 4 : доехала ли до т.1 ? Нет');

end;

5: begin // условие 5

// доехала ли до т.2 ?

if IsNeedPoint(0,150,NumCar,2) then Res:=true;

if Res then Memo1.Lines.Add('условие 5 : доехала ли до т.2 ? Да')

else Memo1.Lines.Add('условие 5 : доехала ли до т.2 ? Нет');

end;

6: begin // условие 6

// доехала ли до т.3 ?

if IsNeedPoint(800,150,NumCar,3) then Res:=true;

if Res then Memo1.Lines.Add('условие 6 : доехала ли до т.3 ? Да')

else Memo1.Lines.Add('условие 6 : доехала ли до т.3 ? Нет');

end;

7: begin // условие 7

// доехала ли до т.4 ?

if IsNeedPoint(800,420,NumCar,4) then Res:=true;

if Res then Memo1.Lines.Add('условие 7 : доехала ли до т.4 ? Да')

else Memo1.Lines.Add('условие 7: доехала ли до т.4 ? Нет');

end;

8: begin // условие 8

//доехала ли до т.5 (бокс) ?

if IsNeedPoint(170+160*Trunc((NumCar-1)/2),420,NumCar,5) then Res:=true;

if Res then Memo1.Lines.Add('условие 8 : доехала ли до т.5 (бокс) ? Да')

else Memo1.Lines.Add('условие 8 : доехала ли до т.5 (бокс) ? Нет');

end;

9: begin // условие 9

// подходящий ли адресат?

if IsNeedAb(NumCar) then Res:=true;

Memo1.Lines.Add(IntToStr(NumCar));

if Res then Memo1.Lines.Add('условие 9 : подходящий ли адресат? Да')

else Memo1.Lines.Add('условие 9 : подходящий ли адресат? Нет');

end;

10: begin // условие 10

// обслуживает ли машина абонента в данный момент?

if (WaitServTimers[NumCar].Enabled=true) then Res:=true;

if Res then Memo1.Lines.Add('условие 10 : обслуживает ли машина абонента в данный момент? Да’)

else Memo1.Lines.Add('условие10 : обслуживает ли машина абонента в данный момент? Нет ')

end;

11: begin // условие 11

// обслужила ли машина адресата?

if IsServe(NumCar) then Res:=true;

if Res then Memo1.Lines.Add('условие 11 : обслужила ли машина адресата? Да')

else Memo1.Lines.Add('условие 11 : обслужила ли машина адресата? Нет');

end;

12: begin // условие 12

//все адресаты обслужены

// все ли машины освободились

if ((not ListNotEmpty()) and IsAllFree()) then Res:=true;

if Res then Memo1.Lines.Add('условие 12 : все адресаты обслужены? Да')

else Memo1.Lines.Add('условие 12 : евсе адресаты обслужены? Нет');

end;

13: begin // условие 13

// все ли всем позвонили?

if (all_over_therang) then Res:=true;

if Res then Memo1.Lines.Add('условие 13: все ли всем позвонили? Да')

else Memo1.Lines.Add('условие 13: все ли всем позвонили? Нет');

end;

end; {case}

end; {3}

end; {case}

end;


if message.WParamHi=1 then

begin

//Действие!!!!!!!!!!

case message.WParamLo of

//таблица 1

1 : begin

case message.LParam of

1: begin // 01

add_phone(N1,1);

Memo1.Lines.Add('действие 1: Позвонить 01 Да');

end;

2: begin // 02

add_phone(N1,2);

Memo1.Lines.Add('действие 2: Позвонить 02 Да');

end;

3: begin // 03

add_phone(N1,3);

Memo1.Lines.Add('действие 3: Позвонить 03 Да');

end;

4: begin

// сопоставить картинку ситуауии

create_list(_codevent,_codwounded);

Memo1.Lines.Add('действие 4: Сопоставить картинку ситуации Да');

end;

5: begin

// показать список необходимых номеров

TimerNext.Interval:=100*1;

TimerNext.Enabled:=true;

Memo1.Lines.Add('действие 5: Показать список необходимых номеров Да');

end;

6: begin

// ждать

Memo1.Lines.Add('действие 6: ждать Да');

end;

end; {case}

end; {1}




//таблица 2

2 : begin

case message.LParam of

1: begin // позвонит по 1-му номеру из списка абонента

call_to_service_(N2,1);

Memo1.Lines.Add('действие 1: позвонит по 1-му номеру из списка абонента Да');

end;

2: begin // позвонит по 2-му номеру из списка абонента

call_to_service_(N2,2);

Memo1.Lines.Add('действие 2: позвонит по 2-му номеру из списка абонента Да');

end;

3: begin // позвонит по 3-му номеру из списка абонента

call_to_service_(N2,3);

Memo1.Lines.Add('действие 3: позвонит по 3-му номеру из списка абонента Да');

end;

4: begin

// переход к следующему абоненту

TimerWait.Interval:=10;

TimerWait.Enabled:=true;

Memo1.Lines.Add('действие 4: переход к следующему абоненту Да');

end;

5: begin

// обход заново

N2:=1;

Memo1.Lines.Add('действие 5: обход заново Да');

end;

6: begin

// ждать

Memo1.Lines.Add('действие 6: ждать Да');

end;

end; {case}

end; {2}


//таблица 3

// выезд машины

3 : begin

case message.LParam of

1: begin // забронировать текущую машину

SendCar(NumCar);

Memo1.Lines.Add('действие 1: забронировать текущую машину Да');

end;

2: begin // шаг влево

ToLeft(NumCar);

Memo1.Lines.Add('действие 2: шаг влево Да');

end;

3: begin // шаг вправо

ToRight(NumCar);

Memo1.Lines.Add('действие 3: шаг вправо Да');

end;

4: begin

// шаг вверх

ToUp(NumCar);

Memo1.Lines.Add('действие 4: шаг вверх Да');

end;

5: begin

// шаг вниз

ToDown(NumCar);

Memo1.Lines.Add('действие 5 : шаг вниз Да');

end;

6: begin

// перейти к следующей машине

WaitStep.Interval:=1;

NextCar();

Memo1.Lines.Add('действие 6 : перейти к следующей машине Да');

end;

7: begin // ждать

Memo1.Lines.Add('действие 7: ждать Да');

end;

8: begin // обслужить адресата

serve_client(NumCar);

Memo1.Lines.Add('действие 8: обслужить адресата Да');

end;

9: begin // освободить машину

ClearCar(NumCar);

Memo1.Lines.Add('действие 9 : освободить машину Да');

end;

end; {case}

end; {3}

end;{case}

//Refresh;

Res:=true;

end;

//Выдали результат!!!!!!!!!

if res then message.Result:=Yes

else message.Result:=No;

end

else inherited WndProc(Message); // на другие сообщения

end;

Результаты трансляции.





Таблица 1


Таблица 2


Таблица3







Случайные файлы

Файл
CBRR1276.DOC
179373.rtf
burdenko.doc
180259.rtf
8133-1.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.