Имитационное моделирование системы управления запасами с неудовлетворенным спросом

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

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

клиентов\n", q_length);("Имеется %d единиц товара\n", exist);

}

 

//Моделирование прибытия нового запросаSuperMarket::arrival()

{

//int i; *p=NULL;

//Разыгрываем новый интервал между прибытиями_arrival=(int)(get_exp((float)mu/100));(to_arrival==0) to_arrival=1; ++; //инкремент общего счетчика запросов(exist>0) //товар есть

{-; //декремент количества товара++; //инкремент счетчика сразу удовлетворенных

//запросов

}//товара нет

{(rand()0<percentage) //клиент не стал ждать и ушел

{ ++; //инкремент счетчика потерянных клиентов;

}

//Создаем новый объект класса Client и новый элемент списка=new Client();(p,NULL);

//Очереди нет. Новый элемент становится головой списка(q_length==0) queue=ptr;

//Добавляем новый элемент в хвост спискаListAdd(queue,ptr);_length++; //инкремент длины очереди

};

}

 

//Имитация прибытия заказаSuperMarket::complete()

{mi, i, b, c;_order=-1;+=order;=0;(q_length==0) return;

//Определяем, сколько единиц товара будет продано немедленно (exist<q_length) mi=exist; else mi=q_length;(i=0;i<mi;i++)

{

//Отпускаем товар клиенту, находящемуся в голове списка=queue->Data()->getTime();

//Время ожидания записываем в файл (в днях)(sojourn,"%.2f\n", ((float)b)/24);

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

//моделирования является этот клиент. Учитывается начальная длина очереди.=entered-rejected-satisfied-q_length+q_extra+1;_ave=soj_ave*(1-1.0/c)+(float)b/c; //пересчет среднего времени

//ожидания

//Удаляем элемент из головы спискаNext();ptr;_length--; //декремент длины очереди-; //декремент количества товара

}

}

 

//Имитация проверки состояния запасаSuperMarket::check()

{a;_check=checking*24;

//Вычисление текущего состояния запаса=exist+order-q_length;(a>=level1) return; //заказ делать не нужно

//Заказ делать нужно_order=ordering*24;

//вычисление объема заказа=level2-a;_orders++; //инкремент количества заказов

}

//Метод-диспетчерSuperMarket::run()

{

//int i;

//float a; 0) to_order--;(to_order==0) complete();_check--;(to_check==0) check();

//Инкремент текущего времени пребывания для всех клиентов, ожидающих //исполнения заказа(queue!=NULL)

{=queue;(ptr!=NULL)

{

((ptr->Data())->hours)++;=ptr->Next();

}

}

//Еженедельная запись в файл текущей длины очереди(total%7==0) fprintf(que,"%d\n", q_length);

//Пересчет средней длины очереди_ave=que_ave*(1-1.0/(total+1))+((float)q_length)/(total+1);;

}

 

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

 

#include

#include

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

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

{r_num; float root, right;_num=rand(); /*получение случайного целого

/числа*/=((float)r_num)/(RAND_MAX+1); /*проекция на интервал (0;1)*/=-log(1-right)/mu; /*вычисление значения обратной

/функции*/(root);

}get_uniform(int a, int b)

{ //Генерация равномерно распределенной величины a+bx, y;=rand()%(b+1);=rand()%2;(y==0) return(a-x);(a+x);

}

get_triangle(float A, float B, float C)

{r_num; float root, right;_num=rand(); //получение случайного целого

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

//Константа RAND_MAX=32767 (215-1) определена в cstdlib(right<(C-A)/(B-A)) root=A+sqrt(right*(B-A)*(C-A));root=B-sqrt((1-right)*(B-A)*(B-C));(root);

}get_pareto(float A, float B)

{r_num; float root, right;_num=rand(); /*получение случайного целого числа*/=(float)r_num/RAND_MAX+1; /*проекция на интервал (0;1)*/=A/(pow(1-right, (float)1.0/B)); /*вычисление значения обратной функции*/(root);

}

 

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

 

template //это постоянная заставка

//к класам и функциям

//c парметризированным типомListNode { : *n); //конструктор

~ListNode(); //деструктор*Data(); //метод для чтения данных *Next(); //метод для чтения указателя

//на следующий элементPutNext(ListNode *n); //метод для записи указателя

//на следующий элементPrint(); //печать содержимого элемента списка

}; *n) : next(n), data(d)

{

}::~ListNode()

{data;

}::Data()

{data;

}::Next()

{next;

} *n)

{=n;

}::Print()

{>Print(); //предпологается наличие метода Print() для класса

//имя которого будет подставленно в пользовательском коде

}

//Описание класса-шаблона завершено, далее идут функции-шаблона, работающие

//не с отдельным элементом, а со всеми списком

*li)

//добавление нового элемента li в хвост списка с головой head

{ *old, *v;

//ищем внешний хвост списка(v=head; v!=NULL; v=v->Next())=v;>PutNext(li); //добавляем в след за найденым хвостом новый элемент списка

} *li)

//удаление элемента li из списка с голоыой head

//функция возвращает указатель на голову нового списка

{

//int j; *old, *o1;(li==head) //удаляемый элемент может быть головой списка

//в этом случае голова у списка меняется

{=head->Next();li;o1;

}

//Удаляемый элемент не являеться головой списка. Голова остаеться прежняя(ListNodeNext())

//поиск элемента предшедствующего удаляемому=v;=li->Next();>PutNext(o1);

//предшествующий элеиент теперь видит элемент стоящий в списке вслед

//за удаленнымli;head;

}

//печать всех элементов списка с головой head *head)

{(ListNodePrint(); //подсчет количества элементов в списке с головой head

} *head)

{i; i=0;(ListNodeNext())

{>Print();++;

}i;

}

 

Листинг программы функция main()

 

#include "stdafx.h"

#include "iostream"

#include "4.h"

#define N 52416 // общее время моделирован?/p>