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

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



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

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















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

«Моделирование с помощью системы интеллектуального имитационного моделирования РДО»

По курсу

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













Студент

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

Группа

А-13-07

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

Еремеев А.П.









2011 г.

Содержание




Содержание 2

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

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

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

Типы ресурсов 3

Ресурсы 4

Операции 4

Интерфейс 5

Прогон 5

Приложение 5

Объекты функций 5

Объекты последовательностей 6

Объекты образцов операций 7

Объекты кадров анимации 11








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

Реализация некоторой ситуации с помощью системы интеллектуального имитационного моделирования РДО.



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

Имеется склад, на который необходимо доставить фиксированное количество груза. К нему периодически подъезжают фуры. Общее число фур – 3. На складе работают 2 грузчика, осуществляющие транспортировку груза из машин на склад. Причём каждый грузчик может разгружать только 2 ближайших грузовика. Конечное состояние наступает, когда необходимое число ящиков занесено грузчиками на склад.



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

Типы ресурсов


Грузчик необходим для разгрузки фур и переноса ящиков на склад. К машине прикрепляется один из двух грузчиков или она может быть без грузчика, если оба заняты. Грузчик в процессе работы прибывает в одном из следующих состояний: он может быть на складе (ждать машину или разгружаться), идти к машине или на склад и производить разгрузку машины. Грузчик может быть с грузом (после разгрузки машины) или без груза (при движении к машине или при движении на склад во время неудачной попытки разгрузки, когда другой грузчик опередил его). При передвижении грузчика меняется параметр “текущий шаг”, пока не станет равным параметру “всего шагов” при движении к машине или 0 при движении на склад. X и Y – текущие координаты грузчика, X_begin и Y_begin – начальные координаты. Действия грузчика могут начинаться или находиться в стадии завершения.



$Resource_type Ресурс_Грузчик : permanent

$Parameters

Идентификатор : (Грузчик_1, Грузчик_2, Без_грузчика)

Состояние : (на_складе, идёт_к_машине, идёт_на_склад, разгружает_машину)

с_грузом : integer

Машина : (Машина_1, Машина_2, Машина_3,Без_машины)

текущий_шаг : integer

всего_шагов : integer

X : real

Y : real

X_begin : integer

Y_begin : integer

Действие : (Начало, Конец)

$End



Типы ресурсов машины и грузчика взаимосвязаны и имеют аналогичные параметры. Параметр “приехала” поставленный в 1 говорит о приезде машины и готовности ею к разгрузке.


$Resource_type Ресурс_Машина : permanent

$Parameters

Идентификатор : such_as Ресурс_Грузчик.Машина

приехала : integer

Грузчик : such_as Ресурс_Грузчик.Идентификатор

X : integer

Y : integer

$End

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


$Resource_type Ресурс_Счетчик : permanent

$Parameters

Разгружено : integer = 0

Нужно_зразгрузить: integer = 8

$End



Ресурсы



Создаются 2 грузчика и 3 машины. Изначально грузчики находятся на складе и не имеют прикреплённых машин, а машины – грузчиков, соответственно.


$Resources

грузчик_1 : Ресурс_Грузчик Грузчик_1 на_складе 0 Без_машины 0 17 950 450 950 450 Начало

грузчик_2 : Ресурс_Грузчик Грузчик_2 на_складе 0 Без_машины 0 27 1050 455 1050 455 Начало


машина_1 : Ресурс_Машина Машина_1 0 Без_грузчика 600 360

машина_2 : Ресурс_Машина Машина_2 0 Без_грузчика 600 460

машина_3 : Ресурс_Машина Машина_3 0 Без_грузчика 600 560


счетчик : Ресурс_Счетчик * * // значения по умолчанию

$End



Операции



$Operations

Операция_1 : операция_вышел_за_грузом Машина_1

Операция_2 : операция_вышел_за_грузом Машина_2

Операция_3 : операция_вышел_за_грузом Машина_3

Операция_4 : операция_идёт_к_машине

Операция_5 : операция_идёт_на_склад

Операция_6 : операция_подойти_к_нужной_машине

Операция_7 : операция_забрать_коробки

Операция_8 : операция_войти_на_склад

Операция_9 : операция_разгрузить_коробки

Операция_10 : операция_приезд_машины_1

// Операция_11 : операция_приезд_машины_2

Операция_12 : операция_приезд_машины_3

Операция_13 : операция_собирается_вернуться

Операция_14 : операция_собирается_вернуться

// клавиатурные операции

Операция_15 : операция_выезд_мащшины_1 '1'

Операция_16 : операция_выезд_мащшины_2 '2'

Операция_17 : операция_выезд_мащшины_3 '3'

$End






Интерфейс


Грузчики разгружают прибывшие машины, а затем относят ящики на склад. Если грузчика на пути к машине опередил другой грузчик, он возвращается на склад и дожидается свободной машины. 1-ая и 3-я машины приезжают как самостоятельно (по функции рандома) так и вызываются с помощью соответствующих клавиатурных операций. Приезд 2-ой машины является следствием исключительно клавиатурной операции. 1-ый грузчик имеет право обслуживать только 1-ую и 2-ую машины, а 2-ой – 2-ую и 3-ю.



Прогон


Model_name = whs


Resource_file = whs

OprIev_file = whs

Statistic_file = whs

Results_file = whs

Trace_file = whs

Frame_file = whs

Frame_number = 1

Show_mode = Animation

Show_rate = 10000.0


Terminate_if счетчик.Разгружено = счетчик.Нужно_зразгрузить


Приложение



Объекты функций


Если машина не прикреплена пока ещё ни к какому грузчику


$Function функция_Машина_свободна : integer = 0

$Type = algorithmic

$Parameters

машина : such_as Ресурс_Машина.Идентификатор

$Body

Calculate_if машина = Машина_1 and машина_1.Грузчик= Без_грузчика

функция_Машина_свободна = 1

Calculate_if машина = Машина_2 and машина_2.Грузчик= Без_грузчика

функция_Машина_свободна = 1

Calculate_if машина = Машина_3 and машина_3.Грузчик= Без_грузчика

функция_Машина_свободна = 1


$End


Зона обслуживания каждого грузчика (1-ая и 2-ая машины для 1-ого, 2-ая и 3-я машины – для 2-го).


$Function функция_зона_грузчика : integer [0..1]

$Type = table

$Parameters

грузчик : such_as Ресурс_Грузчик.Идентификатор

машина : such_as Ресурс_Грузчик.Машина

$Body

1 0 0

1 1 0

0 1 0

0 0 0

$End



Изменение координаты грузчика по горизонтальной оси


$Function Длина_шага_X : real [-100..100]

$Type = table

$Parameters

грузчик : such_as Ресурс_Грузчик.Идентификатор

машина : such_as Ресурс_Грузчик.Машина

$Body

-10 0 0

-10 -10 0

0 -10 0

0 0 0

$End


Изменение координаты грузчика по вертикальной оси



$Function Длина_шага_Y : real [-100..100]

$Type = table

$Parameters

грузчик : such_as Ресурс_Грузчик.Идентификатор

машина : such_as Ресурс_Грузчик.Машина

$Body

-6 0 0

0 0 0

0 4 0

0 0 0

$End



Объекты последовательностей


Функция рандома для выезда машины


$Sequence Рандом : integer

$Type = uniform 123456789

$End




Объекты образцов операций


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


$Pattern операция_вышел_за_грузом : operation

$Parameters

Идентификатор_машины : such_as Ресурс_Грузчик.Машина

$Relevant_resources

_машина : Ресурс_Машина NoChange NoChange

_грузчик : Ресурс_Грузчик Keep Keep

$Time = 0.1

$Body

_машина

Choice from

_машина.приехала = 1 and

_машина.Идентификатор = Идентификатор_машины

_грузчик

Choice from

_грузчик.Состояние = на_складе and

_грузчик.с_грузом = 0 and

функция_зона_грузчика(_грузчик.Идентификатор, _машина.Идентификатор) = 1 and

_машина.Грузчик = Без_грузчика and

_грузчик.Действие = Начало

Convert_begin

Действие set Конец

Convert_end

Состояние set идёт_к_машине

Машина set _машина.Идентификатор

Действие set Начало

$End





$Pattern операция_идёт_к_машине : operation

$Relevant_resources

_грузчик : Ресурс_Грузчик Keep Keep

$Time = 0.5

$Body

_грузчик

Choice from

_грузчик.Состояние = идёт_к_машине and

_грузчик.текущий_шаг < _грузчик.всего_шагов and

функция_Машина_свободна(_грузчик.Машина) = 1 and

_грузчик.Действие = Начало

Convert_begin

Действие set Конец

Convert_end

X set _грузчик.X + Длина_шага_X(_грузчик.Идентификатор, _грузчик.Машина)

Y set _грузчик.Y + Длина_шага_Y(_грузчик.Идентификатор, _грузчик.Машина)

текущий_шаг set _грузчик.текущий_шаг + 1

Действие set Начало

$End


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


$Pattern операция_собирается_вернуться : operation

$Relevant_resources

_грузчик : Ресурс_Грузчик Keep Keep

$Time = 0.1

$Body

_грузчик

Choice from

_грузчик.Состояние = идёт_к_машине and

функция_Машина_свободна(_грузчик.Машина) = 0 and

_грузчик.Действие = Начало

Convert_begin

Действие set Конец

Convert_end

Состояние set идёт_на_склад

Действие set Начало

$End


После разгрузки машины грузчик идёт на склад.


$Pattern операция_идёт_на_склад : operation

$Relevant_resources

_грузчик : Ресурс_Грузчик Keep Keep

$Time = 0.5

$Body

_грузчик

Choice from

_грузчик.Состояние = идёт_на_склад and

_грузчик.текущий_шаг > 0 and

_грузчик.Действие = Начало

Convert_begin

Действие set Конец

Convert_end

X set _грузчик.X - Длина_шага_X(_грузчик.Идентификатор, _грузчик.Машина)

Y set _грузчик.Y - Длина_шага_Y(_грузчик.Идентификатор, _грузчик.Машина)

текущий_шаг set _грузчик.текущий_шаг - 1

Действие set Начало

$End


Грузчик дошёл до нужной машины и готов к разгрузке.

$Pattern операция_подойти_к_нужной_машине : operation

$Relevant_resources

_грузчик : Ресурс_Грузчик Keep Keep

_машина : Ресурс_Машина NoChange Keep

$Time = 0.1

$Body

_грузчик

Choice from

_грузчик.Состояние = идёт_к_машине and

_грузчик.текущий_шаг = _грузчик.всего_шагов and

_грузчик.Действие = Начало

Convert_begin

Действие set Конец

Convert_end

Состояние set разгружает_машину

Действие set Начало

_машина

Choice from

_машина.Идентификатор = _грузчик.Машина

Convert_end

Грузчик set _грузчик.Идентификатор

$End

Грузчик разгружает машину.


$Pattern операция_забрать_коробки : operation

$Relevant_resources

_грузчик : Ресурс_Грузчик Keep Keep

_машина : Ресурс_Машина NoChange Keep

$Time = 4

$Body

_грузчик

Choice from

_грузчик.Состояние = разгружает_машину and

_грузчик.Действие = Начало

Convert_begin

Действие set Конец

Convert_end

Состояние set идёт_на_склад

с_грузом set 1

Действие set Начало

_машина

Choice from

_машина.Идентификатор = _грузчик.Машина

Convert_end

Грузчик set Без_грузчика

приехала set 0

$End


Грузчик оставляет груз на складе


$Pattern операция_разгрузить_коробки : operation

$Relevant_resources

_грузчик : Ресурс_Грузчик Keep Keep

_счетчик : счетчик Keep NoChange

$Time = 0.5

$Body

_грузчик

Choice from

_грузчик.Состояние = на_складе and

_грузчик.с_грузом = 1 and

_грузчик.Действие = Начало

Convert_begin

Действие set Конец

Convert_end

с_грузом set 0

Действие set Начало

_счетчик

Choice NoCheck

Convert_begin

Разгружено set _счетчик.Разгружено + 1

$End



Грузчик заходит на склад.


$Pattern операция_войти_на_склад : operation

$Relevant_resources

_грузчик : Ресурс_Грузчик Keep Keep

$Time = 0.5

$Body

_грузчик

Choice from

_грузчик.Состояние = идёт_на_склад and

_грузчик.текущий_шаг = 0 and

_грузчик.Действие = Начало

Convert_begin

Действие set Конец

Convert_end

Состояние set на_складе

Действие set Начало

$End


Приезд 1-ой машины.


$Pattern операция_приезд_машины_1 : irregular_event

$Relevant_resources

_машина : машина_1 Keep

$Time = Рандом(100, 150)

$Body

_машина

Convert_event

приехала set 1

$End


Приезд 2-ой машины. Не активен с целью дать больше возможностей клавиатурной операции


/*

$Pattern операция_приезд_машины_2 : irregular_event

$Relevant_resources

_машина : машина_2 Keep

$Time = Рандом(70, 80)

$Body

_машина

Convert_event

приехала set 1

$End

*/


Приезд 3-ой машины.


$Pattern операция_приезд_машины_3 : irregular_event

$Relevant_resources

_машина : машина_3 Keep

$Time = Рандом(80, 90)

$Body

_машина

Convert_event

приехала set 1

$End




Клавиатурная операция. Запуск 1-ой машины по нажатию клавиши “1”.


$Pattern операция_выезд_мащшины_1 : keyboard trace

$Relevant_resources

_машина : машина_1 Keep Keep

$Time = 0.0

$Body

_машина

Convert_begin

приехала set 1

$End


Клавиатурная операция. Запуск 2-ой машины по нажатию клавиши “2”.


$Pattern операция_выезд_мащшины_2 : keyboard trace

$Relevant_resources

_машина : машина_2 Keep Keep

$Time = 0.0

$Body

_машина

Convert_begin

приехала set 1

$End



Клавиатурная операция. Запуск 3-ой машины по нажатию клавиши “3”.


$Pattern операция_выезд_мащшины_3 : keyboard trace

$Relevant_resources

_машина : машина_3 Keep Keep

$Time = 0.0

$Body

_машина

Convert_begin

приехала set 1

$End



Объекты кадров анимации


$Frame Главный

$Back_picture = <255 255 255> fon


// машина приехала (стала видимой)


Show_if машина_1.приехала = 1

bitmap [машина_1.X, машина_1.Y, car, car_msk]

Show_if машина_2.приехала = 1

bitmap [машина_2.X, машина_2.Y, car, car_msk]

Show_if машина_3.приехала = 1

bitmap [машина_3.X, машина_3.Y, car, car_msk]


// грузчик идёт к машине с пустыми руками

Show_if грузчик_1.с_грузом = 0

bitmap [грузчик_1.X, грузчик_1.Y, loader_0, loader_0_msk]

Show_if грузчик_1.с_грузом = 1

bitmap [грузчик_1.X, грузчик_1.Y, loader_1, loader_1_msk]

// грузчик несёт коробки на склад

Show_if грузчик_2.с_грузом = 0

bitmap [грузчик_2.X, грузчик_2.Y, loader_0, loader_0_msk]

Show_if грузчик_2.с_грузом = 1

bitmap [грузчик_2.X, грузчик_2.Y, loader_1, loader_1_msk]

Show

text [ 50, 100, 250, 20, transparent, <0 0 0>, 'Разгружено ящиков:' ]

text [ 50, 120, 100, 20, transparent, <0 0 0>, счетчик.Разгружено]

text [ 50, 170, 250, 20, transparent, <0 0 0>, 'Нужно_зразгрузить ящиков:' ]

text [ 50, 190, 100, 20, transparent, <0 0 0>, счетчик.Нужно_зразгрузить]

text [ 50, 240, 250, 20, transparent, <0 0 0>, 'Процент выполненной работы:' ]

text [ 50, 260, 100, 20, transparent, <0 0 0>, (счетчик.Разгружено / счетчик.Нужно_зразгрузить) * 100 ]

text [ 500, 345, 350, 20, transparent, <0 0 0>, 'Чтобы вызвать 1-ую мшину нажмите 1:' ]

text [ 500, 445, 350, 20, transparent, <0 0 0>, 'Чтобы вызвать 2-ую мшину нажмите 2:' ]

text [ 500, 545, 350, 20, transparent, <0 0 0>, 'Чтобы вызвать 3-ую мшину нажмите 3:' ]

$End

28