Моделирование работы порта

Понятие объектно-ориентированного программирования и особенности применения его принципов при моделировании работы порта. Характеристика выделенных классов и состав результатов проектирования. Конечное описание полей классов. Описание результатов.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 20.02.2012
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Введение

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

Объектно-ориентированное программирование является хорошим инструментом в имитационном моделировании динамических систем.

Основные идеи объектно-ориентированного подхода опираются на следующие положения:

- программа представляет собой модель некоторого реального процесса, части реального мира;

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

- объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект;

- взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому. Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта;

- объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий, представляют собой класс однотипных объектов.

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

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

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

В африканском порту танкеры загружаются сырой нефтью, которую морским путем доставляют затем по назначению. Мощности порта позволяют загружать не более трех танкеров одновременно. Танкеры, прибывающие в порт через каждые 11±7 часов (распределение равномерное на интервале 4-18), относятся к трем различным типам. Значения относительной частоты появления танкеров данного типа и времени, требуемого на их погрузку, приведены ниже:

Тип

Относительная частота

Время погрузки, ч

1

0.25

182

2

0.55

243

3

0.20

364

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

Судовладелец предлагает дирекции порта заключить контракт на перевозку нефти в Великобританию и обеспечить выполнение условий контракта с помощью пяти танкеров особого, четвертого типа, которые на погрузку требуют 21 ±3 часов. После погрузки танкер отчаливает и следует в Англию, там разгружается и затем снова возвращается в африканский порт для погрузки. Время цикла обращения танкера, включая время разгрузки, составляет 240±24 часов. Фактором, осложняющим процесс перевозки нефти, являются штормы, которым подвергается порт. Интервал времени между штормами распределен экспоненциально с математическим ожиданием 48 часов, причем шторм продолжается 4±2 часа. Во время шторма буксир не работает.

Перед заключением контракта руководство порта решило определить влияние, которое окажут пять дополнительных танкеров на время пребывания в порту остальных судов. Выводы предложено сделать по результатам имитации работы порта в течение 5000 часов при условии принятия предлагаемого контракта. Оцениваемые величины:

- время пребывания в порту дополнительных танкеров и уже работающих танкеров трех типов.

2. Результаты анализа

2.1 Выделение субъектов

моделирование объектный программирование порт

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

После анализа задания были выделены такие компоненты:

Активные субъекты:

Танкер

Порт

Шторм

Буксир

Пассивные объекты:

Нефть

2.2 Сценарии использования

Сценарий использования, описывающий процесс загрузки танкера нефтью, представлен в таблице 2.1

Таблица 2.1 - Загрузка танкера нефтью

Критерий

Описание

Имя сценария

Загрузка танкера нефтью.

Имя субъекта

Танкер

Предусловие

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

Постусловие

Танкер готов отчалить.

Режим

1. Танкер причаливает с помощью буксира;

2. Танкер загружается нефтью;

3. Танкер ожидает отчаливания.

Данный сценарий является ключевым в данном проекте, так как именно работа танкера представляет целевой интерес в данной предметной области.

Сценарий использования, описывающий отчаливание танкера от порта, описан в таблице 2.2

Таблица 2.2 - Отчаливание танкера

Критерий

Описание

Имя сценария

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

Имя субъекта

Танкер

Предусловие

Танкер загружен нефтью.

Постусловие

Танкер доставляет нефть в другую страну.

Режим

1. Танкер ожидает, пока буксир освободится;

2. Танкер отчаливает с помощью буксира.

Сценарий использования, отображающий работу буксира, описан в таблице 2.3

Таблица 2.3 - Работа буксира

Критерий

Описание

Имя сценария

Работа буксира.

Имя субъекта

Буксир

Предусловие

Есть танкеры, ожидающие услуг буксира.

Постусловие

Нет танкеров, нуждающихся в услугах буксира.

Режим

1. Если есть танкеры, ожидающие причаливания, и есть свободные места в порту, причалить эти танкеры;

2. Если есть танкеры, ожидающие отчаливания - отчалить.

Сценарий использования, отображающий действия во время шторма, описан в таблице 2.4

Таблица 2.4 - Появление шторма

Критерий

Описание

Имя сценария

Появление шторма.

Имя субъекта

Шторм

Предусловие

Настало время начала шторма.

Постусловие

Шторм прекращается.

Режим

1. Остановить все буксиры;

2. Возобновить работу всех буксиров по окончании шторма.

2.3 Описание выделенных классов

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

Поведение танкера в системе будет моделировать класс CTanker.

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

Класс CTanker.

1. Свойства:

а) состояние;

б) тип;

в) время до изменения состояния.

2. Методы:

а) конструктор;

б) возврат состояния.

Поведение буксира в системе будет моделировать класс CTugboat. Данный класс будет хранить ссылку на танкер, который он в данный момент времени перевозит. Кроме того, он будет хранить переменную со своим текущим состоянием.

Класс CTugboat.

1. Свойства:

а) состояние;

б) ссылка на танкер;

2. Методы

а) конструктор;

б) возврат состояния.

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

Класс CPort.

1. Свойства:

а) список танкеров.

2. Методы:

а) конструктор;

б) возврат размера очереди;

в) добавление нового танкера;

г) удаление танкера.

Шторм, который мешает работе буксира, будет отображать класс CStorm. Данный класс будет содержать переменную со своим текущим состоянием и переменную, которая будет отображать время до изменения текущего состояния, и метод, который будет отвечать за смену состояний.

Класс CStorm.

1. Свойства:

а) состояние;

б) время до смены состояния.

2. Методы:

а) конструктор.

Общее поведение системы, а также управление всеми классами будет совершать класс CApp. Он будет хранить массив ссылок на все танкеры, а также ссылки на порт, буксир и шторм. Кроме этого в данном классе будет храниться глобальное время моделирования системы.

Класс CApp.

1. Свойства:

а) массив ссылок на танкеры;

б) ссылка на порт;

в) ссылка на буксир;

г) ссылка на шторм.

2. Методы:

а) конструктор.

3. Результаты проектирования

3.1 Состав результатов проектирования

Следующим этапом разработки объектно-ориентированного программного продукта является разработка набора моделей (диаграмм, UML-схем), достаточного для полного описания реализации продукта. В данном случае достаточно разработать 9 схем:

а) варианты использования;

б) статическое представление;

в) диаграмма взаимодействия;

г) диаграмма состояний;

д) диаграмма компонентов;

е) описание полей классов;

ж) диаграмма объектов;

з) диаграмма пакетов.

3.2 Диаграммы вариантов использования

Диаграммы вариантов использования некоторых объектов показаны на рисунках 3.1 и 3.2.

Рисунок 3.1 - Диаграмма вариантов использования для экземпляра класса CTugboat

Рисунок 3.2 - Диаграмма Вариантов использования для экземпляра класса CTanker

Это диаграммы вариантов использования. Центральное место тут занимает вариант использования (основное действие, написанное в круге). Это действие связанно отношением ассоциации с актером (обозначается на диаграмме в форме человечка с подписью). Над отношением поставлена кратность. Актером на диаграмме является предмет или существо, которое участвует в действии. В данном случае это объекты классов. Основной вариант использования разделен на этапы. Эти этапы выведены в рамках отдельных вариантов и соединены с основным вариантом отношением включения (основной вариант включает в себя эти этапы). Так можно продолжать, пока не будет достигнут желаемый уровень конкретизации. Но в данном случае и эти варианты можно без особого труда описать в исходном коде, а значит их достаточно.

3.3 Диаграмма статического представления

Диаграмма статического представления (диаграмма классов) описывает отношения между объектами программы. На данной диаграмме использованы два вида отношений: ассоциация и агрегация. В основе расположен класс CApp. У него в свойствах, как было оговорено раннее, есть все объекты, участвующие в программе, которые он имеет право создавать и удалять. Такому виду отношений (отношение часть-целое) соответствует агрегация. На схеме она показана линией с ромбиком возле главного класса. В свою очередь объекты классов, для своего функционирования, нуждаются в данных объектов других классов. Среди свойств они имеют указатели на соответствующие объекты. А на диаграмме это отражено отношением ассоциации (линией с кратностью возле каждого из классов).

Диаграмма статического представления изображена на рисунке 3.3.

Рисунок 3.3 - Диаграмма статического представления

3.4 Диаграмма взаимодействия

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

Размещено на http://www.allbest.ru/

Объект класса CApp создает все остальные объекты в системе в начале ее работы. Объекты класса CTanker создаются не все сразу. Вначале создаются танкеры последнего, исследуемого четвертого типа. Остальные танкеры появляются и удаляются из системы по оговоренным в задании случайным законам. Прежде, чем причаливать танкер к порту, буксир запрашивает информацию о наличии шторма. Если же шторм застает буксир в пути, то он просто останавливается и ожидает окончания шторма. После причаливания танкер определенное время загружается нефтью. До причаливания, необходимо убедиться, что в порту есть свободные места. После загрузки танкер, как правило, ожидает буксир, потому что в работе буксира более приоритетным считается причаливание к порту, чем отчаливание. После отчаливания, корабль четвертого типа уходит в транзит на Великобританию. Однако, если это танкер не четвертого типа, то он непременно удаляется, так как нас не интересует в данном случаем его дальнейшее направление движения и действия как таковые.

Диаграмма взаимодействия показана на рисунке 3.4.

Рисунок 3.4 - Диаграмма взаимодействия

3.5 Диаграмма состояний

Диаграммы состояний для классов CTugboat, CTanker и CStorm показаны на рисунках 3.5, 3.6 и 3.7 соответственно.

Рисунок 3.5 - Диаграмма состояний для класса CTugboat

Рисунок 3.6 - Диаграмма состояний для класса CTanker

Рисунок 3.7 - Диаграмма состояний для класса CStorm

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

В данном случае такими объектами являются буксир, танкер и шторм.

Сразу после создания класс CTugboat (буксир) переходит в состояние isOff, которое означает, что буксир находится в режиме ожидания. В этом же состоянии буксир пребывает во время шторма. Когда же имеются танкеры, ожидающие его услуг, буксир переходит в состояние isOn и остается в нем, пока не будут перевезены все танкеры.

Класс CTanker сразу после создания переходит в состояние WaitForLoad (ожидание загрузки), так как после создания все танкеры ожидают буксир. Когда приходит время причаливания к порту, танкер меняет состояние на TugForw (причаливание). Загружаясь, танкер переходит в состояние Load (загрузка). Когда буксир отчаливает танкер из порта, то новое состояние танкера - TugBack. Так как танкеры четвертого типа после этого отправляются в Великобританию, то для них введено специальное состояние inTransit, которое по прошествии определенного времени заменяется на WaitForLoad. Это происходит сразу же как только танкер прибывает обратно в порт в Африку.

Класс CStorm так же как и класс CTugboat имеет всего два состояния. Состояние isOff наступает сразу после создания и тогда, когда шторм прекращается. Состояние isOn соответственно наступает, когда шторм начинается и длится. Эти состояния зависят только от внутреннего времени самого объекта данного класса и никак не регулируются системой, подчиняясь лишь тем законам случайности, которые описаны в задании.

3.6 Конечное описание полей классов

В пункте «результаты анализа», были описаны классы, которые требуются для реализации программы. Теперь, проанализировав задание более глубоко, можно описать эти классы точнее.

Некоторые свойства классов описаны в таблице 3.1

Таблица 3.1 - Классы и их свойства

Переменная

Описание

Класс CApp

m_Port

Ссылка на порт

m_Tugboat

Ссылка на буксир

m_EngTanker[5]

Ссылки на пять танкеров, перевозящих нефть в Великобританию

m_GlobalTime

Глобальное время системы

m_Storm

Ссылка на шторм

Класс CPort

m_Queue

Очередь из танкеров, ожидающих буксир

Класс CTanker

m_Type

Тип данного танкера

m_WrkTime

Время до изменения состояния танкера

m_State

Текущее состояние танкера

Класс CStorm

m_State

Текущее состояние объекта

m_TimeToChage

Время до изменения состояния

Класс CTugboat

m_State

Текущее состояние буксира

m_Tanker

Ссылка на танкер, обслуживаемый буксиром

Некоторые методы классов описаны в таблице 3.2

Таблица 3.2 - Классы и их методы

Метод

Описание

Класс CPort

Add()

Добавление танкера на загрузку

Del()

Удаление танкера из отсека загрузки

Push()

Добавление танкера в очередь на обслуживание

Pop()

Удаление танкера из очереди на обслуживание

Класс CApp

Work()

Работа всего порта

Класс CTugboat

On()

Перевод буксира в состояние работы

Off()

Перевод буксира в состояние ожидания

Метод

Описание

TimeIsOver()

Проверка на то, доставил ли буксир танкер (истекло ли время буксировки)

Класс CTanker

Work()

Работа танкера (фактически - смена его состояний)

GetState()

Возвращает состояние объекта

GetType()

Возвращает тип танкера

Класс CStorm

Work()

Работа шторма (смена его состояний)

3.7 Диаграмма объектов

Диаграмма объектов отображает значения системы в какой-то момент времени (в данном случае - 225 часов) и взаимосвязи между конкретными объектами системы. Объекты отображаются двумя прямоугольниками. В верхнем написано имя, в нижнем - свойства объекта и их значения.

Объект App владеет всеми остальными объектами. Также на диаграмме изображены 5 танкеров, которые перевозят нефть в Великобританию, причем два из них загружаются в порту, а три остальных пребывают в поездке. Также на диаграмме присутствует класс Port, который связан с двумя обслуживаемыми танкерами. Буксир (Tugboat) связан с танкером третьего типа и причаливает его к порту. Однако объект Storm имеет состояние isOn, что означает что в данный момент времени походит шторм, поэтому буксир имеет состояние isOff и является выключенным.

Диаграмма объектов изображена на рисунке 3.6

Рисунок 3.8 - Диаграмма объектов

3.8 Диаграмма пакетов

Для большего удобства отображения, классы можно сгруппировать в пакеты. Диаграмма пакетов отображает взаимодействие между пакетами. Между пакетами есть связь, если между классами, находящимися в этих пакетах, есть связь. Если пакет «Б» использует в своей реализации данные пакета «А» стрелка связи проводится из пакета «А» в пакет «Б».

Диаграмма классов для данной предметной области изображена на рисунке 3.4.

В данном случае в каждом из пакетов находится по одному классу (имя пакета - <имя класса>.cpp).

Главный пакет, который содержит все остальные, не имеет своего собственного файла, но отображает общий смысл системы. Этот пакет существует лишь как проект программного продукта.

Рисунок 3.9 - Диаграмма пакетов

4. Описание реализации

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

В данном проекте я реализовывал два класса: CApp и CPort.

Класс CPort при постановке задачи должен был отвечать за работу всей системы в целом. Однако при более детальном анализе проблемы мною было решено возложить на объект данного класса только управление портом, как загрузочной станцией.

Протокол класса CPort:

class CPort

{

public:

CPort();

int GetFreePlaces();

void Push (CTanker *Tanker);

CTanker* Pop();

void Add (CTanker *Tanker);

void Del (CTanker *Tanker);

void ChangeTime();

CTanker* Ready();

bool Empty();

private:

deque<CTanker*> m_Queue;

CTanker* m_Serv[3];

};

Пребывая в порт, танкер становится в очередь, которая ожидает буксировки. Для организации данной очереди было решено использовать контейнер <deque> стандартной библиотеки шаблонов.

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

Главным классом в проектируемой системе является класс CApp.

Протокол класса CApp:

class CApp

{

public:

CApp (int MaxTime);

void Work();

int Rnd (int a, int b);

private:

CPort *m_Port;

CTugboat *m_Tugboat;

CTanker *m_EngTanker[5];

int m_TimeToUsTan;

int m_MaxTime;

int m_GlobalTime;

CStorm *m_Storm;

int m_Stat[4];

int m_Times[4];

};

Он реализует работу всего порта как такового. Следовательно, данный класс должен следить и за ходом времени. Для этого была введена переменная m_GlobalTime, которая и показывает время, прошедшее с начала работы системы в часах. Час, как квант времени был выбран не случайно, потому что в данной специализации за отрезок времени меньший, чем час, ничего произойти не может. Максимальное время моделирования ограничено заданием и составляет 5000 часов.

Данный класс отслеживает время, и создает объекты новых танкеров с той частотой, которая была дана в задании. Это вызвало небольшую проблему. Мною было решено поддерживать относительную частоту появления танкеров определенного типа следующим образом: на отрезке от 0 до единицы включительно, выбиралось случайное число. Заранее этот отрезок был поделен на части, пропорциональные относительным частотам появления танкером. В зависимости от того из какой области была случайная величина, такой тип и задавался новому танкеру. Изначально такая идея не вызывала доверия, однако при проверке на довольно больших отрезках времени моделирования (t>1000), данная методика работала правильно. А так как это время заранее установлено и равно 5000, как говорилось ранее, то было решено использовать эту идею.

Выводы

моделирование объектный программирование порт

При выполнении курсового проекта для достижения поставленной цели был проведен объектно-ориентированный анализ, в результате которого выделены активные объекты, пассивные субъекты, варианты использования, а также следующие классы предметной области: CTanker (танкер), CStorm (шторм), CPort (порт), CTugboat (буксир), а также главный класс CApp. Для указанных классов определены атрибуты и операции.

По результатам анализа было проведено объектно-ориентированное проектирование, результатом которого стали следующие диаграммы:

а) варианты использования;

б) статическое представление;

в) диаграмма взаимодействия;

г) диаграмма состояний;

д) диаграмма компонентов;

е) описание полей классов;

ж) диаграмма объектов;

з) диаграмма пакетов.

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

Таким образом, в ходе работы к предметной области «Работа порта» были применены навыки имитационного моделирования с использованием ООП, результатом чего стал программный продукт, имитирующий работу порта, в котором танкеры загружаются нефтью.

Список использованной литературы

1. Г. Шилдт. Самоучитель C++. 3-е издание. - Санкт-Петербург: 2005 г., 680 с.

2. Бьярн Страуструп, «Язык программирования C++, специальное издание»

3. Хант, Эндрю, Томас, Дэвид. Программист-прагматик. Путь от подмастерья к мастеру. М.: Издательство «Лори», 2004. - 270 с.

4. Г. Саттер, А. Александреску. Стандарты программирования на C++.: Пер. с англ. - М.: Издательский дом «Вильямс», 2005. - 224 с.

5. Г. Буч, Д. Рамбо, А. Джекобсон, Программирование: Язык UML. Руководство пользователя.

Приложение А

ТЕХНИЧЕСКОЕ ЗАДАНИЕ

А.1 Общие сведения

Тема курсового проекта: «Имитационное моделирование динамических систем и процессов с использованием объектно-ориентированного подхода. Работа порта».

Система проектируется студентом 1-го курса Государственного института информатики и искусственного интеллекта (ГУИиИИ), факультета СКИТ, группы ПО-07д. Кушниренко Д.П.

Основанием для разработки ПП является задание, выданное кафедрой ПОИС Плановый срок начала работы по созданию информационной системы: 7.04.2008 г., срок окончания: 22.05.2008 г. Курсовая работа должна выполняться согласно графику, приведенному в таблице А.1.

Таблица А.1 - Стадии и этапы разработки программного продукта

Этапы работы

Сроки выполнения

1.

Получение задания

7.04.2008 г.

2.

Объектно-ориентированный анализ предметной области

10.04.2008 г.

3.

Составление технического задания

15.04.2008 г.

4.

Построение диаграмм классов и объектов

17.04.2008 г.

5.

Построение диаграмм взаимодействия, состояний и переходов.

24.04.2008

6.

Проектирование программы, построение диаграмм модулей и процессов

30.04.2008 г.

7.

Отладка программы на верхнем уровне

5.05.2008 г.

8.

Тестирование программы

10.05.2008 г.

9.

Написание пояснительной записки

17.05.2008 г.

10.

Защита курсового проекта

22.05.2008 г.

А.2 Назначение и цели создания программы

Данный программный продукт предназначен для имитации работы динамического объекта реального мира - порта и получения статистических данных на основе введения в работу системы пяти дополнительных танкеров, перевозящих нефть в Великобританию.

А.3 Характеристика объекта автоматизации

В африканском порту танкеры загружаются сырой нефтью, которую морским путем доставляют затем по назначению. Мощности порта позволяют загружать не более трех танкеров одновременно. Танкеры, прибывающие в порт через каждые 11±7 часов (распределение равномерное на интервале 4-18), относятся к трем различным типам. Значения относительной частоты появления танкеров данного типа и времени, требуемого на их погрузку, приведены ниже:

Тип

Относительная частота

Время погрузки, ч

1

0.25

182

2

0.55

243

3

0.20

364

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

Судовладелец предлагает дирекции порта заключить контракт на перевозку нефти в Великобританию и обеспечить выполнение условий контракта с помощью пяти танкеров особого, четвертого типа, которые на погрузку требуют 21 ±3 часов. После погрузки танкер отчаливает и следует в Англию, там разгружается и затем снова возвращается в африканский порт для погрузки. Время цикла обращения танкера, включая время разгрузки, составляет 240±24 часов. Фактором, осложняющим процесс перевозки нефти, являются штормы, которым подвергается порт. Интервал времени между штормами распределен экспоненциально с математическим ожиданием 48 часов, причем шторм продолжается 4±2 часа. Во время шторма буксир не работает.

Перед заключением контракта руководство порта решило определить влияние, которое окажут пять дополнительных танкеров на время пребывания в порту остальных судов. Выводы предложено сделать по результатам имитации работы порта в течение 5000 часов при условии принятия предлагаемого контракта. Оцениваемые величины:

- время пребывания в порту дополнительных танкеров и уже работающих танкеров трех типов.

А.4 Требования к программному продукту

А.4.1 Требования к системе в целом

В целом к системе предъявляются следующие требования:

а) имитация работы порта;

б) вывод статистики: среднее время пребывания в порту танкеров всех типов.

А.4.2 Требования к задачам и функциям, выполняемым продуктом

В процессе работы необходимо обеспечить выполнение следующих функций:

а) вывод результатов моделирования на экран

А.4.3 Требования к техническому обеспечению

а) Использовать IBM-совместимые ЭВМ с учетом необходимых ресурсов машины, необходимых для функционирования проектируемого программного продукта.

б) Обеспечить достаточный объем внешней памяти для возможности работы с необходимым объемом информации.

А.4.4 Требования к программному обеспечению

Программный продукт должен функционировать в условиях ОС MS-DOS

К программному обеспечению предъявляются следующие требования:

а) использование удобного и понятного пользовательского интерфейса.

А.4.5 Требованию к организационному обеспечению

В программную документацию должны входить:

1) пояснительная записка;

2) приложения:

а) техническое задание;

б) руководство пользователя;

в) экранные формы;

г) листинг программы.

Приложение Б

РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Интерфейс программного продукта оформлен на английском языке.

После запуска программы вы увидите окно, в котором будет предоставлена статистика, полученная в результате моделирования, в следующем виде:

TANKERS of type <тип>:

Total number of tankers: <кол-во танкеров данного типа>

Total number of loadings: <кол-во загрузок в порту>

Average time of staying in port is <кол-во часов> hours

Что соответствует требуемым статистическим величинам: общему количеству танкеров каждого типа, общему числу загрузок танкеров каждого типа, среднему времени пребывания танкеров каждого типа.

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

Приложение В

ЭКРАННЫЕ ФОРМЫ

Рисунок В.1 - Статистические данные моделирования системы

Приложение Г

ЛИСТИНГ ПРОГРАММЫ

Файл «General.h»

#include <deque>

using namespace std;

class CTanker

{

public:

CTanker (int Type, int *CurrTime, int *Stat, int *Times);

void Work();

void Statistic();

bool TimeIsOver();

int GetState();

int GetType();

void ChangeTime (bool Storm);

int Rnd (int a, int b);

private:

int m_Type;

int m_WrkTime;

int *m_CurrTime;

int m_TimeInPort;

int *m_Stat;

int *m_Times;

enum TankerState {WaitForLoad, TugForw, Load, TugBack, inTransit};

enum TankerState m_State;

};

class CTugboat

{

public:

CTugboat();

void On (CTanker *Tanker);

void Off();

int GetState();

void ChangeTime (bool Storm);

CTanker* GetTanker();

bool TimeIsOver();

private:

enum TugState {isOn, isOff};

enum TugState m_State;

CTanker *m_Tanker;

};

class CPort

{

public:

CPort();

int GetFreePlaces();

void Push (CTanker *Tanker);

CTanker* Pop();

void Add (CTanker *Tanker);

void Del (CTanker *Tanker);

void ChangeTime();

CTanker* Ready();

bool Empty();

private:

deque<CTanker*> m_Queue;

CTanker* m_Serv[3];

};

class CStorm

{

public:

CStorm();

int GetState();

void ChangeTime();

void Work();

int Rnd (int a, int b);

private:

enum StormState {isOff, isOn};

enum StormState m_State;

int m_TimeToChange;

};

class CApp

{

public:

CApp (int MaxTime);

void Work();

int Rnd (int a, int b);

private:

CPort *m_Port;

CTugboat *m_Tugboat;

CTanker *m_EngTanker[5];

int m_TimeToUsTan;

int m_MaxTime;

int m_GlobalTime;

CStorm *m_Storm;

int m_Stat[4];

int m_Times[4];

};

Файл «Constants.h»

namespace Constants

{

const int Loading[4] [2]={{16,20}, {21,27}, {32,40}, {18,24}};

const int TugTime=1;

const int Journey[2]={216,264};

const double Freq[3]={0. 25,0. 55,0.2};

const int Appear[2]={4,18};

const int StormTime[2]={2,6};

const int StormAppear[2]={28,68};

};

Файл «App.cpp»

#include «General.h»

#include «Constants.h»

#include <iostream>

#include <conio.h>

using namespace Constants;

using namespace std;

CApp:CApp (int MaxTime)

{

m_GlobalTime=0;

for (int i=0; i<4; i++)

{

m_Stat[i]=0;

m_Times[i]=0;

}

m_MaxTime=MaxTime;

m_Port=new CPort();

m_Tugboat=new CTugboat();

for (int i=0; i<5; i++)

{

m_EngTanker[i]=new CTanker (3, &m_GlobalTime,&m_Stat[3],&m_Times[3]);

m_Port->Push (m_EngTanker[i]);

}

m_Storm=new CStorm();

m_TimeToUsTan=Rnd (Appear[0], Appear[1]);

}

void CApp: Work()

{

int Total[4]={0, 0, 0, 5};

for (; m_GlobalTime<=m_MaxTime; m_GlobalTime++)

{

m_TimeToUsTan -;

m_Storm->ChangeTime();

for (int i=0; i<5; i++) m_EngTanker[i]->ChangeTime (m_Storm->GetState());

m_Port->ChangeTime();

m_Tugboat->ChangeTime (m_Storm->GetState());

if (m_TimeToUsTan==0)

{

int Type;

float P=float (Rnd(1,100))/100;

if (P<=Freq[0]) Type=0;

else

if (P<=Freq[0]+Freq[1]) Type=1;

else Type=2;

CTanker *Tanker=new CTanker (Type, &m_GlobalTime, &m_Stat[Type], &m_Times[Type]);

m_Port->Push(Tanker);

m_TimeToUsTan=Rnd (Appear[0], Appear[1]);

Total[Type]++;

}

for (int i=0; i<5; i++)

if (m_EngTanker[i]->TimeIsOver()&&m_EngTanker[i]->GetState()==4)

{

m_Port->Push (m_EngTanker[i]);

m_EngTanker[i]->Work();

}

if (m_Tugboat->TimeIsOver())

{

CTanker *Tanker=m_Tugboat->GetTanker();

m_Tugboat->Off();

if (Tanker->GetState()==1) m_Port->Add(Tanker);

if (Tanker->GetState()==3)

{

if (Tanker->GetType()==3) Tanker->Work();

else

{

Tanker->Statistic();

delete Tanker;

}

}

}

if (m_Port->GetFreePlaces()!=0&&m_Tugboat->GetState()==1)

{

if (! m_Port->Empty())

{

CTanker *Tanker=m_Port->Pop();

m_Tugboat->On(Tanker);

}

}

CTanker *Tanker1=m_Port->Ready();

if (Tanker1&&m_Tugboat->GetState())

{

m_Port->Del(Tanker1);

m_Tugboat->On(Tanker1);

}

}

cout<<«Moduling was lasting for «<<m_MaxTime<<» hours.\n\n»;

cout<< "***Results***\n\n»;

for (int i=0; i<4; i++)

{

cout<<«TANKERS of type «<<i+1<<»: \n»;

cout<<» Total number of tankers «<<Total[i]<<endl;

cout<<» Total number of loadings «<<m_Times[i]<<endl;

cout<<» Average time of staying in port is «<<float (m_Stat[i])/m_Times[i]<<» hours\n\n»;

}

}

int CApp: Rnd (int a, int b)

{

return a+rand()%(b-a+1);

}

Файл «main.cpp»

#include «General.h»

#include <conio.h>

int main()

{

CApp App(5000);

App. Work();

printf («Press any key to exit program…»);

getch();

return 0;

}

Файл «Port.cpp»

#include «General.h»

#include <deque>

CPort:CPort()

{

for (int i=0; i<3; i++)

m_Serv[i]=NULL;

}

int CPort: GetFreePlaces()

{

int k=3;

for (int i=0; i<3; i++) if (m_Serv[i]!=NULL) k -;

return k;

}

void CPort: Add (CTanker *Tanker)

{

int i=0;

for (; m_Serv[i]; i++);

if (i<3) m_Serv[i]=Tanker;

Tanker->Work();

}

void CPort: Del (CTanker *Tanker)

{

int i=0;

for (; m_Serv[i]!=Tanker; i++);

m_Serv[i]=NULL;

}

void CPort: Push (CTanker *Tanker)

{

m_Queue.push_back(Tanker);

}

CTanker* CPort: Pop()

{

if (! m_Queue.empty())

{

CTanker *Tanker=m_Queue.front();

m_Queue.pop_front();

return Tanker;

}

return NULL;

}

void CPort: ChangeTime()

{

for (int i=0; i<3; i++)

if (m_Serv[i]) m_Serv[i]->ChangeTime(0);

}

CTanker* CPort: Ready()

{

int Out=-1;

for (int i=0; i<3; i++)

if (m_Serv[i])

if (m_Serv[i]->TimeIsOver()) Out=i;

if (Out!=-1) return m_Serv[Out];

else return NULL;

}

bool CPort: Empty()

{

return m_Queue.empty();

}

Файл «Storm.cpp»

#include «General.h»

#include «Constants.h»

using namespace Constants;

CStorm:CStorm()

{

m_State=isOff;

m_TimeToChange=Rnd (StormAppear[0], StormAppear[1]);

}

int CStorm: GetState()

{

return m_State;

}

void CStorm: ChangeTime()

{

m_TimeToChange -;

if (m_TimeToChange==0) Work();

}

void CStorm: Work()

{

if (m_State==isOff)

{

m_State=isOn;

m_TimeToChange=Rnd (StormTime[0], StormTime[1]);

return;

}

m_State=isOff;

m_TimeToChange=Rnd (StormAppear[0], StormAppear[1]);

}

int CStorm: Rnd (int a, int b)

{

return a+rand()%(b-a+1);

}

Файл «Tanker.cpp»

#include «General.h»

#include «Constants.h»

using namespace Constants;

CTanker:CTanker (int Type, int *CurrTime, int *Stat, int *Times)

{

m_Type=Type;

m_State=WaitForLoad;

m_TimeInPort=*CurrTime;

m_CurrTime=CurrTime;

m_WrkTime=-1;

m_Stat=Stat;

m_Times=Times;

}

void CTanker: ChangeTime (bool Storm)

{

if (m_WrkTime>0)

{

if (Storm)

{

if (m_State!=TugForw&&m_State!=TugBack) m_WrkTime -;

return;

}

m_WrkTime -;

}

}

bool CTanker: TimeIsOver()

{

return m_WrkTime==0;

}

int CTanker: GetType()

{

return m_Type;

}

void CTanker: Work()

{

switch (m_State)

{

case WaitForLoad:

m_State=TugForw;

m_WrkTime=TugTime;

return;

case TugForw:

m_State=Load;

m_WrkTime=Rnd (Loading[m_Type] [0], Loading [m_Type] [1]);

return;

case Load:

m_State=TugBack;

m_WrkTime=TugTime;

return;

case TugBack:

m_State=inTransit;

Statistic();

m_WrkTime=Rnd (Journey[0], Journey[1]);

return;

case inTransit:

m_State=WaitForLoad;

m_TimeInPort=*m_CurrTime;

m_WrkTime=-1;

return;

}

}

void CTanker: Statistic()

{

*m_Stat+=(*m_CurrTime) - m_TimeInPort;

(*m_Times)++;

return;

}

int CTanker: GetState()

{

return m_State;

}

int CTanker: Rnd (int a, int b)

{

return a+rand()%(b-a+1);

}

Файл «Tugboat.cpp»

#include «General.h»

CTugboat:CTugboat()

{

m_State=isOff;

}

void CTugboat: On (CTanker *Tanker)

{

m_State=isOn;

m_Tanker=Tanker;

m_Tanker->Work();

}

void CTugboat: Off()

{

m_State=isOff;

m_Tanker=NULL;

}

int CTugboat: GetState()

{

return m_State;

}

void CTugboat: ChangeTime (bool Storm)

{

if (! Storm&&m_State==isOn) m_Tanker->ChangeTime(Storm);

}

CTanker* CTugboat: GetTanker()

{

return m_Tanker;

}

bool CTugboat: TimeIsOver()

{

if (m_State==isOn)

return m_Tanker->TimeIsOver();

return 0;

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.