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