Лабораторные работы (2010) (ЛР1_Тихомирова)

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

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

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













Отчет по лабораторной работе №1



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








Студент: Тихомирова Ирина

Группа: А-13-06

Преподаватель: Гречкина П.В.












2010г.



Содержание

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

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

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

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

Таблица 1: пешеходы 5

Таблица 2: автобусы 6

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

Оптимизированная трансляция 6

Последовательная трансляция 7

Приложение 8







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

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


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

Предметной областью данной модели является ситуация на автобусной остановке. К остановке (здание привмерно посередине картинки) с определенной скоростью подходят пешеходы и автобусы.


Считается, что некоторые пешеходы уже купили где-то билет на автобус, так как ни на остановке, ни у водителя они этого сделать не могут. Те пешеходы, у которых в наличии имеется билет, останавливаются на остановке и ждут автобуса, остальные – идут мимо. Если пешеход с билетом видит, что к остановке подъезжает автобус, а сам он ещё не дошёл до остановки, он начинает бежать к автобусу. Также, если пешеход с билетом подошёл к остановке, но увидел, что остановка переполнена (лимит людей превышен), ему придется пройти мимо, отказавшись от мысли прокатиться на автобусе.


Автобусы останавливаются на остановке на 6 секунд и в течение этого времени загружают пешеходов, уже стоявших на остановке или только что подошедших. Если на остановке уже стоит другой автобус, автобус новоподъехавший проезжает мимо.


Конечное состояние достигается по нажатию соответствующей кнопки.


В программе предусмотрена кнопка «пуск», по которой начинается отсчет игрового времени. В связи с этим пользователь может сделать некоторые предустановки, связанные с появлением объектов: и автобусы, и пассажиры могут появляться на экране либо через случайные промежутки времени (максимально возможный промежуток задается пользователем), либо строго через определенное время, либо по нажатию кнопки, а также пользователь может изменить наличие билета у следующего пешехода.



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

На приведенном ниже скриншоте показано окно программы.

Окно программы разделено на 4 сегмента.

В верхних левом и правом сегментах находятся элементы преднастройки появления пешеходов и автобусов, а также кнопки «пуск» и «стоп».

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

В нижнем левом сегменте располагается сегмент непосредственного действия объектов.






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

Модель включает в себя 2 таблицы. Всего:

Условий 21

Действий 10

Правил 25


Существуют таблицы действий каждого из объектов модели: таблица состояний автобусов и таблица состояний пешеходов.


Логических отношений задано не было, потому что таблицы корректно отображают модель и без них.

Рассмотрим таблицы, описывающие модель поведения выбранной предметной области:


Таблица 1: пешеходы

Отвечает за то, как ведут себя пешеходы.



Таблица 2: автобусы

Отвечает за то, как ведут себя автобусы.


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

Оптимизированная трансляция

Таблица 1


Таблица 2


Последовательная трансляция

Таблица 1


Таблица 2



Приложение

Программа реализована на языке Delphi


// Процедура обработки таблиц

procedure TMainForm.WndProc(var Message: TMessage);

var

res : boolean;

begin

if Message.Msg = msg then // приняли сообщение «Autobus»

begin

res := true;

case Message.WParamHi of

0 : //условия

case Message.WParamLo of // выбираем таблицу

1 : res := ConditionOnT1(Message.LParam); //таблица1

2 : res := ConditionOnT2(Message.LParam); //таблица2

end;

1 : //действия

case Message.WParamLo of // выбираем таблицу

1 : ActionOnT1(Message.LParam); //таблица1

2 : ActionOnT2(Message.LParam); //таблица2

end;

end;

if res then

Message.Result := msgYes

else

Message.Result := msgNo;

end

else

inherited; // обработка других сообщений Windows

end;


function TMainForm.ConditionOnT1(Index: integer): boolean;

// Обработка условий первой таблицы

begin

case Index of

1 : Result := People.IsPeople; //есть пешеходы?

2 : Result := People.GoingToStation; //идет к остановке?

3 : Result := People.NextToStation; //подошел к остановке?

4 : Result := People.WaitingOnStation; //стоит на остановке?

5 : Result := People.GoingFromStation; //идет от остановки?

6 : Result := People.Gone; //ушел?

7 : Result := Buses.IsBusOnStation; //автобус на остановке?

8 : Result := People.HasTicket; //есть билет?

9 : Result := People.StationLimitExceed; //лимит пешеходов не превышен?

10 : Result := Stopped; //останов?

11 : Result := People.PeopleOver; //пешеходы закончились?

else

Result := false;

end;

if Index <> 0 then

Memo1.Lines.Add('УСЛОВИЕ "' + ssc_t1 + '": "' + ssc_t1c[Index] + ' = ' + BoolToStr(Result, true));

end;


function TMainForm.ConditionOnT2(Index: integer): boolean;

// обработка условий второй таблицы

begin

case Index of

1 : Result := Buses.IsBus; //есть автобус?

2 : Result := Buses.GoingToStation; //идет к остановке?

3 : Result := Buses.NextToStation; //подошел к остановке?

4 : Result := Buses.WaitingOnStation; //стоит на остановке?

5 : Result := Buses.GoingFromStation; //идет от остановки?

6 : Result := Buses.Gone; //ушел?

7 : Result := Buses.IsAnotherBusOnStation; //есть на остановке другой автобус?

8 : Result := Buses.StationTimeOver; //время остановки закончилось?

9 : Result := Stopped; // останов?

10 : Result := Buses.BusOver; // автобусы закончились?

else

Result := false;

end;

if Index <> 0 then

Memo1.Lines.Add('УСЛОВИЕ "' + ssc_t2 + '": "' + ssc_t2c[Index] + ' = ' + BoolToStr(Result, true));

end;


procedure TMainForm.ActionOnT1(Index: integer);

// обработка действий первой таблицы

begin

case Index of

1 : People.Wait; //ждать

2 : People.Move; //идти

3 : People.Run; //бежать

4 : People.MoveInBus; //сесть в автобус

5 : People.Delete; //удалиться

6 : People.Next; //следующий

end;

end;


procedure TMainForm.ActionOnT2(Index: integer);

// обработка действий второй таблицы

begin

case Index of

1 : Buses.Move; //идти

2 : Buses.Station; //встать на остановку

3 : Buses.Delete; //удалиться

4 : Buses.Next; //следующий

end;

end;


function TPeopleClass.IsPeople: boolean;

begin

Result := FList.Count > 0;

end;


function TPeopleClass.GoingToStation: boolean;

begin

if FList.Items[FCurrent].OnStation then

Result := false

else

if FList.Items[FCurrent].Position in [StartPos..StationPos-1] then

Result := true

else

Result := false;

end;


function TPeopleClass.NextToStation: boolean;

begin

Result := (not FList.Items[FCurrent].OnStation) and (FList.Items[FCurrent].Position = StationPos);

end;


function TPeopleClass.WaitingOnStation: boolean;

begin

Result := FList.Items[FCurrent].OnStation;

end;


function TPeopleClass.GoingFromStation: boolean;

begin

Result := (not FList.Items[FCurrent].OnStation) and (FList.Items[FCurrent].Position in [StationPos+1..FinishPos]);

end;


function TPeopleClass.Gone: boolean;

begin

Result := FList.Items[FCurrent].Position > FinishPos;

end;


function TBusClass.IsBusOnStation: boolean;

var

i : integer;

begin

Result := false;

i := 0;

while (not Result) and (i < FList.Count) do

if FList.Items[i].OnStation then

Result := true

else

inc(i);

end;


function TPeopleClass.HasTicket: boolean;

begin

Result := FList.Items[FCurrent].HasTicket;

end;


function TPeopleClass.StationLimitExceed: boolean;

var

i : integer;

c : integer;

begin

c := 0;

for i := 0 to FList.Count - 1 do

if FList.Items[i].OnStation then

inc(c);

Result := (c < StationPeopleLimit);

end;


function TPeopleClass.PeopleOver: boolean;

begin

Result := (FCurrent = -1);

end;


procedure TPeopleClass.Wait;

begin

PPeopleRecord(FList.FList.Items[FCurrent]).OnStation := true;

end;


procedure TPeopleClass.Move;

begin

if FList.Items[FCurrent].OnStation then

PPeopleRecord(FList.FList.Items[FCurrent]).OnStation := false;


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

Файл
154152.rtf
~1.DOC
95263.rtf
132437.rtf
49369.rtf




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