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

Автор работы: Пользователь скрыл имя, 01 Февраля 2011 в 22:35, курсовая работа

Краткое описание

Целью данной курсовой работы является закрепление теоретических основ и практических аспектов имитационного моделирования систем.

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

- анализ предметной области;

- анализ программных средств, которые используются для моделирования систем;

- разработать программу;

- провести тестирование;

- оформить объяснительную записку.

Содержание работы

ВВЕДЕНИЕ……………………………………………………………………
РАЗДЕЛ 1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ……………………………

1.1. Основные понятия теории очередей……………………………………

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

1.3. Модельное время…………………………………………………………

1.4. Выводы……………………………………………………………………

РАЗДЕЛ 2 ОБОСНОВАНИЕ ВЫБОРА ПРОГРАММНЫХ СРЕДСТВ……

2.1. Стандартная библиотека STL……………………………………………

2.2. Выводы……………………………………………………………………

РАЗДЕЛ 3 ОПИСАНИЕ РАЗРАБОТАННОГО

ПРОГРАММНОГО ПРОДУКТА……………………………………………

3.1. Классы и объекты…………………………………………………………

3.2. События и методы…………………………………………………………

3.3. Реализация интерфейса……………………………………………………

3.4. Выводы……………………………………………………………………

РАЗДЕЛ 4 РУКОВОДСТВО ПРОГРАММИСТА……………………………

4.1. Назначение и условия применения программы…………………………

4.2. Состав программного продукта…………………………………………

4.3. Входные и исходные данные……………………………………………

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

5.1. Назначение программы…………………………………………………

5.2. Условия выполнения программы…………………………………………

5.3. Сообщение пользователю…………………………………………………

ВЫВОДЫ………………………………………………………………………

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ…………………………

Приложение А Текст программы……………………………………………
6

Содержимое работы - 1 файл

kursovoy.doc

— 324.50 Кб (Скачать файл)
 

Продолжение таблицы 2.1

1 2
<queue> очереди, т. е. структуры, организованные по принципу "первым вошел, первым вышел"
<set> множества
<stack> стеки, организованные по принципу "последним вошел, первым вышел"
<vector> векторы, подобны  динамическим массивам
 
 

     2.2. Выводы 
 

     В результате изучения средств разработки, для создания программного продукта был выбран язык программирования С++ и среда разработки Borland C++ Builder 6.0.

 

РАЗДЕЛ  3 описание разработанного

программного  продукта 
 

     3.1. Классы и объекты 
 

     Рассмотрим  особенности поставленной задачи:

     1) буксир имеет две разных очереди на обслуживание — на причаливание и на отчаливание. Заявки из очереди на отчаливание обслуживаются только в том случае, если очередь на причаливание пуста.

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

     Три типа неименованных заявок, можно  описать одним классом, так как они различаются только значениями своих неизменяемых полей данных — частотой встречаемости и временем обслуживания. Именованные заявки после выхода из порта пускаются «в самостоятельное плавание», продолжая существовать в качестве полноправных объектов системы, а неименованные – нет.

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

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

     Базовым классом будет класс неименованных заявок, а производным от него — расширенный класс именованных заявок. В качестве данных в элементе списка выступает не сам объект, а указатель на него, поэтому в качестве параметра шаблона задаем имя базового класса — неименованных заявок. Указатель на объект производного класса является и указателем на объект базового класса, поэтому указатель на именованную заявку — объект производного класса — можно смело заносить в элемент списка. Базовый класс – Tanker, производный класс – Tanker4.

     Опишем  класс Tanker:

     Неизменяемые  поля данных:

  • уникальный идентификатор объекта; можно назначить равным текущему значению счетчика прибытий;
  • тип танкера (1, 2 или 3);
  • среднее значение времени обслуживания на погрузке;
  • максимальное отклонение от среднего значения.

     Изменяемые  поля данных:

  • время, проведенное в системе на текущий момент, начиная от постановки в очередь к буксиру на причаливание;
  • код текущего состояния (1 — в очереди на причаливание, штормит; 2 — в очереди на причаливание, шторма нет; 3 — причаливание; 4 — в очереди на погрузку; 5 — погрузка; 6 — в очереди на отчаливание, штормит; 7 — в очереди на отчаливание, шторма нет; 8 — отчаливание).

     Производный класс Tanker4

     Неизменяемые  поля данных:

  • среднее значение времени в пути на разгрузку и обратно (14 400 мин);
  • максимальное отклонение от среднего значения (1440 мин);
  • связь с объектом Буксир для посылки ему сообщения о своем прибытии.

     Изменяемые  поля данных:

  • добавляется еще одно возможное значение кода текущего состояния (9 — в пути на разгрузку или обратно);
  • время до прибытия на причаливание (для состояния 9);

     Довольно  много полей данных приходится вводить  для класса Буксир (Tug). Это связано  с тем, что буксир является связующим  звеном между танкерами и портом, а кроме того следует учитывать еще и влияние штормов.

     Опишем Класс Tug:

     Неизменяемые  поля данных:

  • среднее значение интервала времени между прибытиями танкеров первых трех типов (660 мин);
  • максимальное отклонение от среднего значения (420 мин);
  • длительность причаливания и отчаливания (60 мин);
  • средняя продолжительность шторма (240 мин);
  • максимальное отклонение от среднего значения (120 мин);
  • параметр экспоненциального распределения для интервала времени между штормами (0,021);
  • указатель на объект класса Port для взаимодействия с ним.

     Изменяемые  поля данных:

  • время до следующего прибытия танкера одного из трех типов;
  • время до окончания причаливания;
  • время до окончания отчаливания;
  • очередь танкеров на причаливание;
  • очередь танкеров на отчаливание;
  • причаливающий (отчаливающий) танкер;
  • текущая длина очереди на причаливание (вычисляемое поле);
  • текущая длина очереди на отчаливание (вычисляемое поле);
  • время до начала следующего шторма;
  • время до окончания шторма.

     Класс Port моделируется как обычный многоканальный узел обслуживания с общей очередью.

     Неизменяемые  поля:

  • количество терминалов для погрузки (3);
  • указатель на объект класса Tug.

     Изменяемые  поля:

  • очередь танкеров на погрузку;
  • массив указателей на обслуживаемые в данный момент танкеры;
  • массив значений времени, оставшегося до окончания погрузки на каждом из терминалов;
  • текущая длина очереди (вычисляемое поле).
 
 

     3.2. События и методы 
 

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

  1. Начало шторма. Метод не имеет параметров.
  2. Окончание шторма. Метод не имеет параметров.
  3. Прибытие танкера четвертого типа на причаливание. Метод имеет параметр указатель на прибывший танкер.
  4. Прибытие танкера одного из первых трех типов на причаливание. Метод не имеет параметров.
  5. Один из танкеров закончил погрузку и требует отчаливания. Метод имеет параметр — указатель на танкер.
  6. Окончание отчаливания. Метод не имеет параметров, так как отчаливший танкер доступен через поле данных самого буксира.
  7. Окончание причаливания. Метод не имеет параметров, так как причаливший танкер доступен через поле данных самого буксира.

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

     В методе 5 в качестве параметра передаем указатель на танкер любого типа — как указатель на объект базового класса.

     Финальной частью методов 2, 6 и 7 является одно и то же действие — выбор в одной из очередей первого танкера и постановка его на обслуживание. Этот общий фрагмент кода для исключения повторений выделяем в отдельный метод, который назовем choice().

     Для объекта Port событий всего два:

  • прибытие очередного танкера. Метод имеет один параметр (указатель на прибывший танкер) и вызывается буксиром из метода 7;
  • завершение погрузки. Метод имеет один параметр (номер терминала, который завершил погрузку) и вызывает метод 5 для буксира.
 

class Tanker

{

public:

long int id;            //идентификатор танкера

int type;               //номер типа

int median;             //среднее время погрузки

int offset;             //максимальное отклонение

int minutes;            //текущее время пребывания на  погрузке

int state;              //текущее состояние

friend class Tug;

friend class Port;

 Tanker();               //конструктор

/*Метод Print() удобно объявить виртуальным, например, для обхода любой из очередей и распечатки ее содержимого, так как в очереди могут находиться танкеры любого типа*/

virtual void Print();

}; 

//Производный  класс

 class Tanker4: public Tanker

{

  const static int median_path=14400;   //14400 минут=240 часов  - среднее

                                        //время обращения танкера четвертого

                                        //типа

  const static int offset_path=1440;    //24 часа - максимальное отклонение

                                        //от среднего для времени обращения

                                        //танкера четвертого типа

  int to_arrival;        //время до прибытия пустого  танкера на причаливание

  void *t;               //связь с буксиром

  public:

  friend class Tug;

  friend class Port;

  Tanker4(int i);

  void putTug(Tug *a);

  void run();//диспетчер

  virtual void Print();

}; 

//Класс  Буксир

class Tug

{

const static int arr_median=660; //660 минут=11 часов - среднее время между //прибытиями танкеров первых трех типов

const static int arr_offset=420;    //7 часов - максимальное  отклонение

                                     //от среднего для интервалов  между

                                     //прибытиями танкеров первых трех типов

const static int time_path=60;      //1 час - длительность  причаливания

Информация о работе Моделирование работы порта