Отчёт (Лабораторные работы (2009))
Описание файла
Файл "Отчёт" внутри архива находится в следующих папках: Лабораторные работы (2009), RDO-Matchs. Документ из архива "Лабораторные работы (2009)", который расположен в категории "". Всё это находится в предмете "теория игр и исследование операций" из 8 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "теория игр и исследование операций" в общих файлах.
Онлайн просмотр документа "Отчёт"
Текст из документа "Отчёт"
Московский Энергетический Институт
(Технический университет)
Лабораторная работа № 3.
Выполнил: ст. гр. А-13-05 Петров С. А.
Проверила: ст.преп. Гречкина П.В.
18.04.2009.
Оглавление
Постановка задачи. - 3 -
Описание предметной области. - 3 -
Описание имитационной модели. - 4 -
Типы ресурсов. - 4 -
Ресурсы. - 4 -
Операции. - 4 -
Интерфейс. - 5 -
Файл выполнения. - 7 -
Статистика. - 7 -
Приложение. - 8 -
Постановка задачи.
Реализовать с помощью комплекса РДО логическую игру ‘Спички’. Правила игры достаточно просты. На столе лежит N* спичек. Два игрока (один из которых компьютер) поочерёдно вытаскивают одну, две или три спички. Проигрывает тот, кто забирает последнюю спичку. В данной реализации игры, первым всегда ходит человек.
*игру можно запускать с 59>N>0, задав константу “Спичек_на_столе”
Описание предметной области.
Данная игра является логической, и имеет правильную стратегию игры при которой победитель зависит от начального количества спичек на столе. Рассмотрим возможные варианты на примерах.
Пример 1.
Пуст на столе 5 спичек, и ход игрока А.
Если игрок А возьмёт 1 спичку, то В возьмёт 3 и последняя спичка останется игроку А.
Если игрок А возьмёт 2 спички, то В возьмёт 2 и последняя спичка останется игроку А.
Если игрок А возьмёт 3 спичку, то В возьмёт 1 и последняя спичка останется игроку А.
Таким образом, видно, что тот игрок чей ход при оставшихся 5 спичках на столе проигрывает.
Пример 2.
Пуст на столе 9 спичек, и ход игрока А.
Если игрок А возьмёт 1 спичку, то В возьмёт 3 и игрок А окажется в ситуации 1 ( пример 1), которая как мы знаем проигрышная для него.
Аналогично получается, если А возьмёт 2 или 3 спички. В этих случаях В тоже оставит игрока А в проигрышной ситуации 1.
Обобщив результаты примеров, видно, что проигрышными ситуациями для ходящего являются:
1,5,9,13,17….. Таким образом, верной стратегией является всегда оставлять противника в проигрышной для него ситуации.
Описание имитационной модели.
Типы ресурсов.
В модели используются типы ресурсов КлассВремя и КлассИгра. Класс время содержит единственной поле Тик, и служит лишь для реализации нерегулярного события так как без него воспроизведение анимации невозможно.
$Resource_type КлассВремя : permanent
$Parameters
Тик : integer =0
$End
Класс игра содержит поля:
-
ОсталосьСпичек – сколько на столе осталось спичек. Как упоминалось ранее спичек может быть от 0 до 60.
-
КомпьютерУбралСпичек – сколько за свой последний ход компьютер убрал спичек. От 0 до 3.
-
ЧеловекУбралСпичек- аналогично, применительно к человеку.
-
Состояние – состояние игры 0 – НеНечата, 1-Начата, 2 – завершена, 3 – Состояние выхода из игры.
-
Победитель – 0-победителя нет,1-победил человек,-1- победил компьютер.
$Resource_type КлассИгра : permanent
$Parameters
ОсталосьСпичек : integer [0..60] = 0
КомпьютерУбралСпичек : integer [0..3] = 0
ЧеловекУбралСпичек : integer [0..3] = 0
Состояние : integer [0..3] = 0
Победитель : integer [-1..1] = 0
$End
Ресурсы.
В модели используются два ресурса: Время и Игра. Это объекты описанных выше классов.
$Resources
Время : КлассВремя *
Игра : КлассИгра * * * * *
$End
Операции.
В программе предусмотрены следующие операции:
$Operations
РегулярнаяОперация : ОбразецРегулярнойОперации
УбратьОднуСпичку : ОбразецУбратьСпички '1' 1
УбратьДвеСпички : ОбразецУбратьСпички '2' 2
УбратьТриСпички : ОбразецУбратьСпички '3' 3
НачатьИгру : ОбразецНачатьИгру 'SPACE'
ЗакончитьИгру : ОбразецКонец 'ESCAPE'
$End
РегулярнаяОперация – увеличивает Тик на 1. Остальные операции в названии содержат суть своего действия. Действия убрать спички относятся к человеку.
Интерфейс.
Используется 1 кадр анимации.
Интерфейс при первом запуске игры:
Для начала игры можно нажать пробел, либо щёлкнуть мышью по полю начать.
Интерфейс игры ‘в процессе’:
Для хода, необходимо нажать клавиши 1,2 или 3. А также можно щёлкнуть мышью по соответствующим полям.
Ситуация проигрыша:
Ситуация выигрыша:
В любой момент программы можно выйти, нажав ESC.
Файл выполнения.
Model_name = Matchs
Resource_file = Matchs
OprIev_file = Matchs
Statistic_file = Matchs
Results_file = Matchs
Trace_file = Matchs
Frame_file = Matchs
Frame_number = 1
Show_mode = Animation
Show_rate = 0.0001
Terminate_if Игра.Состояние = 3
Статистика.
В данной модели статистика не собиралась. Можно с уверенностью сказать что, компьютер поставив противника в проигрышную ситуацию как говорится ‘своего не упустит’ и выиграет партию.
Приложение.
Файл PAT
{Операция, для возможности осуществления анимации}
$Pattern ОбразецРегулярнойОперации : irregular_event
$Relevant_resources
_Время : Время Keep
$Time = 0
$Body
_Время
Convert_event
Тик set _Время.Тик + 1
$End
{Операция устанавливает Состояние = 3, таким образом заканчивая игру}
$Pattern ОбразецКонец : keyboard
$Relevant_resources
_Игра : Игра Keep Keep
$Time = 0.0
$Body
_Игра
Convert_begin
Состояние set 3
$End
{Человек, убирает заданное количество спичек, после чего ходит компьютер}
$Pattern ОбразецУбратьСпички : keyboard
$Parameters
Количество : integer
$Relevant_resources
_Игра : Игра Keep Keep
$Time = 0.0
$Body
_Игра
Choice NoCheck
Convert_begin
ЧеловекУбралСпичек set ХодЧеловека(_Игра.ОсталосьСпичек,Количество)
КомпьютерУбралСпичек set ХодКомпьютера(_Игра.ОсталосьСпичек - _Игра.ЧеловекУбралСпичек,1)
ОсталосьСпичек set _Игра.ОсталосьСпичек - _Игра.ЧеловекУбралСпичек - _Игра.КомпьютерУбралСпичек
Победитель set Победа(_Игра.ОсталосьСпичек,_Игра.ЧеловекУбралСпичек,_Игра.КомпьютерУбралСпичек)
Состояние set Сост(_Игра.Победитель)
$End
{Операция начинает игру, задаёт начальное количество спичек}
$Pattern ОбразецНачатьИгру : keyboard
$Relevant_resources
_Игра : Игра Keep Keep
$Time = 0.0
$Body
_Игра
Choice from _Игра.Состояние = 0 or _Игра.Состояние = 2
Convert_begin
Состояние set 1
Победитель set 0
ОсталосьСпичек set Спичек_на_столе
$End
Файл FUN
{Константа, для задания начального количества спичек на столе}
$Constant
Спичек_на_столе : integer = 18
$end
{Случайно возвращает число 1,2 или 3, для хода компьютера, когда то находится в проигрышной позиции}
$Sequence СлучойноеЧисло_1_3 : integer
$Type = by_hist 11111
$Body
1 1 0.333
1 2 0
2 2 0.334
2 3 0
3 3 0.333
$End
{Компьютер пытается поставить человека в проигрышную позицию, а если сам находится в ней то случайно берёт 1,2 или 3 спички}
$Function ХодКомпьютера : integer = 0
$Type = algorithmic
$Parameters
Осталось : integer
Итератор : integer
$Body
Calculate_if Осталось <= 0 ХодКомпьютера = 0
Calculate_if Осталось = 1 ХодКомпьютера = 1
Calculate_if Осталось = 2 ХодКомпьютера = 1
Calculate_if Осталось = 3 ХодКомпьютера = 2
Calculate_if Осталось = 4 ХодКомпьютера = 3
Calculate_if Осталось - 1 - 4*Итератор = 0 ХодКомпьютера = СлучойноеЧисло_1_3
Calculate_if Осталось - 1 - 4*Итератор <= 3 ХодКомпьютера = Осталось - 1 - 4*Итератор
Calculate_if Осталось - 1 - 4*Итератор > 3 ХодКомпьютера = ХодКомпьютера(Осталось,Итератор + 1)
$End
{Исправляет количество спичек, если человек хочет убрать больше, чем осталось}
$Function ХодЧеловека : integer = 0
$Type = algorithmic
$Parameters
Осталось : integer
Убрать : integer
$Body
Calculate_if Осталось < Убрать ХодЧеловека = Осталось
Calculate_if Осталось >= Убрать ХодЧеловека = Убрать
$End
{Проверяет есть ли победитель}
$Function Победа : integer = 0
$Type = algorithmic
$Parameters
Осталось : integer
ЧелУбрал : integer
КомпУбрал : integer
$Body
Calculate_if Осталось <> 0 Победа = 0
Calculate_if Осталось = 0 and КомпУбрал = 1 Победа = 1
Calculate_if Осталось = 0 and КомпУбрал = 0 Победа = -1
Calculate_if 1 = 1 Победа = -1
$End
{Изменяет состояние, если есть победитель}
$Function Сост : integer = 1
$Type = algorithmic
$Parameters
Победитель : integer
$Body
Calculate_if Победитель = -1 or Победитель = 1 Сост = 2
$End
Файл FRM
$Frame Frame1
$Back_picture = <128 255 200> 800 600
Show_if Игра.ОсталосьСпичек >= 60 rect[30,200,4,100,<255 255 0>,<255 255 0>]
Show_if Игра.ОсталосьСпичек >= 60 ellipse[27,196,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 60 ellipse[27,296,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 59 rect[42,200,4,100,<255 255 0>,<255 255 0>]
Show_if Игра.ОсталосьСпичек >= 59 ellipse[39,196,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 59 ellipse[39,296,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 58 rect[54,200,4,100,<255 255 0>,<255 255 0>]
Show_if Игра.ОсталосьСпичек >= 58 ellipse[51,196,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 58 ellipse[51,296,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 57 rect[66,200,4,100,<255 255 0>,<255 255 0>]
Show_if Игра.ОсталосьСпичек >= 57 ellipse[63,196,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 57 ellipse[63,296,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 56 rect[78,200,4,100,<255 255 0>,<255 255 0>]
Show_if Игра.ОсталосьСпичек >= 56 ellipse[75,196,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 56 ellipse[75,296,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 55 rect[90,200,4,100,<255 255 0>,<255 255 0>]
Show_if Игра.ОсталосьСпичек >= 55 ellipse[87,196,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 55 ellipse[87,296,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 54 rect[102,200,4,100,<255 255 0>,<255 255 0>]
Show_if Игра.ОсталосьСпичек >= 54 ellipse[99,196,10,8,<127 0 0>,<127 0 0>]
Show_if Игра.ОсталосьСпичек >= 54 ellipse[99,296,10,8,<127 0 0>,<127 0 0>]