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

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

нет\n", id, type); break;3: printf("Танкер № %ld типа %d причаливает\n", id, type); break;4: printf("Танкер № %ld типа %d находится в порту в очереди на погрузку\n", id, type); break;5: printf("Танкер № %ld типа %d грузится в порту\n", id, type); break;6: printf("Танкер № %ld типа %d находится в очереди на отчаливание. Штормит\n", id, type); break;7: printf("Танкер № %ld типа %d находится в очереди на отчаливание. Шторма нет\n", id, type); break;8: printf("Танкер № %ld типа %d отчаливает\n", id, type); break;9: printf("Танкер № %ld типа %d находится в пути\n", id, type); break;

}

}Tanker4::run()

{(state==9) to_arrival--;

//Танкер прибыл из Великобритании и сообщает об этом буксиру(to_arrival==0) ((Tug*)t)->Arrival_Sea(this);

}

//В начальном состоянии буксир свободен, очереди пусты::Tug(){_arrival=get_uniform(arr_median, arr_offset);=NULL;_in=-1;_out=-1;_in=NULL;_out=NULL;_inLength=0;_outLength=0;_sStart=(int)(get_exp((float)(storm_mu/1000))*60);(to_sStart==0) to_sStart=1;_sEnd=-1;

}Tug::choice(){

//Очередь на причаливание не пуста, ей - приоритет(que_inLength>0){_in=time_path;_inLength--;=queue_in->Data(); //голову очереди - на обслуживание_in=queue_in->Next(); //продвижение очереди

}

//Заявок на причаливание нет, а на отчаливание - естьif (que_outLength>0){_out=time_path;_outLength--;=queue_out->Data();_out=queue_out->Next();

};

}

Tug::stormStart(){_sStart=-1;_sEnd=get_uniform(storm_median, storm_offset);

}

Tug::stormEnd(){_sEnd=-1;_sStart=(int)(get_exp((float)(storm_mu/1000))*60);(to_sStart==0) to_sStart=1;();

}Tug::Arrival_Sea() //прибытие танкера типов 1,2,3

{_arrival=get_uniform(arr_median, arr_offset);++;*ptr=new Tanker(); //создаем новый танкер

//Шторма нет, буксир свободен, танкер сразу идет на причаливание((to_sEnd==-1)&&(serving==NULL)){=ptr;_in=time_path;>state=3;;

}

//Танкер ставится в очередь_inLength++;(queue_in, ptr1);

//Назначение танкеру номера состояния в зависимости от наличия шторма(to_sEnd>0) ptr->state=1;ptr->state=2;;

}Tug::Arrival_Sea(Tanker4 *t){++;>to_arrival=-1;((to_sEnd==-1)&&(serving==NULL)){=t;_in=time_path;>state=3;;

}_inLength++;state=2;;

}Tug::Arrival_coast(Tanker *t) //прибытие танкера на отчаливание

{((to_sEnd==-1)&&(serving==NULL)) //шторма нет, буксир свободен

{=t;_out=time_path;>state=8;;

}_outLength++;state=7;;

}Tug::Departure(){_out=-1;

//Фиксация времени пребывания в порту отбывающего танкера(sojourn,"%.3f\n", (float)serving->minutes/60);++;

//Пересчет среднего времени пребывания_Ave=soj_Ave*(1-1.0/completed)+(float)(serving->minutes)/completed;

//Отбывает танкер типов 1,2,3(serving->typeminutes)/completed1;

//Объект для неименованной заявки удаляется из системыserving;

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

{++;_Ave=soj2_Ave*(1-1.0/completed2)+(float)(serving->minutes)/completed2;>state=9;

//Отправляем танкер четвертого типа в Великобританию

((Tanker4*)serving)->to_arrival=get_uniform(((Tanker4*)serving)->median_path, ((Tanker4*)serving)->offset_path);

//Сброс времени пребывания в порту>minutes=0;

}=NULL;

//Пока отчаливали, начался шторм. Буксир отдыхает(to_sEnd>0) return;

//Шторма нет. Выбираем следующий танкер на обслуживание();

}Tug::Arrival() {_in=-1;

//Сообщаем в порт о прибытии танкера на погрузку

((Port*)p)->Arrival(serving);=NULL;

//Пока причаливали, начался шторм. Буксир отдыхает(to_sEnd>0) return;();

}Tug::run(){k;(to_sStart>0) to_sStart--;(to_sStart==0) stormStart();(to_sEnd>0) to_sEnd--;(to_sEnd==0) stormEnd();(to_arrival>0) to_arrival--;(to_arrival==0) Arrival_Sea();(to_in>0) to_in--;(to_in==0) Arrival();(to_out>0) to_out--;(to_out==0) Departure(); *ptr=queue_in;

//Инкремент времени пребывания для всех танкеров, которые в данный момент //контролирует буксир(ptr!=NULL) {>Data()->minutes++;=ptr->Next();

}=queue_out;(ptr!=NULL){>Data()->minutes++;=ptr->Next();

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

//Запись статистики - один раз в час((total+1)==0){=(total+1)/60;(q_tugIn,"%d\n", que_inLength);_tugInAve=q_tugInAve*(1-1.0/k)+((float)que_inLength)/k;(q_tugOut,"%d\n", que_outLength);_tugOutAve=q_tugOutAve*(1-1.0/k)+((float)que_outLength)/k;

}(serving!=NULL) ro_tug++;

}Tug::putPort(Port *a){=a;

}

Tug::Print(){(to_sStart==-1)("Буксир не работает из-за шторма\n");if (to_in>0)("Буксир помогает причалить танкеру типа %d\n", serving->type);if (to_out>0)("Буксир помогает отчалить танкеру типа %d\n", serving->type);("Буксир простаивает, так как некого обслуживать\n");

}

//Конструктор для класса Port::Port(){i;=NULL;=new Tanker *[volume];_serve=new int[volume];(i=0;i<volume;i++) {[i]=NULL;_serve[i]=-1;

}_length=0;

}

//Деструктор для класса Port::~Port(){[] to_serve;[] serving;

}

Port::Arrival(Tanker *t){i;

//Проверяем, есть ли свободный терминал=FirstAvail();(i!=-1) //есть, стразу ставим танкер на погрузку

{[i]=t;_serve[i]=get_uniform(t->median, t->offset);[i]->state=5;

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

{_length++;state=4;

}

}

Port::Complete(int i){

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

((Tug*)t)->Arrival_coast(serving[i]);_serve[i]=-1;[i]=NULL;(queue==NULL) return;

//Очередь не пуста, ставим на освободившийся терминал новый танкер[i]=queue->Data();_serve[i]=get_uniform(serving[i]->median, serving[i]->offset);[i]->state=5;=queue->Next();_length--;

}

Port::run(){k;

//Проверка завершения обслуживания и инкремент времени пребывания для всех //танкеров, находящихся под контролем порта(int i=0;iminutes++; to_serve[i]--; }(to_serve[i]==0) Complete(i);

}Next();

}

//Запись статистики - 1 раз в час((total+1)==0){=(total+1)/60;(q_loading,"%d\n", q_length);_loadAve=q_loadAve*(1-1.0/k)+((float)q_length)/k;_port=ro_port*(1-1.0/k)+((float)Busy())/(k*volume);

}

}

Port::Print(){("В очереди на погрузку находятся %d танкеров\n", q_length);("Заняты погрузкой %d терминалов\n", Busy());(int i=0;itype);

}

Port::FirstAvail(){(int i=0;i<volume;i++)(serving[i]==NULL) return(i);(-1);

}

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

{k=0;(int i=0;i<volume;i++)(serving[i]!=NULL) k++;(k);

}

Port::putTug(Tug *a){=a;

}

Листинг программы файл random.h

 

#include

#include

#includeget_exp(float mu) {

//генератор случайных чисел, распределенных

//экспоненциальноr_nu