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

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

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

то образом нивелировать. Сделать это можно двумяспособами: моделировать в течение длительного времени, так что соотношениевремен, проведенных в стационарном и переходном режимах, будет таким большим, что влиянием переходного режима можно пренебречь; в течение некоторого времени моделировать вхолостую и только затем, считая, что стационарный режим уже достигнут, включать режим сбора статистики. Ни один из способов,разумеется, не дает стопроцентной гарантии, поскольку заранее ничего нельзясказать о длительности схождения процесса к стационарному режиму.

Условие чернового прогона в течение одного года с промежуточным сбросомстатистики реализовано в функции 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