SIMPAS3 (Симулятор), страница 2
Описание файла
Файл "SIMPAS3" внутри архива находится в следующих папках: Симулятор, SIMPAS. Текстовый-файл из архива "Симулятор", который расположен в категории "". Всё это находится в предмете "военная кафедра" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр 2 страницы текстового-файла онлайн
Для создания в памяти данных здесь используется вспомогатель-
ная переменная addr - адрес данных, addr^ - обращение к содержи-
мому данных.
Программа обработки события service - требование обслужено:
service:if have(failure) > 0 then {Если в очереди что-то есть}
begin {то ищем в управляющем списке}
route:=node; {начиная с головы,}
a:=nil; z:=0; {присвоив начальный адрес и время,}
repeat route:=route^.prev; {в сторону уменьш-я времен.}
if route^.numb=failure then {Если это событие-очередь}
if route^.addr^ > z then {и время поступления туда}
{более позднее, чем отслеживаемое в z, тогда}
begin a:=route; z:=route^.addr^ end {запоминаем}
{ адрес события и время его поступления в очередь}
until route=node; {пока не закончится список.}
addr:=cancel(a); {Уничтожим событие в списке и}
dispose(addr); {его данные.}
prepare(service,negexp(mju),nil) {Подготовим событие}
{обслуживания требования.}
end;
.
6
В начале поиска вспомогательной переменной route присваивает-
ся адрес головы списка, а затем, при поиске нужного элемента
списка этот адрес продвигается: route:=route^.prev . Для прохода
по списку выбрано движение в сторону уменьшения времен, но это не
обязательно, так как проверяется весь список. В проверке исполь-
зована конструкция if (..) then if (..) then .. поскольку, в дан-
ном случае нельзя применить сложную логическую проверку типа:
if (..)and(..) then .. , из-за того, что данные можно анализиро-
вать только тогда, когда они существуют.
После прохода по списку (до головы) в a обязательно содержит-
ся адрес того события, которое относится к очереди и имеет макси-
мальное время в своих данных. С помощью оператора cancel данное
событие из списка удаляется, а в addr передается ссылка на дан-
ные, которые тоже удаляются из памяти оператором dispose.
Затем, поскольку требование из системы не исчезло, а было
взято на обслуживание освободившимся каналом, мы формируем собы-
тие обслуживания.
Программа обработки события failure - выход без обслуживания:
failure:dispose(actaddr); {Уничтожим данные этого события}
Окончание программы имеет вид:
writeln('============ Результаты моделирования =============');
writeln('Вероятность обслуживания каналами =',
done(service) /(done(service)+done(failure)):8:3);
writeln('Вероятность прохождения очереди =',
prep(failure) /(done(service)+done(failure)):8:3);
writeln('Среднее число занятых каналов =',
s/repeater/done(demand):8:3);
end.
Оператор done возвращает значение соответствующего счетчика
статистической информации поделенное на количество проведенных
реализаций (усредненное), поэтому применять их следует после
окончания моделирования. В связи с этим же при подсчете среднего
числа занятых каналов необходимо ввести деление на repeater на-
копленного значения в s.
.
7
2Вопрос 2. Пример использования pss для моделирования
2системы массового обслуживания с ограничением очереди
2по времени ожидания и по длине.
Данную задачу предлагается решить на занятии самостоятельно,
например в виде контрольной работы. Фактически требуется только
написать программу деятельности отработки события поступления в
систему требования. Логика программы изменится в плане необходи-
мости проведения еще одной проверки перед формированием события
постановки в очередь. Теперь, если все каналы заняты, нужно убе-
диться, что в очереди еще есть свободное место. Для этой проверки
можно использовать оператор have. Для хранения максимального ко-
личества заявок в очереди объявим переменную r.
demand:begin s:=s+have(service);{Суммируем количества требований}
{находящихся на обслуживании, то}
{есть количество занятых каналов}
if have(service) < n {Если заняты не все каналы,}
then prepare(service,negexp(mju),nil) {тогда ставим}
{требование на обработку}
else {В противном случае}
if have(failure) < r then {если очередь не заполнена то}
begin new(addr); {динамически создаем данные,}
addr^ := acttime; {помещаем в них текущее время,}
prepare(failure,negexp(nju),addr) {ставим в очередь}
end
end;
При выводе результата следует учесть те заявки, которые не
попали ни на обслуживание, ни в очередь:
writeln('Вероятность обслуживания каналами =',
done(service) / done(demand):8:3);
writeln('Вероятность прохождения очереди =',
prep(failure) / done(demand):8:3);
Для усложнения задания можно потребовать в качестве резуль-
тата вывести вероятность того, что очередь занята:
writeln('Вероятность занятости очереди =',
(1 - ( prep(failure) + prep(service) ) / done(demand)):8:3);
Методическую разработку составил п/п-к Липовенко А.Г. Янв.1994 г.