Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2020, 19:30   #1
InvisibleTime
 
Регистрация: 16.11.2019
Сообщений: 9
По умолчанию Нахождение средней продолжительности и количество штормов

Подскажите пожалуйста как отыскать среднюю продолжительность и количество штормов. Скорее всего я то еще тугодум и у меня все никак не выходит найти эти переменные. Не могу отыскать нужный способ.
Код:
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
#include "List.h"
#include "random.h"
FILE *q_tugIn; //файл для сбора статистики о длине очереди
//на причаливание
FILE *q_tugOut; //файл для сбора статистики о длине очереди
//на отчаливание
FILE *q_loading; //файл для сбора статистики о длине очереди
//на погрузку
FILE *storm;
FILE *sojourn; //файл для сбора статистики о времени пребывания
//в порту
double q_tugInAve=0.0; //переменная для подсчета средней длины очереди
//на причаливание
double q_tugOutAve=0.0; //переменная для подсчета средней длины очереди
//на отчаливание
double q_loadAve=0.0; //переменная для подсчета средней длины очереди
//на погрузку
double soj_Ave=0.0; //переменная для подсчета среднего времени
//пребывания на погрузке
double soj1_Ave=0.0; //переменная для подсчета среднего времени
//пребывания на погрузке для танкеров первых
//трех типов
double soj2_Ave=0.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; //счетчик тактов модельного времени
double storm_time=0.0;//для подсчета средней продолжительности шторма
int kol=0L; // для посчета количества штормов
//базовый класс
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 int storm_mu=21; //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);printf("Штормит\n"); 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);printf("Штормит\n"); break;
case 7: printf("Танкер № %ld типа %d находится в очереди на отчаливание. Шторма нет\n", id, type); break;
case 8: printf("Танкер № %ld типа %d отчаливает\n", id, type); break;
}
}
InvisibleTime вне форума Ответить с цитированием
Старый 24.05.2020, 19:31   #2
InvisibleTime
 
Регистрация: 16.11.2019
Сообщений: 9
По умолчанию

Код:
//Начальное состояние танкера четвертого типа - 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); printf("Штормит\n"); 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);printf("Штормит\n"); 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((float)(storm_mu/1000))*60);
if (to_sStart==0) to_sStart=1;
to_sEnd=-1;
}
void Tug::choice(){
//Очередь на причаливание не пуста, ей - приоритет
if (que_inLength>0){
to_in=time_path;
que_inLength--;
serving=queue_in->Data(); //голову очереди - на обслуживание
queue_in=queue_in->Next(); //продвижение очереди
}
//Заявок на причаливание нет, а на отчаливание - есть
else if (que_outLength>0){
to_out=time_path;
que_outLength--;
serving=queue_out->Data();
queue_out=queue_out->Next();
}
return;
}
void Tug::stormStart(){
to_sStart=-1;
to_sEnd=get_uniform(storm_median, storm_offset);
}
void Tug::stormEnd(){
to_sEnd=-1;
to_sStart=(int)(get_exp((float)(storm_mu/1000))*60);
if (to_sStart==0) to_sStart=1;
choice();
}
void Tug::Arrival_Sea() //прибытие танкера типов 1,2,3
{
to_arrival=get_uniform(arr_median, arr_offset);
entered++;
Tanker *ptr=new Tanker(); //создаем новый танкер
//Шторма нет, буксир свободен, танкер сразу идет на причаливание
if ((to_sEnd==-1)&&(serving==NULL)){
serving=ptr;
to_in=time_path;
serving->state=3;
return;
}
//Танкер ставится в очередь
que_inLength++;
ListNode<Tanker> *ptr1=new ListNode<Tanker>(ptr, NULL);
if (queue_in==NULL) queue_in=ptr1;
else ListAdd<Tanker>(queue_in, ptr1);
//Назначение танкеру номера состояния в зависимости от наличия шторма
if (to_sEnd>0) ptr->state=1;
else ptr->state=2;
return;
}
void Tug::Arrival_Sea(Tanker4 *t){
entered++;
t->to_arrival=-1;
if ((to_sEnd==-1)&&(serving==NULL)){
serving=t;
to_in=time_path;
serving->state=3;
return;
}
que_inLength++;
ListNode<Tanker> *ptr1=new ListNode<Tanker>(t, NULL);
if (queue_in==NULL) queue_in=ptr1;
else ListAdd<Tanker>(queue_in, ptr1);
if (to_sEnd>0) t->state=1;
else t->state=2;
return;
}
void Tug::Arrival_coast(Tanker *t) //прибытие танкера на отчаливание
{
if ((to_sEnd==-1)&&(serving==NULL)) //шторма нет, буксир свободен
{
serving=t;
to_out=time_path;
serving->state=8;
return;
}
que_outLength++;
ListNode<Tanker> *ptr1=new ListNode<Tanker>(t, NULL);
if (queue_out==NULL) queue_out=ptr1;
else ListAdd<Tanker>(queue_out, ptr1);
if (to_sEnd>0) t->state=6;
else t->state=7;
return;
}
void Tug::Departure(){
to_out=-1;
//Фиксация времени пребывания в порту отбывающего танкера
fprintf(sojourn,"%.3f\n", (float)serving->minutes/60);
completed++;
//Пересчет среднего времени пребывания
soj_Ave=soj_Ave*(1-1.0/completed)+(float)(serving->minutes)/completed;
//Отбывает танкер типов 1,2,3
if (serving->type<4){
completed1++;
soj1_Ave=soj1_Ave*(1-1.0/completed1)+(float)(serving->minutes)/completed1;
//Объект для неименованной заявки удаляется из системы
delete serving;
}
else //отбывает танкер четвертого типа
{
completed2++;
soj2_Ave=soj2_Ave*(1-1.0/completed2)+(float)(serving->minutes)/completed2;
serving->state=9;
//Отправляем танкер четвертого типа в Великобританию
((Tanker4*)serving)->to_arrival=get_uniform(((Tanker4*)serving)->median_path, ((Tanker4*)serving)->offset_path);
//Сброс времени пребывания в порту
serving->minutes=0;
}
serving=NULL;
//Пока отчаливали, начался шторм. Буксир отдыхает
if (to_sEnd>0) return;
//Шторма нет. Выбираем следующий танкер на обслуживание
choice();
}
}
InvisibleTime вне форума Ответить с цитированием
Старый 24.05.2020, 19:31   #3
InvisibleTime
 
Регистрация: 16.11.2019
Сообщений: 9
По умолчанию

Код:
void Tug::Arrival() {
to_in=-1;
//Сообщаем в порт о прибытии танкера на погрузку
((Port*)p)->Arrival(serving);
serving=NULL;
//Пока причаливали, начался шторм. Буксир отдыхает
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;
}
InvisibleTime вне форума Ответить с цитированием
Старый 24.05.2020, 23:03   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код лучше бы форматировать, читать невозможно.
Код:
void Tug::stormStart()
{
    to_sStart = -1;
    to_sEnd = get_uniform(storm_median, storm_offset);
    kol++;
    storm_time = storm_time * (1 - 1.0 / kol) + (float)(to_sEnd) / kol;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.05.2020, 09:20   #5
InvisibleTime
 
Регистрация: 16.11.2019
Сообщений: 9
По умолчанию

BDA, Огромнейшее Вам спасибо. Вы правда очень сильно помогли.
InvisibleTime вне форума Ответить с цитированием
Старый 25.05.2020, 10:06   #6
InvisibleTime
 
Регистрация: 16.11.2019
Сообщений: 9
По умолчанию

BDA, Простите за такую наглость с моей стороны, но если не сложно, могли бы Вы подсказать, что нужно прописать в основном коде. Я в цикл добавляю, но естественно, что штормы из-за этого становятся главными в программе, а без цикла соответственно учитывается только один шторм.
Код:
int main(){
	//HWND hWnd = GetConsoleWindow();//берем текущ консоль, (скрывает консоль (работает только под windows))
//ShowWindow(hWnd, SW_HIDE);//скрывает консоль
int i;
Tanker4 **mas;
//Создание объектов Буксир и Порт
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++){
tug.stormStart();
tug.run();
port.run();
for(i=0;i<M;i++)
mas[i]->run();
}
delete [] mas;
InvisibleTime вне форума Ответить с цитированием
Старый 25.05.2020, 20:10   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Честно говоря, я до конца не понял архитектуру вашей программы. По-моему, не нужно прописывать tug.stormStart() в основном цикле. Она будет вызываться в Tug::run(), когда нужно. Есть куча переменных-счетчиков времени разных событий, но я не вижу цикл, который бы был "дергал" run для всех объектов на каждый тик глобального времени.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.05.2020, 20:50   #8
InvisibleTime
 
Регистрация: 16.11.2019
Сообщений: 9
По умолчанию

BDA, Я вот сам не понимаю, в основном коде по идее при помощи tug.run и должен бы запуститься метод stormStart, но как-то все переменные все-равно имеют начальное значение. А разве for(total=0L;total<N;total++){}, N=300000 это не основной цикл, моделирующий сдвиг переменных во времени.
InvisibleTime вне форума Ответить с цитированием
Старый 25.05.2020, 21:23   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Да, это действительно основный цикл времени, что-то я не узнал его. Тогда остается только начать отлаживать программу по шагам, чтобы понять, где логика работы сломалась.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.05.2020, 22:18   #10
InvisibleTime
 
Регистрация: 16.11.2019
Сообщений: 9
По умолчанию

BDA, К несчастью, мне все-таки не удается отыскать проблему, очень жаль
InvisibleTime вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PascalABC.net СТЕК Найти квартиру с минимальной средней площадью комнаты. Средняя площадь комнаты определяется как (общая площадь квартиры)/(количество комнат). Ymti Помощь студентам 2 24.05.2018 22:34
PowerShellIse нахождение количество чисел в файле Gasssss Помощь студентам 0 08.11.2016 18:20
Нахождение общей и средней цены в базе данный, Turbo Pascal Mr_John_Smith Помощь студентам 0 15.06.2011 10:30
Вывод продолжительности трека KatCH Общие вопросы Delphi 1 07.04.2010 17:57
Формула продолжительности года на планете Земля, Венера Rusl92 Паскаль, Turbo Pascal, PascalABC.NET 1 20.01.2009 01:30