Моделирование работы порта
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
нет\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