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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать файл)

if (to_sEnd>0) return;

choice();

}

void Tug::run()

{

int k;

if (to_sStart>0) to_sStart--;

if (to_sStart==0) stormStart();

if (to_sEnd>0) to_sEnd--;

if (to_sEnd==0) stormEnd();

if (to_arrival>0) to_arrival--;

if (to_arrival==0) Arrival_Sea();

if (to_in>0) to_in--;

if (to_in==0) Arrival();

if (to_out>0) to_out--;

if (to_out==0) Departure();

ListNode<Tanker> *ptr=queue_in;

//Инкремент  времени пребывания для всех  танкеров, которые в данный момент 

//контролирует  буксир

while(ptr!=NULL)

{

  ptr->Data()->minutes++;

  ptr=ptr->Next();

}

ptr=queue_out;

while(ptr!=NULL)

{

  ptr->Data()->minutes++;

  ptr=ptr->Next();

}

if (serving!=NULL) serving->minutes++;

//Запись  статистики - один раз в час

if ((total+1)%60==0)

{

  k=(total+1)/60;

//  fprintf(q_tugIn,"%d\n", que_inLength);

  q_tugInAve=q_tugInAve*(1-1.0/k)+((float)que_inLength)/k;

//  fprintf(q_tugOut,"%d\n", que_outLength);

  q_tugOutAve=q_tugOutAve*(1-1.0/k)+((float)que_outLength)/k;

}

if (serving!=NULL) ro_tug++;

}

void Tug::putPort(Port *a)

{

p=a;

}

void Tug::Print()

{

if (to_sStart==-1)

  printf("Буксир  не работает из-за шторма\n");

else if (to_in>0)

  printf("Буксир  помогает причалить танкеру типа %d\n", serving->type);

else if (to_out>0)

  printf("Буксир  помогает отчалить танкеру типа %d\n", serving->type);

else

  printf("Буксир  простаивает, так как некого  обслуживать\n");

}

//Конструктор  для класса Port

Port::Port()

{

int i;

queue=NULL;

serving=new Tanker *[volume];

to_serve=new int[volume];

for(i=0;i<volume;i++)

{

  serving[i]=NULL;

  to_serve[i]=-1;

}

q_length=0;

}

//Деструктор  для класса Port

Port::~Port()

{

delete[] to_serve;

delete [] serving;

}

void Port::Arrival(Tanker *t)

{

int i;

//Проверяем,  есть ли свободный терминал

i=FirstAvail();

if (i!=-1)   //есть, стразу ставим танкер на  погрузку

{

  serving[i]=t;

  to_serve[i]=get_uniform(t->median, t->offset);

  serving[i]->state=5;

}

else         //нет, ставим танкер в очередь

{

  q_length++;

  ListNode<Tanker> *ptr=new ListNode<Tanker>(t, NULL);

  if (queue==NULL) queue=ptr;

  else  ListAdd<Tanker>(queue, ptr);

  t->state=4;

}

}

void Port::Complete(int i)

{

//Отправляем  загруженный танкер к буксиру

((Tug*)t)->Arrival_coast(serving[i]);

to_serve[i]=-1;

serving[i]=NULL;

if (queue==NULL) return;

//Очередь  не пуста, ставим на освободившийся  терминал новый танкер

  serving[i]=queue->Data();

  to_serve[i]=get_uniform(serving[i]->median, serving[i]->offset);

  serving[i]->state=5;

queue=queue->Next();

q_length--;

}

void Port::run()

{

int k;

//Проверка  завершения обслуживания и инкремент  времени пребывания для всех //танкеров, находящихся под контролем порта

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

{

  if (to_serve[i]>0) { serving[i]->minutes++; to_serve[i]--; }

  if (to_serve[i]==0) Complete(i);

}

ListNode<Tanker> *ptr=queue;

while(ptr!=NULL)

{

  ptr->Data()->minutes++;

  ptr=ptr->Next();

}

//Запись  статистики - 1 раз в час

if ((total+1)%60==0)

{

  k=(total+1)/60;

//  fprintf(q_loading,"%d\n", q_length);

  q_loadAve=q_loadAve*(1-1.0/k)+((float)q_length)/k;

  ro_port=ro_port*(1-1.0/k)+((float)Busy())/(k*volume);

}

}

void Port::Print()

{

printf("В  очереди на погрузку находятся %d танкеров\n", q_length);

printf("Заняты  погрузкой %d терминалов\n", Busy());

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

  printf("%d-й  терминал обслуживает танкер  типа %d\n", i+1, serving[i]->type);

}

int Port::FirstAvail()

{

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

  if (serving[i]==NULL) return(i);

  return(-1);

}

int Port::Busy()   //вычисление текущего количества  занятых терминалов

{

int k=0;

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

  if (serving[i]!=NULL) k++;

  return(k);

}

void Port::putTug(Tug *a)

{

t=a;

} 
 

     А.3. Файл list.h 
 

template <class Type>

class ListNode  {

public:

  ListNode<Type> *next;

  Type *data;

   ListNode(Type *d, ListNode<Type> *n);

  ~ListNode();

  Type *Data();

  ListNode<Type> *Next();

  void  PutNext(ListNode<Type> *n); 

  void Print();

};

template <class Type>

ListNode<Type>::ListNode(Type *d, ListNode<Type> *n) : next(n), data(d) {}

template <class Type>

ListNode<Type>::~ListNode()

{

delete data;

}

template <class Type>

Type *ListNode<Type>::Data()

{

return data;

}

template <class Type>

ListNode<Type> *ListNode<Type>::Next()

{

return next;

}

template <class Type>

void ListNode<Type>::PutNext(ListNode<Type> *n)

{

next=n;

}

template <class Type>

void ListNode<Type>::Print()

{

data->Print();

}

template <class Type>

void ListAdd(ListNode<Type> *head, ListNode<Type> *li)

{

ListNode<Type> *old, *v;

for (v=head; v!=NULL; v=v->Next())

  old=v;

old->PutNext(li);

}

template <class Type>

ListNode<Type> *ListDelete(ListNode<Type> *head, ListNode<Type> *li)

{

int j;

ListNode<Type> *old, *o1;

if (li==head)

{

  o1=head->Next();

  delete li;

  return o1;

}

for (ListNode<Type>* v=head; v!=li; v=v->Next())

  old=v;

o1=li->Next();

old->PutNext(o1);

  delete li;

return head;

}

template <class Type>

void ListPrint(ListNode<Type> *head)

{

for (ListNode<Type>* v=head; v!=NULL; v=v->Next())

    v->Print();

}

template <class Type>

int ListCount(ListNode<Type> *head)

{

int i; i=0;

for (ListNode<Type>* v=head; v!=NULL; v=v->Next())

{

   v->Print();

   i++;

}

return i;

} 
 
 

     А.4. Файл random.h 
 

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

float get_exp(float mu)    //генератор случайных  чисел, распределенных

                           //экспоненциально (см. главу 3)

{

  int r_num; float root, right;

  r_num=rand();                        /*получение случайного целого

                                       /числа*/

  right=((float)r_num)/(RAND_MAX+1);   /*проекция на интервал (0;1)*/

  root=-log(1-right)/mu;               /*вычисление значения обратной

                                       /функции*/

  return(root);

} 

int get_uniform(int a, int b)

{ //Генерация  равномерно распределенной величины a+b

int x, y;

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