Имитационное моделирование системы управления запасами с неудовлетворенным спросом
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
то образом нивелировать. Сделать это можно двумяспособами: моделировать в течение длительного времени, так что соотношениевремен, проведенных в стационарном и переходном режимах, будет таким большим, что влиянием переходного режима можно пренебречь; в течение некоторого времени моделировать вхолостую и только затем, считая, что стационарный режим уже достигнут, включать режим сбора статистики. Ни один из способов,разумеется, не дает стопроцентной гарантии, поскольку заранее ничего нельзясказать о длительности схождения процесса к стационарному режиму.
Условие чернового прогона в течение одного года с промежуточным сбросомстатистики реализовано в функции main. Здесь важно учестьследующее принципиальное обстоятельство. После сброса статистики возобновление моделирования происходит уже не с того состояния объекта, с которогооно начиналось. Поэтому очень важно, чтобы корректность работы методов независела от начального состояния объекта. Чтобы проиллюстрировать этумысль, мы специально не стали вводить в число глобальных стачистических переменных счетчик числа заявок, покидающих очередь, который необходим дляподсчета среднего времени ожидания. Опасность подстерегает нас в случае, еслизначение этого счетчика подсчитывать косвенно:
entered-rejected-satisfied-q_length+l.
где entered - счетчик всех запросов;
rejected - счетчик потерянных запросов; satisfied - счетчик немедленно обслуженных запросов;
q_length - текущая длина очереди.
Казалось бы, все логично: после всех вычитаний остаются только тезаявки, которые побывали в очереди и уже покинули ее. Здесь необходимо, од-нако, соблюдение одного условия: в момент начала сбора статистики очередь должна быть пуста. Иначе мы получим абсурдный результат в виде отрицатель-ного значения счетчика (например, в начальный момент времени -q_length), чтоприведет к некорректному подсчету среднего времени ожидания. Это затрудне-ние преодолено следующим образом. Для класса SuperMarket вводится дополни-тельное поле данных q_extra, которое инициализируется текущей длиной очередив момент завершения чернового прогона. Тогда в методе Supertterket: :complete(),имитирующем поступление заказа и удовлетворение за счет этого заявок, ожи-дающих в очереди, порядковый номер удовлетворенной заявки в выходном по-токе можно рассчитать по формуле:
c=entered-rejected-satisfied-q_length*q_extra+l
Величина 1/с затем используется в качестве усредняющего множителя для рас-чета среднего времени пребывания заявки в системе.
5. Реализация программы
Для моделирования системы управления запасами (с неудолетворенным запросом) был выбран язык программирования C++ и написана программа на этом языке, позволяющая в полной мере отразить функционирование системы.
Листинг программы файл 1.h. Описание протоколов классов
#include
#include
#include
#includenamespace std;
#include "random.h"
#include "List.h" *sojourn; //файл для сбора статистики о времени ожидания
//товара*que; //файл для сбора статистики о длине очереди;
//пополняется один раз в неделюint entered=0L; //счетчик общего числа заявок на товарint rejected=0L; //счетчик числа заявок, сразу покинувших системуint satisfied=0L; //счетчик числа заявок, немедленно удовлетворенныхnum_orders=0; //счетчик числа сделанных заказовsoj_ave=0; //переменная для подсчета среднего времени ожиданияque_ave=0; //переменная для подсчета средней длины очередиint total; //счетчик тактов модельного времени (количество
//часов)
//Протокол класса Client Client
{int id; //уникальный идентификатор клиентаhours; //время, проведенное клиентом в системе:class SuperMarket;() //метод-конструктор
{
//Вычисляем, какая это по счету заявка, поставленная в очередь,
//от момента начала моделирования, и назначаем ей идентификатор=entered-rejected-satisfied+1; =0;
}Print();int getId();getTime();
};
//Вывод содержимого объектаClient::Print()
{
//168 - количество часов в неделе ("id=%ld\n ждет исполнения заказа %d недель\n", id, hours/168);
}
//Чтение идентификатора заявкиint Client::getId()
{(id);
}
//Чтение проведенного в системе времениClient::getTime()
{(hours);
}
//Протокол класса СупермаркетSuperMarket
{to_arrival; //время до прибытия следующей заявкиto_order; //время до исполнения заказаorder; //объем ожидаемого заказаto_check; //время до следующей проверкиq_length; //текущая длина очередиexist; //текущее количество товара *queue; //очередь ожидающих заявок
//Описание неизменяемых полей данныхstatic int mu=3; static int checking=28; static int ordering=21; static int level1=18; static int level2=72; static int percentage=80;:(int i);run();arrival(); complete(); check();Print();getLength();q_extra; //переменная для хранения начальной длины очереди
};
//Метод-конструктор. Параметр - исходное количество товара::SuperMarket(int i)
{_length=0;_extra=0;=NULL;_arrival=(int)(get_exp((float)mu/100));
//"Насильственно" устанавливаем экспоненциальную случайную величину
//в единицу, если после округления до целого она обратилась в ноль.
//Вероятность такой ситуации тем меньше, чем с большим коэффициентом
//промасштабировано время. В данном случае она равна
//1-exp(-0.03 * 0.5) = 0,015.(to_arrival==0) to_arrival=1;_order=-1;=0;=i;
//Время до ближайшей проверки устанавливается случайным образом_check=(rand()%checking+1)*24;
}
SuperMarket::getLength()
{(q_length);
}SuperMarket::Print()
{("Следующая заявка поступит через %d часов\n", to_arrival); (to_order>0) {("Заказ прибудет через %d дней, он составляет %d единиц товара\n", to_order/24, order);
}("Заказа нет\n"); ("Следующая проверка запасов состоится через %d дней\n", to_check/24);("Ждут удовлетворения запроса %d