Лабораторные работы (2009) (Отчет)

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

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


Сформировать модель принятия решений в виде совокупности таблиц решений и написать модуль-интерпретатор для данной модели.


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


Объекты моделирования – поле размером 10 х 10стойка бармена, на котором имеются препятствия в виде стен, и морковкиза которым ходит действующее лицо Бармен. Действующие лица – заяц и волкбармен и клиент. Объектом охоты для зайца являются морковки, а объект для охоты волка – сам заяц.

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

Волк обходит препятствия аналогично зайцу.

Игра заканчивается, когда либо заяц съест все морковки, либо волк съест зайцакогда пройдет 20 клиентов, в независимости от того, обслужили их всех, или нет.




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


Модель включает в себя 5 таблиц, которые содержитат правила поведениея зайца, волка и правила для начала игры, преодоления препятствий ибармена, клиента и переключенияе таблиц.

Таблица 1. Начало игры и анализ для окончания игрыГотовность для начала игры.


1

2

3

4

5

Е

Есть еще люди

F

F

T

T

T


Все прошли

F

T





Все люди просмотрены



F

T

T


Ходил ли бармен




T

F


Действие!

1



1



+

5

S

2


5

S





Данная таблица предназначена для определения момента начала игрыпоследовательности действий бармена и клиента и анализа хода игры по отношению к завершению (все ли люди прошли). Когда будет нажата кнопка «Старт», то на вопрос «Готов?» будет получен положительный ответ и игра начнется.



Таблица полна.
Таблица не противоречива.


Таблица 2. ЗаяцМестонахождение клиента по отношению к стулу.


1

2

3

E

Идет к стулу

T

F

F


На стуле


T

F


После стула



T


Удалить!




1

К следующему!



2

2

Шаг!



1


+

3

4

1

1


Данная таблица координирует движения зайца в условии, если рядом находится морковка. Заяц может ходить на одну клетку вперед, или назад, или вправо, или влево, предварительно повернувшись в нужную сторону. определяет местонахождение клиента по отношению к стулу.

Таблица полна, так как в ней присутствует правило иначе.

Таблица не противоречива.


Таблица 3. Стул Волк.


1

2

3

E

T

F

F


=n


T

T


Свободно


T

F


Шаг!

1



1

Сесть!


1



Мимо!



1


К следующему!

2


2

2

+

1

1

1

1


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

Таблица полна, так как в ней присутствует правило иначе.

Таблица не противоречива.


Таблица 4. Стена для зайцаГотовность встать со стула.


1

2

Готов

T

F

Встать!

1


К следующему!

2

1

+

1

1


Данная таблица координирует движения зайца в условии, если рядом находится стена координирует действия клиента, получившего стакан.

Таблица полна и не противоречива.



Таблица 5. Стена для волкаБармен.


1

2

3

4

5

6

E

Справа

T

T

F

F



Идет направо

T

F

T

F




Дошел до стула

F

F

F

F

T



Сервис оказан

F



F

F

T


Развернуться!

1



1




Шаг бармена!

2

1

1

2

1


Дать стакан!





1



+

1

1

1

1

1

1

S



Данная таблица аналогична таблице 4, только для волкакоординирует действия Бармена. При столкновении со стеной бармен разворачивается и идет в другую сторону.

Таблица полна и не противоречива.



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

Таблица 1

Таблица 2

Таблица 3

Таблица 4

Таблица 5









Вид программы.
Основное окно программы.

Возможные положения зайцабармена:



Возможные положения волкаклиента:



Стакан:


Предусмотрена возможность выбора времени на ход: от 50 мс до 150 мс.

Программа реализована в среде Microsoft Visual Studio 2008.





Пример работы программы.























Приложение.

//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include "main.h"

#define USERMESSAGE "MyMessage"



//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm3 *Form3;

//---------------------------------------------------------------------------

__fastcall TForm3::TForm3(TComponent* Owner)

: TForm(Owner)

{

Game = new Situation(pb);

}

//---------------------------------------------------------------------------

void __fastcall TForm3::Button1Click(TObject *Sender)

{

Game->turn();

}

//---------------------------------------------------------------------------

void __fastcall TForm3::FormCreate(TObject *Sender)

{

OurMessage = RegisterWindowMessage("MyMessage");

}

//---------------------------------------------------------------------------



void __fastcall TForm3::WndProc(Messages::TMessage &Message)

{

if(Message.Msg == OurMessage)

{

Message.Result = DoPhone(Message.WParamHi, Message.WParamLo, Message.LParam);

}

else

{

TCustomForm::WndProc(Message);

}

}

//---------------------------------------------------------------------------

int TForm3::DoPhone(Word WParamHi, Word WParamLo, int LParam)

{

int Type = WParamHi;

int Table = WParamLo;

int Num = LParam;

m->Lines->Add(AnsiString(Type) + " " + AnsiString(Table) + " " + AnsiString(Num));



switch(Type)

{

case 0:

switch(Table)

{

case 1:

switch(Num)

{

case 1: return Game->isThere();

case 2: return Game->areAll();

case 3: return Game->looked();

case 4: return Game->movedB();

}

case 2:

switch(Num)

{

case 1: return Game->going();

case 2: return Game->onChair();

case 3: return Game->after();

}

case 3:

switch(Num)

{

case 1: return Game->going2();

case 2: return Game->n();

case 3: return Game->free();

}

case 4:

switch(Num)

{

case 1: return Game->sited();

}

case 5:

switch(Num)

{

case 1: return Game->toR();

case 2: return Game->goR();

case 3: return Game->nB();

case 4: return Game->serv();

}

}

case 1:

switch(Table)

{

case 1:

switch(Num)

{

case 1: return Game->turn();

}

case 2:

switch(Num)

{

case 1: return Game->del();

case 2: return Game->next();

case 3: return Game->move();

}

case 3:

switch(Num)

{

case 1: return Game->move();

case 2: return Game->sit();

case 3: return Game->move();

case 4: return Game->next();

}

case 4:

switch(Num)

{

case 1: return Game->stand();

case 2: return Game->next();

}

case 5:

switch(Num)

{

case 1: return Game->dirc();

case 2: return Game->moveB();

case 3: return Game->give();

}

}

}

return 0;

}

//---------------------------------------------------------------------------Модуль-интерпретатор:



using System;

using System.Windows.Forms;

using System.Threading;

using System.Runtime.InteropServices;



namespace RabbitWolf

{

public class MyHookClass : NativeWindow

{

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

static extern uint RegisterWindowMessage(string lpString);

uint simpr;

Form1 f;



public MyHookClass(Form1 af)

{

simpr = RegisterWindowMessage("RabbitWolfMessage");

this.AssignHandle(af.Handle);

f = af;

}



protected override void WndProc(ref Message m)

{

int wparamhi,wparamlo,wparam;

int lParam = Convert.ToInt32("" + m.LParam);



if (m.Msg == simpr)

{

wparam = Convert.ToInt32("" + m.WParam);

wparamhi = wparam / 65536;

wparamlo = wparam - wparamhi * 65536;



#region Условия

if (wparamhi == 0)

{

if (wparamlo == 1) // Таблица 1

{

switch (lParam) // Условия

{

case (1): m.Result = f.IsReady(); break;

}

}

else if (wparamlo == 2) // Таблица 2

{

switch (lParam) // Условия

{

case (1): m.Result = f.IsCarrotElse(); break;

case (2): m.Result = f.IsCarrotInFront(); break;

case (3): m.Result = f.IsCarrotRight(); break;

case (4): m.Result = f.IsCarrotLeft(); break;

case (5): m.Result = f.IsRabbitEaten(); break;

}

}

else if (wparamlo == 3) // Таблица 3

{

switch (lParam)

{

case (1): m.Result = f.IsRabbitRight(); break;

case (2): m.Result = f.IsRabbitLeft(); break;

case (3): m.Result = f.IsRabbitInFront(); break;

case (4): m.Result = f.IsRabbitBack(); break;

case (5): m.Result = f.IsRabbitWolfTogether(); break;

}

}



else if (wparamlo == 4) // Таблица 4

{

switch (lParam)

{

case (1): m.Result = f.IsWallInFrontRabbit(); break;

case (2): m.Result = f.IsWallRightRabbit(); break;

case (3): m.Result = f.IsWallLeftRabbit(); break;

}

}



else if (wparamlo == 5) // Таблица 5

{

switch (lParam)

{

case (1): m.Result = f.IsWallInFrontWolf(); break;

case (2): m.Result = f.IsWallRightWolf(); break;

case (3): m.Result = f.IsWallLeftWolf(); break;

}

}



}

#endregion



#region Действия

else if (wparamhi == 1)

{

if (wparamlo == 1) // Таблица 1

{

switch (lParam)

{

case (1): f.Sleep(); break;

}

}



else if (wparamlo == 2) // Таблица 2

{

switch (lParam)

{

case (1): f.TurnRightRabbit(); break;

case (2): f.TurnLeftRabbit(); break;

case (3): f.StepRabbit(); break;

case (4): f.TurnRightNotTurnRabbit(); break;

case (5): f.TurnLeftNotTurnRabbit(); break;

case (6): f.TurnLeftRightRabbit(); break;

case (7): f.TurnLeftRightNotTurnRabbit(); break;

}

}

else if (wparamlo == 3) // Таблица 3

{

switch (lParam)

{

case (1): f.TurnRightWolf(); break;

case (2): f.TurnLeftWolf(); break;

case (3): f.TurnBackWolf(); ; break;

case (4): f.StepWolf(); break;

}

}



else if (wparamlo == 4) // Таблица 4

{

switch (lParam)

{

case (1): f.TurnRightRabbit(); break;

case (2): f.TurnLeftRightRabbit(); break;

case (3): f.TurnLeftRabbit(); break;

case (4): f.StepRabbit(); break;

case (5): f.TurnBackRabbit(); break;

case (6): f.TurnLeftRightNotTurnRabbit(); break;

case (7): f.TurnLeftNotTurnRabbit(); break;

case (8): f.TurnRightNotTurnRabbit(); break;

}

}



else if (wparamlo == 5) // Таблица 5

{

switch (lParam)

{

case (1): f.TurnRightWolf(); break;

case (2): f.TurnLeftRightWolf(); break;

case (3): f.TurnLeftWolf(); break;

case (4): f.StepWolf(); break;

case (5): f.TurnBackWolf(); break;

case (6): f.TurnLeftRightNotTurnWolf(); break;

case (7): f.TurnLeftNotTurnWolf(); break;

case (8): f.TurnRightNotTurnWolf(); break;

}

}

System.Threading.Thread.Sleep(f.ind);

// Ответом на запрос действия со стороны СИМПР должна быть единица

m.Result = new IntPtr(1);



}

#endregion



Application.DoEvents();

}

else

{

base.WndProc(ref m);

}

}

}

}




19






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

Файл
93669.rtf
175977.rtf
ref-18860.doc
ref-14891.doc
17431.rtf




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