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

ЛИЧНЫЙ КАБИНЕТ 

 

Здравствуйте гость!

 

Логин:

Пароль:

 

Запомнить

 

 

Забыли пароль? Регистрация

Повышение уникальности

Предлагаем нашим посетителям воспользоваться бесплатным программным обеспечением «StudentHelp», которое позволит вам всего за несколько минут, выполнить повышение уникальности любого файла в формате MS Word. После такого повышения уникальности, ваша работа легко пройдете проверку в системах антиплагиат вуз, antiplagiat.ru, etxt.ru или advego.ru. Программа «StudentHelp» работает по уникальной технологии и при повышении уникальности не вставляет в текст скрытых символов, и даже если препод скопирует текст в блокнот – не увидит ни каких отличий от текста в Word файле.

Результат поиска


Наименование:


курсовая работа Моделирование работы порта

Информация:

Тип работы: курсовая работа. Добавлен: 04.09.2012. Сдан: 2011. Страниц: 28. Уникальность по antiplagiat.ru: < 30%

Описание (план):


 
 
 
 
 
 
 
 
 
 
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе по дисциплине
«Имитационное моделирование»
на тему «Моделирование работы порта» 
 
 
 
 

Выполнил: 

Проверил: 
 
 

 

      РЕФЕРАТ 

     Курсовая  работа содержит 47 страницы, 1 рисунок, 3 таблицы, 3 источника литературы.
     Тема курсовой работы — моделирование работы порта.
     Целью данной курсовой работы является закрепление теоретических основ и практических аспектов имитационного моделирования систем.
     В ходе выполнения работы проведен анализ предметной области, программных  средств, которые используются для моделирования систем, разработан программный продукт, моделирующий работу участка дороги с односторонним движением. Программа функционирует под управлением OC Windows 9х/NT.
     Программа собирает статистические данные работы порта по загруженности буксира, среднему времени загрузки и средней длине очереди танкеров. 
 

     КЛАСС, ОЧЕРЕДЬ, STL, МОДЕЛИРОВАНИЕ, КЛАСС 

 

      Перечень условных обозначений 

     ОС  — операционная система
     СМО — система массового  обслуживания
     STL — Standard Template Library
     ГСЧ – генератор случайного числа 

 

      СОДЕРЖАНИЕ 

ВВЕДЕНИЕ…………………………………………………………………… РАЗДЕЛ  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 7
7
8
9
9
10
10
12 

13
13
16
20
22
23
23
23
24
25
25
25
26
27
28
29
 

      ВВЕДЕНИЕ 
 

     Имитационное  моделирование позволяет  проанализировать любую  реальную систему  произвольной сложности. Основная ценность имитационного моделирования заключается в том, что здесь можно отбросить практически все ограничения и моделировать систему в условиях, предельно близких к реальности. Поэтому только разумное сочетание аналитического и имитационного подходов к моделированию позволяет полностью выявить характерные особенности сложной системы, ее «узкие места», и выработать обоснованные рекомендации по ее синтезу.
     Главная цель имитационного  моделирования —  выяснить, как повлияют на производительность отдельные изменения  конфигурации системы  или увеличение нагрузки на нее.
     Целью данной курсовой работы является закрепление теоретических основ и практических аспектов имитационного моделирования систем.
     В курсовой работе необходимо выполнить следующие  задания:
     - анализ предметной области;
     - анализ программных средств, которые используются для моделирования систем;
     - разработать программу;
     - провести тестирование;
     - оформить объяснительную записку.
     Программный продукт должен работать под OC Windows 9х/NT.
 

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

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

     Типичная  система массового  обслуживания (СМО) состоит  из буфера для ожидания в очереди конечного или бесконечного размера и одного или нескольких одинаковых обслуживающих устройств, которые будем для краткости называть серверами. Сервер в определенный момент времени может обслуживать только одну заявку и, следовательно, быть в занятом или свободном состоянии. Если в момент поступления новой заявки все серверы заняты, заявка ставится в очередь, если в буфере есть свободные места, и ждет своего выполнения. Когда обслуживание заявки на сервере завершается, одна из заявок, находящихся в очереди, выбирается для обслуживания. Выбор производится в соответствии с некоторой дисциплиной, или расписанием. Элементарная теория очередей рассматривает входные потоки, описываемые последовательностью случайных величин  интервалов времени между прибытиями {А0, А1...}. Эти величины предполагаются независимыми и одинаково распределенными и образуют в пределе случайный процесс, известный как процесс восстановления. Предметом изучения таких процессов является количество переходов из одного состояния в другое, произошедших в течение заданного времени.
     Существует  множество моделей  для расчета производительности систем с очередями в стационарном режиме, при котором первые и вторые моменты характеризующих систему случайных процессов (текущее число заявок в системе, длительности пребывания заявок в очереди и др.) не зависят от времени, то есть отсутствует тренд средних и дисперсий процессов. Модели учитывают предположение об источниках нагрузки, распределение времени обслуживания и применяемую дисциплину.
     СМО относится к динамическим системам. Существование стационарного режима означает, что все переходные процессы в системе завершены, ведет она себя стабильно и показатели измерения производительности зависят только от длительности интервала наблюдения, но не от расположения этого интервала на оси времени.
     1.2. Моделирование работы порта 
 

     В африканском порту танкеры загружаются  сырой нефтью, которую затем морским  путем доставляют по назначению. Мощности порта позволяют загружать на более трех танкеров одновременно. Танкеры, прибывающие в порт через каждые 11 ± 7 ч, относятся к трем различным типам. Относительная частота появления танкеров данного типа и время, требуемое на их погрузку, приведены в таблице 1.1. Относительную частоту следует понимать как вероятность того, что прибывший танкер относится к данному типу.
     Таблица 1.1
     Характеристики  типов танкеров
Тип погрузки Относительная частота Время погрузки, ч
1 0,25 18±2
2 0,55 24±3
3 0,20 36±4
 
     В порту имеется один буксир, услугами которого пользуются все танкеры при причаливании и отчаливании. Причаливание и отчаливание занимает по одному часу, причем, если в услугах буксира нуждаются сразу несколько танкеров, приоритет отдается операции причаливания.
     Судовладелец  предлагает дирекции порта заключить  контракт на перевозку нефти в Великобританию и обеспечить выполнение условий контракта с помощью 5 танкеров особого, четвертого типа, для погрузки которых требуется 21 ± 3 ч. После погрузки танкер отчаливает и следует в Великобританию, там разгружается и затем снова возвращается в африканский порт для погрузки. Время цикла обращения танкера, включая время разгрузки, составляет 240 ± 24 ч.
     Фактором, осложняющим перевозку нефти, являются штормы, которым подвергается порт. Интервал времени между штормами распределен экспоненциально с математическим ожиданием 48 ч, причем шторм продолжается 4 ± 2 ч. Во время шторма буксир не работает.
     Перед заключением контракта руководство  порта решило определить влияние, которое  окажут пять дополнительных танкеров на функционирование порта. Выводы предлагается сделать по результатам имитации работы порта в течение одного года (8760 ч) при условии заключения предлагаемого контракта. Оцениваемые величины — время пребывания в порту танкеров. 
 

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

     За  единицу модельного времени примем 1 мин, чтобы не связывать себя маловероятным предположением, что все события занимают промежутки времени, кратные одному часу. Интервал времени между штормами будем генерировать так: (int)(get_exp(mu)*60), где mu = 1/48 = 0,021. Генерацию равномерного распределения будем использовать для интервалов между прибытиями танкеров, времени погрузки и цикла обращения. 
 

     1.4. Выводы и постановка задачи 
 

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

      РАЗДЕЛ 2 обоснование выбора программных средств 
 

     Для реализации программы моделирования  расписаний был выбран язык программирования С++.
     C++ – универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. C++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, мы можем разделять разрабатываемую программу на легко поддающиеся контролю части. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы.
     Ключевым  понятием C++ является класс. Он обеспечивает скрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций.
     C++ и его стандартные библиотеки  спроектированы так, чтобы обеспечивать  переносимость. Из C++ программ можно  использовать C библиотеки, и с C++ можно использовать большую часть  инструментальных средств, поддерживающих  программирование на C. 
 

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

     Библиотека STL является набором шаблонных классов и функций общего назначения.
     STL является основным компонентом стандартной библиотеки ANSI/ISO для языка программирования С++. Этот компонент был разработан в лаборатории Hewlett-Packard Александром Степановым та Менгом Ли.
     Ядро  стандартной библиотеки шаблонов включает три основных элемента: контейнеры, алгоритмы, итераторы. Они работают вместе один с другим, что помогает получать готовые решения различных заданий по программированию.
     Итераторы обеспечивают доступ к элементам  данных контейнеров. Контейнеры представляют собой структуры или наборы данных, такие, как списки, векторы, очереди, реализованные как шаблоны классов. Алгоритмы, представляющие собой шаблоны функций, оперирующих на данных контейнеров. Например, алгоритм может сортировать объекты, являющиеся элементами вектора или списка. Функции эти не обладают специфическими “знаниями” о типах и структурах, на которых они действуют.
     Вместе  с STL в C++Builder предусмотрены различные дополнительные средства, например, класс комплексных чисел и средства обработки ошибок.
     На  уровне исходного кода программы C++ получаются более мобильными, не привязанными к конкретной системе.
     Таблица 2.1 перечисляет стандартные заголовки STL с краткими описаниями контейнерных классов, которые они содержат.
     Таблица 2.1
     Контейнерные  классы STL
Директива #include Класс контейнера
1 2
<bitset> множества как  битовые наборы
<deque> двусвязные  очереди
<list> списки
<map> карты; это структуры, подобные массиву, но в которых роль "индекса" могут играть не только целые числа, но любые упорядоченные типы
 
Продолжение таблицы 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. События и методы 
 

     Танкеры выполняют в системе роль заявок, поэтому они не имеют моделирующих методов — все события, происходящие с ними, принимаются и обрабатываются объектами-серверами. Для буксира можно выделить следующие события и связанные с ними методы:
    Начало шторма. Метод не имеет параметров.
    Окончание шторма. Метод не имеет параметров.
    Прибытие танкера четвертого типа на причаливание. Метод имеет параметр указатель на прибывший танкер.
    Прибытие танкера одного из первых трех типов на причаливание. Метод не имеет параметров.
    Один из танкеров закончил погрузку и требует отчаливания. Метод имеет параметр — указатель на танкер.
    Окончание отчаливания. Метод не имеет параметров, так как отчаливший танкер доступен через поле данных самого буксира.
    Окончание причаливания. Метод не имеет параметров, так как причаливший танкер доступен через поле данных самого буксира.
     Методы 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 час - длительность  причаливания
                                     //и отчаливания
const static int storm_median=240;  //4 часа - средняя длительность  шторма
const static int storm_offset=120;  //2 часа - максимальное  отклонение
                                     //от среднего для длительности  шторма
// const static float storm_mu=0.021;  //1/48, где 48 часов - средняя
                                     //длительность "бесштормового"
                                     //интервала времени
int to_arrival;                   //время до прибытия танкера  типов 1,2,3
int to_in;                        //время до окончания причаливания
int to_out;                       //время до окончания отчаливания
ListNode<Tanker> *queue_in;       //очередь  на причаливание
ListNode<Tanker> *queue_out;      //очередь на  отчаливание
Tanker *serving;                  //обслуживаемый танкер
int que_inLength;                 //длина очереди на причаливание
int que_outLength;                //длина очереди на отчаливание
int to_sStart;                    //время до начала шторма
int to_sEnd;                      //время до окончания шторма
void *p;                          //указатель на порт
public:
Tug();
void stormStart();                //начало шторма
void stormEnd();                  //окончание шторма
void Arrival_Sea(Tanker4 *t);     //прибытие танкера  четвертого типа
void Arrival_Sea();               //прибытие танкера типов 1,2,3
  void Arrival_coast(Tanker *t);   //танкер требует отчаливания
void Departure();                 //окончание отчаливания
void Arrival();                   //окончание причаливания
void run();                       //диспетчер
void putPort(Port *a);
void choice();                    //выбор танкера для обслуживания
void Print();
};
//Класс  Порт
class Port
{
const static int volume=3;
ListNode<Tanker> *queue;          //очередь  на погрузку
Tanker **serving;                 //загружаемые танкеры
int *to_serve;                    //время до окончания погрузки
int q_length;                     //длина очереди
void *t;                          //указатель на буксир
public:
  Port();
  ~Port();
  void Arrival(Tanker *a);         //прибытие танкера
  void Complete(int i);            //завершение погрузки
  void putTug(Tug *a);
  void Print();
  int FirstAvail();
  int Busy();
  void run();                      //диспетчер
};
     3.3. Реализация интерфейса 
 

     Программа состоит из формы Form1, на которой расположены элементы label в количестве 26, 2 элемента textBox, 1 элемент button. Список элементов и их свойств представлены в таблице 3.1. 
 
 

    Таблица 3.1
    Элементы  и их основные свойства 

Объект Значение поля Text/Caption Описание
1 2 3
Label1 Время моделирования Надпись
Label2 Число танкеров четвертого типа Надпись
Label3 Завершили цикл обслуживания в порту Надпись
Label4 Из них танкеров типов 1,2,3 Надпись
Label5 Из них танкеров 4 типа Надпись
Label6 Средняя длина  очереди на причаливание Надпись
Label7 Средняя длина  очереди на отчаливание Надпись
Label9 Среднее время  пребывания на погрузку Надпись
Label10 Среднее время  пребывания на погрузке для танкеров типов 1,2,3 Надпись
Label11 Среднее время  пребывания на погрузке для танкеров 4 типа Надпись
Label12 Коэффициент загрузки буксира Надпись
Продолжение таблицы 3.1
1 2 3
Label13-22 Не рассчитано Расчетные значения
textBox1 10000 Время моделирования
textBox2 5 число танкеров 4 типа
Button1 Рассчитать Надпись. Нажать для начала расчета
GroupBox Собранные данные Поле с расчетными данными
 
class TForm1 : public TForm
{__published: // IDE-managed Components
        TGroupBox *GroupBox1;
        TLabel *Label1;
        TLabel *Label2;
        TEdit *Edit1;
        TEdit *Edit2;
        TButton *Button1;
        TLabel *Label3;
        TLabel *Label4;
        TLabel *Label5;
        TLabel *Label6;
        TLabel *Label7;
        TLabel *Label9;
        TLabel *Label10;
        TLabel *Label11;
        TLabel *Label12;
        TLabel *Label13;
        TLabel *Label14;
        TLabel *Label15;
        TLabel *Label16;
        TLabel *Label18;
        TLabel *Label19;
        TLabel *Label20;
        TLabel *Label21;
        TLabel *Label22;
        void __fastcall Button1Click(TObject *Sender);
public:  // User declarations
        __fastcall TForm1(TComponent* Owner);};
     3.4. Выводы 
 

     Созданы четыре класса: Tanker, Tanker4, Tug, Port.
     Базовым классом будет класс неименованных  заявок (Tanker), а производным от него — расширенный класс именованных заявок (Tanker4).
     Для Tanker/Tanker4 можно выделить следующие события:
      танкер находится в очереди на причаливание. Штормит;
      танкер находится в очереди на причаливание. Шторма нет;
      танкер причаливает;
      танкер находится в порту в очереди на погрузку;
      танкер грузится в порту;
      танкер находится в очереди на отчаливание. Штормит;
      танкер находится в очереди на отчаливание. Шторма нет;
      танкер отчаливает;
      танкер типа 4 находится в пути;
     Танкеры выполняют в системе роль заявок, поэтому они не имеют моделирующих методов — все события, происходящие с ними, принимаются и обрабатываются объектами-серверами (Tug).
     Для объекта Port событий всего два:
      прибытие очередного танкера;
      завершение погрузки.
     В результате тестирования работы программы было обнаружено, что потенциальным узким местом системы является погрузка в порту, где танкеры проводят все оставшееся время, так как обслуживания танкера буксиром фиксировано и равно 2 ч. При увеличении числа танкеров 4 типа и увеличивается
 

      РАЗДЕЛ 4 руководство программиста 
 

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

     Программа создана для моделирования работы порта и определения влияния использования дополнительных танкеров на его работу. Программа собирает статистические данные по ходу выполнения.
     Программный продукт может быть запущен на выполнение при наличии персонального  компьютера под управлением ОС Windows 9x/NT. 
 

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

     Программный продукт состоит из следующих  файлов:
    List.h — файл шаблоных классов;
    random.h — файл для генерации случайных чисел (экспоненциальный и равномерный закон распределения);
    12-2.h — файл, в котором описываются классы Tanker, Tanker4, Tug, Port;
    Unit1.h – файл с описанием имеющихся элементов на форме;
    Project1.cpp — файл, содержащий функцию WINAPI WinMain;
    Unit1.cpp – файл, кодом обработки нажатия кнопки расчета и запуска программы на выполнение;
    Project1.exe — исполняемый файл.
 

    4.3. Входные и выходные данные 
     

     В качестве входных параметров передаются: время моделирования (в минутах), количество танкеров четвертого типа.
     Выходными данными являются:
    количество танкеров, завершивших цикл погрузки;
    из них танкеров 1-3 типа;
    из них танкеров 4 типа;
    средняя длина очереди на причаливание;
    средняя длина очереди на отчаливание;
    среднее время пребывания на погрузку всех видов танкеров;
    коэффициент загрузки буксира.
 

      Раздел 5 Руководство пользователя 
 

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

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

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

     Программный продукт может быть запущен на выполнение при наличии персонального компьютера под управлением ОС Windows9x/NT.
     Для запуска программы необходимо перейти  в каталог, где она хранится, и запустить файл Project1.exe. В открывшемся окне установить по необходимости время моделирования и необходимое число танкеров четвертого типа, далее нажать кнопку «Рассчитать». Собранные статистические данные отображаются на форме ниже. 

 

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

     Результат выполнения программы выглядит следующим  образом (рис. 5.1). 


 

     Рис. 5.1 — Результат выполнения программы.
 

      выводы 
 

     В ходе выполнения курсовой работы был  выполнен анализ предметной области.
     Было  принято решение выбрать средой разработки программного продукта Borland C++ Builder.
     В ходе выполнения работы был создан программный продукт, который состоит из следующих файлов: list.h, random.h, 12-2.h, Unit1.h, Unit1.cpp.
     Программа собирает статистические данные работы порта по загруженности буксира, среднему времени загрузки и средней  длине очереди танкеров.
     В результате тестирования работы программы было обнаружено, что при отсутствии танкеров четвертого типа неиспользованные ресурсы системы довольно велики. При добавлении пяти танкеров четвертого типа показатели вырастают, но остаются в пределах нормы, перегрузок нигде не возникает.
     Время обслуживания танкера буксиром фиксировано и равно 2 часа, что составляет небольшую долю от общего времени облуживания танкера. Значит, потенциальным узким местом системы является погрузка в порту, где танкеры проводят все оставшееся время.
     Программный продукт функционирует под управлением ОС Windows 9х/NT.
 

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

     
    Труб И.И. Объектно-ориентированное моделирование  на С++: Учебный курс. –СПб.: Питер, 2006. -411с.
    Методичні вказівки до виконання курсової роботи з дисципліни " Імітаційне моделювання для студентів магістратури спеціальності 7.080403 "Програмне забезпечення автоматизованих систем" всіх форм навчання /Укл. канд. техн.. наук., доцент. Табунщик Г.В. Запоріжжя: ГУ "ЗІДМУ", 2007. – 16 с.
    Оформлення дипломних (курсових) робіт: Вимоги і коментарі., – 2-е вид., уточн. – Запоріжжя: ГУ “ЗІДМУ”, 2005. – 36 с.
 

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

     А.1. Файл Unit1.cpp 
 

#include <vcl.h>
#include "12-2.h"
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner) {}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  GroupBox1->Visible=true;
  int i;
  Tanker4 **mas;
  int N= StrToInt (Edit1->Text);
  int M= StrToInt (Edit2->Text);
//Создание  объектов Буксир и Порт
  Port port;
  Tug tug;
//Настройка  их взаимодействия
  port.putTug(&tug);
  tug.putPort(&port);
  mas=new Tanker4 *[M];;
  srand((unsigned)time(0));
//Инициализация  танкеров четвертого типа и  настройка их взаимодействия
//с буксиром
for(i=0;i<M;i++)
{
  mas[i]=new Tanker4(i+1);
  mas[i]->putTug(&tug);
}
//Основной  цикл моделирования
for(total=0L;total<N;total++)
{
  //printf("\n%d",total);
  tug.run();
  port.run();
  for(i=0;i<M;i++)
   mas[i]->run();
}
delete [] mas;
//Вывод  результатов эксперимента
Label13->Caption = IntToStr (completed);
Label14->Caption = IntToStr (completed1);
Label15->Caption = IntToStr (completed2);
Label16->Caption = FloatToStr (q_tugInAve);
Label18->Caption = FloatToStr (q_loadAve);
Label19->Caption = FloatToStr (soj_Ave/60);
Label20->Caption = FloatToStr (soj1_Ave/60);
Label21->Caption = FloatToStr (soj2_Ave/60);
Label22->Caption = FloatToStr (((float)ro_tug)/total);
 entered=0;
completed=0;
completed1=0;
completed2=0;
q_tugInAve=0;
q_tugOutAve=0;
q_loadAve=0;
soj_Ave=0;
soj1_Ave=0;
soj2_Ave=0;
ro_tug=0;
ro_port=0;
} 
 

     А.2. Файл 12-2.h 
 

#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
#include "List.h"
#include "random.h"
#define storm_mu 0.021
float q_tugInAve=0;      //переменная для подсчета средней  длины очереди
                         //на причаливание
float q_tugOutAve=0;     //переменная для подсчета средней  длины очереди
                         //на отчаливание
float q_loadAve=0;       //переменная для подсчета средней длины очереди
                         //на погрузку
float soj_Ave=0;         //переменная для подсчета среднего  времени
                         //пребывания на погрузке
float soj1_Ave=0;        //переменная для подсчета среднего времени
                         //пребывания на погрузке для  танкеров первых
                         //трех типов
float soj2_Ave=0;        //переменная для подсчета среднего  времени
                         //пребывания на погрузке для танкеров
                         //четвертого типа
long int ro_tug=0L;      //переменная для подсчета загрузки  буксира
float ro_port=0;         //переменная для подсчета загрузки  порта
long int entered=0L;     //счетчик общего числа поступлений
long int completed=0L;   //счетчик отчаливших танкеров
long int completed1=0L;  //счетчик отчаливших танкеров  первых трех типов
long int completed2=0L;  //счетчик отчаливших танкеров  четвертого типа
long int total;          //счетчик тактов модельного времени
//базовый  класс
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 час - длительность  причаливания
                                     //и отчаливания
const static int storm_median=240;  //4 часа - средняя длительность  шторма
const static int storm_offset=120;  //2 часа - максимальное  отклонение
                                     //от среднего для длительности  шторма
// const static float storm_mu=0.021;  //1/48, где 48 часов - средняя
                                     //длительность "бесштормового"
                                     //интервала времени
int to_arrival;                   //время до прибытия танкера типов 1,2,3
int to_in;                        //время до окончания причаливания
int to_out;                       //время до окончания отчаливания
ListNode<Tanker> *queue_in;       //очередь  на причаливание
ListNode<Tanker> *queue_out;      //очередь на отчаливание
Tanker *serving;                  //обслуживаемый танкер
int que_inLength;                 //длина очереди на причаливание
int que_outLength;                //длина очереди на отчаливание
int to_sStart;                    //время до начала шторма
int to_sEnd;                      //время до окончания шторма
void *p;                          //указатель на порт
public:
Tug();
void stormStart();                //начало шторма
void stormEnd();                  //окончание шторма
 void Arrival_Sea(Tanker4 *t);     //прибытие танкера четвертого типа
void Arrival_Sea();               //прибытие танкера типов 1,2,3
  void Arrival_coast(Tanker *t);   //танкер требует отчаливания
void Departure();                 //окончание отчаливания
void Arrival();                   //окончание причаливания
void run();                       //диспетчер
void putPort(Port *a);
void choice();                    //выбор танкера для обслуживания
void Print();
};
//Класс  Порт
class Port
{
const static int volume=3;
ListNode<Tanker> *queue;          //очередь  на погрузку
Tanker **serving;                 //загружаемые танкеры
int *to_serve;                    //время до окончания погрузки
int q_length;                     //длина очереди
void *t;                          //указатель на буксир
public:
  Port();
  ~Port();
  void Arrival(Tanker *a);         //прибытие  танкера
  void Complete(int i);            //завершение погрузки
  void putTug(Tug *a);
  void Print();
  int FirstAvail();
  int Busy();
  void run();                      //диспетчер
};
Tanker::Tanker()
{
int r;
id=entered;
minutes=0;
//Разыгрывание  типа танкера
r=rand()%100+1;
if (r>=25) type=1;
else if (r<=55) type=2;
else type=3;
switch(type)
{
  case 1: median=1080; offset=120; break;
  case 2: median=1440; offset=180; break; 
  case 3: median=2160; offset=240; break; 
}
}
void Tanker::Print()
{
  switch(state)
  {
   case 1: printf("Танкер № %ld типа %d находится  в очереди на причаливание. Штормит\n", id, type); break;
   case 2: printf("Танкер № %ld типа %d находится  в очереди на причаливание. Шторма  нет\n", id, type); break;
   case 3: printf("Танкер № %ld типа %d причаливает\n", id, type); break;
   case 4: printf("Танкер № %ld типа %d находится  в порту в очереди на погрузку\n", id, type); break;
   case 5: printf("Танкер № %ld типа %d грузится  в порту\n", id, type); break;
   case 6: printf("Танкер № %ld типа %d находится  в очереди на отчаливание. Штормит\n", id, type); break;
   case 7: printf("Танкер № %ld типа %d находится в очереди на отчаливание. Шторма нет\n", id, type); break;
   case 8: printf("Танкер № %ld типа %d отчаливает\n", id, type); break;
  }
}
//Начальное  состояние танкера четвертого  типа - 9
Tanker4::Tanker4(int i)
{
id=i;
minutes=0;
state=9;
type=4;
to_arrival=get_uniform(median_path, offset_path);
median=1260;
offset=180;
}
void Tanker4::putTug(Tug *a)
{
  t=a;
}
void Tanker4::Print()
{
  switch(state)
  {
   case 1: printf("Танкер № %ld типа %d находится  в очереди на причаливание. Штормит\n", id, type); break;
   case 2: printf("Танкер № %ld типа %d находится  в очереди на причаливание. Шторма  нет\n", id, type); break;
   case 3: printf("Танкер № %ld типа %d причаливает\n", id, type); break;
   case 4: printf("Танкер № %ld типа %d находится в порту в очереди на погрузку\n", id, type); break;
   case 5: printf("Танкер № %ld типа %d грузится  в порту\n", id, type); break;
   case 6: printf("Танкер № %ld типа %d находится  в очереди на отчаливание. Штормит\n", id, type); break;
   case 7: printf("Танкер № %ld типа %d находится в очереди на отчаливание. Шторма нет\n", id, type); break;
   case 8: printf("Танкер № %ld типа %d отчаливает\n", id, type); break;
   case 9: printf("Танкер № %ld типа %d находится  в пути\n", id, type); break;
  }
 }
void Tanker4::run()
{
  if (state==9) to_arrival--;
//Танкер  прибыл из Великобритании и  сообщает об этом буксиру
  if (to_arrival==0) ((Tug*)t)->Arrival_Sea(this);
}
//В начальном  состоянии буксир свободен, очереди  пусты
Tug::Tug()
{
to_arrival=get_uniform(arr_median, arr_offset);
serving=NULL;
to_in=-1;
to_out=-1;
queue_in=NULL;
queue_out=NULL;
que_inLength=0;
que_outLength=0;
to_sStart=(int)(get_exp(storm_mu)*60);
if (to_sStart==0) to_sStart=1;
to_sEnd=-1;
}
void Tug::choice()
{
//Очередь на причаливание не пуста, ей - приоритет
if (queue_in!=NULL)
if (que_inLength>0)
{
и т.д.................


Перейти к полному тексту работы


Скачать работу с онлайн повышением уникальности до 90% по antiplagiat.ru, etxt.ru или advego.ru


Смотреть полный текст работы бесплатно


Смотреть похожие работы


* Примечание. Уникальность работы указана на дату публикации, текущее значение может отличаться от указанного.