Курсовая. Моделирование расписания.участок дороги

Сдавался/использовалсяВолгоград, 2005 Руководитель: А.А. Теткин
Загрузить архив:
Файл: Моделирование расписания.участок дороги.doc.zip (219kb [zip], Скачиваний: 2) скачать

ФГОУ СПО «Волгоградский технологический коледж»

«Проект защитил

с оценкой »

А.И. Сухинин

30.05.05

Моделирование расписаний: участок дороги с односторонним движением

Курсовой проект

КП 11. 230105. 51. 0255 ПЗ

Разработчик А.И. Сухинин

30.05.05

Рук.проекта А.А. Теткин

30.05.05

Содержание

1. Введение………………………………………………………………………3

2. Моделирование систем массового обслуживания…………………………5

2.1 Структура и параметры эффективности и качества функционирования СМО………………………………………………………………………………5

2.2 Классификация СМО и их основные элементы………………...…………6

2.3 Процесс имитационного моделирования…………………………………12

3. Описание системы……………………………………………….…………..15

3.1Модельное время..………………………………………………….………16

3.2 Классы и объекты………………………………………………….……….16

3.3 События и методы………………………………………………….………17

4. Программная реализация алгоритма………………………………….……18

5. Оптимизация…………………………………………………………………27

5.1 Метод покоординатного спуска…………………………………………...29

5.2 Оптимизация программного кода………………………………...……….30

6. Анализ результатов работы программы……………………………........…36

7. Заключение……………………………………………………………..39

8. Список использованной литературы…………………………………….…40

ЕСЛИ НУЖНА ПРОГРАММА НА С++ ОБРАЩАЙТЕСЬ: saneek93@mail.ru

Оформление и правка возможна

1. Введение

Во многих областях практической деятельности человека мы сталкиваемся с необходимостью пребывания в состоянии ожидания. Подобные ситуации возникают в очередях в билетных кассах, в крупных аэропортах, при ожидании обслуживающим персоналом самолетов разрешения на взлет или посадку, на телефонных станциях в ожидании освобождения линии абонента, в ремонтных цехах в ожидании ремонта станков и оборудования, на складах снабженческо-сбытовых организаций в ожидании разгрузки или погрузки транспортных средств. Во всех перечисленных случаях имеем дело с массовостью и обслуживанием. Изучением таких ситуаций занимается теория массового обслуживания.

В теории систем массового обслуживания (в дальнейшем просто – CMО) обслуживаемый объект называют требованием. В общем случае под требованием обычно понимают запрос на удовлетворение некоторой потребности, например, обслуживание автомобиля на заправочной станции, разговор с абонентом, посадка самолета, покупка билета, получение материалов на складе и т.д

На первичное развитие теории массового обслуживания оказали особое влияние работы датского ученого А.К. Эрланга (1878-1929).

Теория массового обслуживания – область прикладной математики, занимающаяся анализом процессов в системах производства, обслуживания, управления, в которых однородные события повторяются многократно, например, на предприятиях бытового обслуживания; в системах приема, переработки и передачи информации; автоматических линиях производства и др.

Задача теории массового обслуживания – установить зависимость результирующих показателей работы системы массового обслуживания (вероятности того, что заявка будет обслужена; математического ожидания числа обслуженных заявок и т.д.) от входных показателей (количества каналов в системе, параметров входящего потока заявок и т.д.). Результирующими показателями или интересующими нас характеристиками СМО являются – показатели эффективности СМО, которые описывают способна ли данная система справляться с потоком заявок.

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

Основной задачей теории СМО является изучение режима функционирования обслуживающей системы и исследование явлений, возникающих в процессе обслуживания. Так, одной из характеристик обслуживающей системы является время пребывания требования в очереди. Очевидно, что это время можно сократить за счет увеличения количества обслуживающих устройств. Однако каждое дополнительное устройство требует определенных материальных затрат, при этом увеличивается время бездействия обслуживающего устройства из-за отсутствия требований на обслуживание, что также является негативным явлением. Следовательно, в теории СМО возникают задачи оптимизации: каким образом достичь определенного уровня обслуживания (максимального сокращения очереди или потерь требований) при минимальных затратах, связанных с простоем обслуживающих устройств.

Имитационное моделирование реализуются программно с использованием различных языков, как универсальных - БЕЙСИК, РАСКАЛЬ, С, С++ и т.д., так и специализированных, предназначенных для построения имитационных моделей - СИМСКРИПТ, СТАМ/КЛАСС, GPSS, SLAM, Pilgrim и др.

Целью данной курсовой работы является разработка имитационной модели участка дороги с односторонним движением. Основой для разработки модели в данной курсовой работе является метод имитационного моделирования. Так же курсовая работа предполагает создание программы на языке C++, обеспечивающей ввод исходной информации, ее обработку, реализацию алгоритма имитации процесса и выдачу необходимой информации.

2. Моделирование систем массового обслуживания

2.1 Структура и параметры эффективности и качества функционирования СМО

Многие экономические задачи связаны с системами массового обслуживания, т.е. такими системами, в которых, с одной стороны, возникают массовые запросы (требования) на выполнение каких-либо услуг, с другой – происходит удовлетворение этих запросов. СМО включает в себя следующие элементы: источник требований, входящий поток требований, очередь, обслуживающие устройства (каналы обслуживания), выходящий поток требований. Исследованием таких систем занимается теория массового обслуживания.

Средства, обслуживающие требования, называютсяобслуживающими устройствами или каналами обслуживания. Например, к ним относятся заправочные устройства на АЗС, каналы телефонной связи, посадочные полосы, мастера-ремонтники, билетные кассиры, погрузочно-разгрузочные точки на базах и складах.

Методами теории массового обслуживания могут быть решены многие задачи исследования процессов, происходящих в экономике. Так, в организации торговли эти методы позволяют определить оптимальное количество торговых точек данного профиля, численность продавцов, частоту завоза товаров и другие параметры. Другим характерным примером систем массового обслуживания могут служить заправочные станции, и задачи теории массового обслуживания в данном случае сводятся к тому, чтобы установить оптимальное соотношение между числом поступающих на заправочную станцию требований на обслуживание и числом обслуживающих устройств, при котором суммарные расходы на обслуживания и убытки от простоя были бы минимальными. Теория массового обслуживания может найти применение и при расчете площади складских помещений, при этом складская площадь рассматривается как обслуживающее устройство, а прибытие транспортных средств под выгрузку – как требование. Модели теории массового обслуживания применяются также при решении ряда задач организации и нормирования труда, других социально-экономических проблем.

Каждая СМО включает в свою структуру некоторое число обслуживающих устройств, называемых каналами обслуживания (к их числу можно отнести лиц, выполняющих те или иные операции, - кассиров, операторов, менеджеров, и т.п.), обслуживающих некоторый поток заявок (требований), поступающих на ее вход в случайные моменты времени. Обслуживание заявок происходит за неизвестное, обычно случайное время и зависит от множества самых разнообразных факторов. После обслуживания заявки канал освобождается и готов к приему следующей заявки. Случайный характер потока заявок и времени их обслуживания приводит к неравномерности загрузки СМО - перегрузке с образованием очередей заявок или недогрузке - с простаиванием ее каналов. Случайность характера потока заявок и длительности их обслуживания порождает в СМО случайный процесс, для изучения которого необходимы построение и анализ его математической модели. Изучение функционирования СМО упрощается, если случайный процесс является марковским (процессом без последействия, или без памяти), когда работа СМО легко описывается с помощью конечных систем обыкновенных линейных дифференциальных уравнений первого порядка, а в предельном режиме (при достаточно длительном функционировании СМО) посредством конечных систем линейных алгебраических уравнений. В итоге показатели эффективности функционирования СМО выражаются через параметры СМО, потока заявок и дисциплины.

Из теории известно, чтобы случайный процесс являлся Марковским, необходимо и достаточно, чтобы все потоки событий (потоки заявок, потоки обслуживаний заявок и др.), под воздействием которых происходят переходы системы из состояния в состояние, являлись пуассоновским, т.е. обладали свойствами последствия (для любых двух непересекающихся промежутков времени число событий, наступающих за один из них, не зависит от числа событий, наступающих за другой) и ординарности (вероятность наступления за элементарным, или малый, промежуток времени более одного события пренебрежимо мала по сравнению с вероятностью наступления за этот промежуток времени одного события). Для простейшего пуассоновского потока случайная величина Т (промежуток времени между двумя соседними событиями) распределена по показательному закону, представляя собой плотность ее распределения или дифференциальную функцию распределения.

Если же в СМО характер потоков отличен от пуассоновского, то ее характеристики эффективности можно определить приближенно с помощью Марковской теории массового обслуживания, причем тем точнее, чем сложнее СМО, чем больше в ней каналов обслуживания. В большинстве случаев для обоснованных рекомендаций по практическому управлению СМО совсем не требует знаний точных ее характеристик, вполне достаточно иметь их приближенные значения.

Каждая СМО в зависимости от своих параметров обладает определенной эффективностью функционирования.

Эффективность функционирования СМО характеризуют три основные группы показателей:

  1. Эффективность использования СМО – абсолютная или относительная пропускные способности, средняя продолжительность периода занятости СМО, коэффициент использования СМО, коэффициент не использования СМО;
  2. Качество обслуживания заявок- среднее время (среднее число заявок, закон распределения) ожидания заявки в очереди или пребывания заявки в СМО; вероятность того, что поступившая заявка немедленно примется к исполнению;
  3. Эффективность функционирования пары CМО потребитель, причем под потребителем понимается как совокупность заявок или их некоторый источник (например, средний доход, приносимый СМО за единицу времени эксплуатации, и др).

2.2 Классификация СМО и их основные элементы

СМО классифицируются на разные группы в зависимости от состава и от времени пребывания в очереди до начала обслуживания, и от дисциплины обслуживания требований.

По составу СМО бывают одноканальные (с одним обслуживающим устройством) и многоканальные (с большим числом обслуживающих устройств). Многоканальные системы могут состоять из обслуживающих устройств как одинаковой, так и разной производительности.

По времени пребывания требований в очереди до начала обслуживания системы делятся на три группы:

1) с неограниченным временем ожидания (с ожиданием),

2) с отказами;

3) смешанного типа.

В СМО с неограниченным временем ожидания очередное требование, застав все устройства занятыми, становится в очередь и ожидает обслуживания до тех пор, пока одно из устройств не освободится.

В системах с отказами поступившее требование, застав все устройства занятыми, покидает систему. Классическим примером системы с отказами может служить работа автоматической телефонной станции.

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

Кратко рассмотрим особенности функционирования некоторых из этих ситем.

1. СМО с ожиданием характеризуется тем, что в системе из n (n>=1) любая заявка, поступившая в СМО в момент, когда все каналы заняты, становится в очередь и ожидает своего обслуживания, причем любая пришедшая заявка обслужена. Такая система может находится в одном из бесконечного множества состояний: sn+к(r=1.2…) –все каналы заняты и в очереди находится r заявок.

2. СМО с ожиданием и ограничением на длину очереди отличается от вышеприведенной тем, что эта система может находиться в одном из n+m+1 состояний. В состояниях s0 ,s1,…, sn очереди не существует, так как заявок в системе или нет или нет вообще и каналы свободны (s0), или в системе есть несколько I (I=1,n) заявок, которого обслуживает соответствующее (n+1, n+2,…n+r,…,n+m) число заявок и (1,2,…r,…,m) заявок , стоящих в очереди. Заявка, пришедшая на вход СМО в момент времени, когда в очереди стоят уже m заявок, получает отказ и покидает систему необслуженной.

Т.о, многоканальная СМО работает по сути как одноканальная, когда все n каналов работают как один с дисциплиной взаимопомощи, называемой все как один, но с более высокой интенсивностью обслуживания. Граф состояний подобной подобной системы содержит всего два состояния: s0 (s1)- все n каналов свободны (заняты).

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

    Если заявка поступает в СМО в момент времени, когда все каналы свободны, то все n каналов приступает к ее обслуживанию; Если в это время приходит следующая заявка, то часть каналов переключается на ее обслуживание Если во время обслуживания этих двух заявок поступает третья заявка, то часть каналов переключается на обслуживание этой третьей заявки, до тех пор, пока каждая заявка, находящаяся в СМО, не окажется под обслуживанием только одного канала. При этом заявка, поступившая в момент занятости всех каналов, в СМО с отказами и равномерной взаимопомощью между каналами, может получить отказ и вынуждена будет покинуть систему необслуженной.

Методы и модели, применяющиеся в теории массового обслуживания, можно условно разделить на аналитические и имитационные.

Аналитические методы теории массового обслуживания позволяют получить характеристики системы как некоторые функции параметров ее функционирования. Благодаря этому появляется возможность проводить качественный анализ влияния отдельных факторов на эффективность работы СМО. Имитационные методы основаны на моделировании процессов массового обслуживания на ЭВМ и применяются, если невозможно применение аналитических моделей.

В настоящее время теоретически наиболее разработаны и удобны в практических приложениях методы решения таких задач массового обслуживания, в которых входящий поток требований является простейшим (пуассоновским).

Для простейшего потока частота поступления требований в систему подчиняется закону Пуассона, т.е. вероятность поступления за время t ровно k требований задается формулой:

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

F(t)=1e-µt

Т.е. вероятность того, что время обслуживания не превосходит некоторой величины t, определяется этой формулой, где µ- параметр экспоненциального обслуживания требований в системе, т.е. величина, обратная времени обслуживания tоб:

µ=1/ tоб

Рассмотрим аналитические модели наиболее распространенных СМО с ожиданием, т.е. таких СМО, в которых требования, поступившие в момент, когда все обслуживающие каналы заняты, ставятся в очередь и обслуживаются по мере освобождения каналов.

Общая постановка задачи состоит в следующем. Система имеет n обслуживающих каналов, каждый из которых может одновременно обслуживать только одно требование.

В систему поступает простейший (пауссоновский) поток требований c параметром . Если в момент поступления очередного требования в системе на обслуживании уже находится не меньше n требований (т.е. все каналы заняты), то это требование становится в очередь и ждет начала обслуживания.

В системах с определенной дисциплиной обслуживания поступившее требование, застав все устройства занятыми, в зависимости от своего приоритета, либо обслуживается вне очереди, либо становится в очередь.

Основными элементами СМО являются: входящий поток требований, очередь требований, обслуживающие устройства, (каналы) и выходящий поток требований.

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

В большинстве случаев входящий поток неуправляем и зависит от ряда случайных факторов. Число требований, поступающих в единицу времени, случайная величина. Случайной величиной является также интервал времени между соседними поступающими требованиями. Однако среднее количество требований, поступивших в единицу времени, и средний интервал времени между соседними поступающими требованиями предполагаются заданными.

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

где Т - среднее значение интервала между поступлением очередных требований.

Для многих реальных процессов поток требований достаточно хорошо описывается законом распределения Пуассона. Такой поток называется простейшим.

Простейший поток обладает такими важными свойствами:

  1. Свойством стационарности, которое выражает неизменность вероятностного режима потока по времени. Это значит, что число требований, поступающих в систему в равные промежутки времени, в среднем должно быть постоянным. Например, число вагонов, поступающих под погрузку в среднем в сутки должно быть одинаковым для различных периодов времени, к примеру, в начале и в конце декады.
  2. Отсутствия последействия, которое обуславливает взаимную независимость поступления того или иного числа требований на обслуживание в непересекающиеся промежутки времени. Это значит, что число требований, поступающих в данный отрезок времени, не зависит от числа требований, обслуженных в предыдущем промежутке времени. Например, число автомобилей, прибывших за материалами в десятый день месяца, не зависит от числа автомобилей, обслуженных в четвертый или любой другой предыдущий день данного месяца.
  3. Свойством ординарности, которое выражает практическую невозможность одновременного поступления двух или более требований (вероятность такого события неизмеримо мала по отношению к рассматриваемому промежутку времени, когда последний устремляют к нулю).

При простейшем потоке требований распределение требований, поступающих в систему подчиняются закону распределения Пуассона:

вероятность того, что в обслуживающую систему за время t поступит именно k требований:

где. - среднее число требований, поступивших на обслуживание в единицу времени.

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

Кроме того, наличие пуассоновского потока требований можно определить статистической обработкой данных о поступлении требований на обслуживание. Одним из признаков закона распределения Пуассона является равенство математического ожидания случайной величины и дисперсии этой же величины, т.е.

Одной из важнейших характеристик обслуживающих устройств, которая определяет пропускную способность всей системы, является время обслуживания.

Время обслуживания одного требования ()- случайная величина, которая может изменятся в большом диапазоне. Она зависит от стабильности работы самих обслуживающих устройств, так и от различных параметров, поступающих в систему, требований (к примеру, различной грузоподъемности транспортных средств, поступающих под погрузку или выгрузку.

Случайная величина полностью характеризуется законом распределения, который определяется на основе статистических испытаний.

На практике чаще всего принимают гипотезу о показательном законе распределения времени обслуживания.

Показательный закон распределения времени обслуживания имеет место тогда, когда плотность распределения резко убывает с возрастанием времени t. Например, когда основная масса требований обслуживается быстро, а продолжительное обслуживание встречается редко. Наличие показательного закона распределения времени обслуживания устанавливается на основе статистических наблюдений.

При показательном законе распределения времени обслуживания вероятность события, что время обслуживания продлиться не более чем t, равна:

где v - интенсивность обслуживания одного требования одним обслуживающим устройством, которая определяется из соотношения:

,(1)

где - среднее время обслуживания одного требования одним обслуживающим устройством.

Следует заметить, что если закон распределения времени обслуживания показательный, то при наличии нескольких обслуживающих устройств одинаковой мощности закон распределения времени обслуживания несколькими устройствами будет также показательным:

где n - количество обслуживающих устройств.

Важным параметром СМО являетсякоэффициент загрузки , который определяется как отношение интенсивности поступления требований к интенсивности обслуживания v.

(2)

где a - коэффициент загрузки; - интенсивность поступления требований в систему; v - интенсивность обслуживания одного требования одним обслуживающим устройством.

Из (1) и (2) получаем, что

Учитывая, что - интенсивность поступления требований в систему в единицу времени, произведение показывает количество требований, поступающих в систему обслуживания за среднее время обслуживания одного требования одним устройством.

Для СМО с ожиданием количество обслуживаемых устройств п должно быть строго больше коэффициента загрузки (требование установившегося или стационарного режима работы СМО) :

.

В противном случае число поступающих требований будет больше суммарной производительности всех обслуживающих устройств, и очередь будет неограниченно расти.

Для СМО с отказами и смешанного типа это условие может быть ослаблено, для эффективной работы этих типов СМО достаточно потребовать, чтобы минимальное количество обслуживаемых устройств n было не меньше коэффициента загрузки :

2.3 Процесс имитационного моделирования

Как уже было отмечено ранее, процесс последовательной разработки имитационной модели начинается с создания простой модели, которая затем постепенно усложняется в соответствии с требованиями, предъявляемыми решаемой проблемой. В процессе имитационного моделирования можно выделить следующие основные этапы:

  1. Формирование проблемы : описание исследуемой проблемы и определение целей исследования.
  2. Разработка модели: логико-математическое описание моделируемой системы в соответствии с формулировкой проблемы.
  3. Подготовка данных: идентификация, спецификация и сбор данных.
  4. Трансляция модели: перевод модели на язык, приемлемый для используемой ЭВМ.
  5. Верификация: установление правильности машинных программ.
  6. Валидация: оценка требуемой точности и соответствие имитационной модели реальной системе.
  7. Стратегическое и тактическое планирование: определение условий проведения машинного эксперимента с имитационной моделью.
  8. Экспериментирование: прогон имитационной модели на ЭВМ для получения требуемой информации.
  9. Анализ результатов: изучение результатов имитационного эксперимента для подготовки выводов и рекомендаций по решению проблемы.
  10. Реализация и документирование: реализация рекомендаций, полученных на основе имитации, составление документации по модели и ее использованию.

Рассмотрим основные этапы имитационного моделирования. Первой задачей имитационного исследования является точное определение проблемы и детальная формулировка целей исследования. Как правило, определение проблемы является непрерывным процессом , который обычно осуществляется в течении всего исследования. Оно пересматривается по мере более глубокого понимания исследуемой проблемы и возникновения новых ее аспектов.

Как только сформулировано начальное определение проблемы, начинается этап построения модели исследуемой системы. Модель включает статистическое и динамическое описание системы. В статистическом описании определяются элементы системы и их характеристики, а в динамическом- взаимодействие элементов системы, в результате которых происходит изменение ее состояния во времени.

Процесс формирования модели во многом является искусством. Разработчик модели должен понять структуру системы, выявить правила ее функционирования и суметь выделить в них самое существенное, исключив ненужные детали. Модель должна быть простой для понимания и в то же время достаточно сложной, чтобы реалистично отображать характерные черты реальной системы. Наиболее важными являются принимаемые разработчиком решения относительно того, верны ли принятые упрощения и допущения, какие элементы и взаимодействия между ними должны быть включены в модель. Уровень детализации модели зависит от целей ее создания. Необходимо рассматривать только те элементы, которые имеют существенное значение для решения исследуемой проблемы. Как на этапе формирования проблемы, так и на этапе моделирования необходимо тесное взаимодействие между разработчиком модели и ее пользователями. Кроме того, тесное взаимодействие на этапах формулирования проблемы и разработки модели создает у пользователя уверенность в правильности модели, поэтому помогает обеспечить успешную реализацию результатов имитационного исследования.

На этапе разработки модели определяются требования к входным данным. Некоторые из этих данных могут уже быть в распоряжении разработчика модели, в то время как для сбора других потребуется время и усилия. Обычно значение таких входных данных задаются на основе некоторых гипотез или предварительного анализа. В некоторых случаях точные значения одного (и более) входных параметров оказывают небольшое влияние на результаты прогонов модели. Чувствительность получаемых результатов к изменению входных данных может быть оценена путем проведения серии имитационных прогонов для различных значений входных параметров. Имитационная модель, следовательно, может использоваться для уменьшения затрат времени и средств на уточнение входных данных. После того как разработана модель и собраны начальные входные данные, следующей задачей является перевод модели в форму, доступную для компьютера.

На этапах верификации и валидации осуществляется оценка функционирования имитационной модели. На этапе верификации определяется, соответствует ли запрограммированная для ЭВМ модель замыслу разработчика. Это обычно осуществляется путем ручной проверки вычисления, а также может быть использован и ряд статистических методов.

Установление адекватности имитационной модели исследуемой системы осуществляется на этапе валидации. Валидация модели обычно выполняется на различных уровнях. Специальные методы валидации включают установление адекватности путем использования постоянных значений всех параметров имитационной модели или путем оценивания чувствительности выходов к изменению значений входных данных. В процессе валидации сравнение должно осуществляться на основе анализа как реальных, так и экспериментальных данных о функционировании системы.

Условия проведения машинных прогонов модели определяется на этапах стратегического и тактического планирования. Задача стратегического планирования заключается в разработке эффективного плана эксперимента, в результате которого выясняется взаимосвязь между управляемыми переменными, либо находится комбинация значений управляемых переменных, минимизация или максимизация имитационной модели. В тактическом планировании в отличии от стратегического решается вопрос о том, как в рамках плана эксперимента провести каждый имитационный прогон, чтобы получить наибольшее количество информации из выходных данных. Важное место в тактическом планировании занимают определение условий имитационных прогонов и методы снижения дисперсии среднего значения отклика модели.

Следующие этапы в процессе имитационного исследования- проведение машинного эксперимента и анализ результатов- включают прогон имитационной модели на ЭВМ и интерпретацию полученных выходных данных. Последним этапом имитационного исследования является реализация полученных решений и документирование имитационной модели и ее использование. Ни одни из имитационных проектов не должен считаться законченным до тех пор, пока их результаты не были использованы в процессе принятия решений. Успех реализации во многом зависит от того, насколько правильно разработчик модели выполнил все предыдущие этапы процессов имитационного исследования. Если разработчик и пользователь работали в тесном контакте и достигли взаимопонимания при разработке модели и ее исследовании, то результат проекта скорее всего будет успешно внедряться. Если же между ними не было тесной взаимосвязи, то, несмотря на элегантность и адекватность имитационного моделирования, сложно будет разработать эффективные рекомендации.

Вышеперечисленные этапы редко выполняются в строго заданной последовательности, начиная с определения проблемы и кончая документированием. В ходе имитационного моделирования могут быть сбои в прогонах модели, ошибочные допущения, от которых в дальнейшем приходится отказываться, переориентировки целей исследования, повторные оценки и перестройки модели. Такой процесс позволяет разработать имитационную модель, которая дает верную оценку альтернатив и облегчает процесс принятия решений.

3.Описание системы

Моделируемая система представляет собой поток транспорта, движущегося в двухнаправлениях по дороге с двусторонним движением, одна сторона которой за-
крыта в связи с ремонтом на протяжении 500 м. На рис.1 показана схема
управления движением транспорта на ремонтируемом участке дороги с односто-
ронним движением.

Рис. 1. Схема работы светофоров

Светофоры, размещенные на обоих концах одностороннего участка, управляют
движением на нем. Светофоры открывают движение на участке в одном из на-
правлений в течение заданного промежутка времени. На рис.1 показана схе-
ма управления движением транспорта на ремонтируемом участке дороги с одно-
сторонним движением. Когда загорается зеленый свет, машины следуют по
участку с интервалом 2 с. Подъезжающий к участку автомобиль едет по нему без
задержки, если горит зеленый свет и перед светофором нет машин. Автомобили
подъезжают к светофорам через интервалы времени, распределенные экспонен-
циально с математическим ожиданием, равным 12 с для первого направления и
9 с — для второго. Светофор имеет следующий цикл: зеленый в первом направ-
лении, красный в обоих направлениях, зеленый во втором направлении, красный
в обоих направлениях. Красный свет горит в обоих направлениях в течение 55 с
для того, чтобы автомобили, следующие через ремонтируемый участок дороги,
смогли покинуть его до переключения зеленого света на другое направление.
Цель моделирования — определение таких значений «зеленых» интервалов для
обоих направлений, при которых среднее время ожидания всех автомобилей бу-
дет минимальным.

3.1Модельное время

Наличие экспоненциальных случайных величин со средними значениями 12 и 9
(и такими же среднеквадратичными отклонениями!) не позволяет использовать
в качестве единицы модельного времени непосредственно секунду, так какпогрешность округления случайной величины до целого будет сравнима с самой
величиной. Поэтому необходимо использовать масштабирование. При реализа-
ции модели коэффициент масштабирования принят равным 10, то есть едини-
цей является одна десятая секунды.

3.2Классы и объекты

Создадим два класса: один моделирующий — Светофор (SignalLights)
и один статистический — Заявка (Client), предназначенный для сбора статистики
по среднему времени пребывания. Класс Светофор представлен двумя объектами —первым и вторым. Алгоритмы функционирования светофоров абсолютно иден-
тичны, поэтому их можно считать принадлежащими одному классу. Выписать
неизменяемые и изменяемые поля данных класса Светофор не составляет труда.
Система является открытой, длина очереди не ограничена, поэтому очереди к светофорам будем моделировать связными списками.

По условию как «зеленые», так и «красные» интервалы светофоров — детерминированные величины. Поэтому светофорам ненужна информация друг от друга, достаточно лишь знать длину «зеленого» интервала другого светофора. Тогда длина «красного» интервала равна G1+ G2 + 2R, где G1,2 — длины «зеленых» интервалов, R— длина «красного» интервала.

Выпишем поля данных класса Светофор.

Неизменяемыеполя:

  • номер светофора (1 или 2);
  • продолжительность «красного» интервала (55);
  • при зеленом свете — продолжительность интервала между последовательными вступлениями на участок машин, ожидающих в очереди (2);
  • средняя интенсивность входного потока (1/12 = 0,083 заявок в секунду дляпервого светофора и 1/9 = 0,11 — для второго);
  • продолжительность «зеленого» интервала данного светофора;
  • продолжительность «зеленого» интервала другого светофора.

Изменяемые поля:

  • список указателей на заявки, находящиеся в очереди;
  • время до начала «красного» интервала;
  • время до начала «зеленого» интервала;
  • время до вступления на участок следующей машины из очереди (парметримеет смысл только при зеленом свете светофора);
  • время до прибытия очередной машины (ближайшего события внешнего потока);
  • текущая длина очереди (вычисляемое поле).

3.3События и методы

С объектом Светофор могут происходить четыре события, индуцируемые обращением в ноль четырех переменных, — прибытие извне нового автомобиля, вступление на участок автомобиля из очереди, включение зеленого света и включениекрасного света. В результате наступления этих событий значения одного или
нескольких полей данных объекта изменяются. Реакция светофоров на событие
определяется описанием логики работы системы и прокомментирована в лис-
тингах программы. Сделаю лишь одно замечание: в даннойсистеме с очередями отсутствует понятие обслуживания на сервере. Заявка, покидающая очередь, тут же считается покинувшей и систему и в дальнейшем нерассматривается. И еще. После тот как зажегся зеленый свет, машине, стоящейпервой, нет надобности ждать две секунды — она поедет сразу, так как ей ничто немешает. Поэтому метод Forward( ) вызывается в программе из двух мест: из метода run() по истечении двухсскундного интервала и из метода Green() — этот вызов соответствует проезду первой машины из очереди.

4. Программная реализация алгоритма

Длясоздания имитационной модели очереди с разнотипными заявками выбран язык программирования C++ и написана программа на этом языке, позволяющая в полной мере отразить функционирование системы.

Листинг программы файл 1.h. Описание классов

#include

#include

#include

#include

using namespace std;

#include "List.h"

#include "random.h"

FILE *que1; //файл для сбора статистики по длине очереди к первому

//светофору

FILE *que2; //файл для сбора статистики по длине очереди ко второму

//светофору

const int K=10; //коэффициент масштабирования времени

FILE *sojourn; //файл для сбора статистики по времени пребывания

//в очереди

int entered=0; //счетчик поступивших заявок

int completed=0; //счетчик обслуженных заявок (машин, проехавших

//по участку)

float que1_ave=0; //переменная для вычисления средней длины очереди

//к первому светофору

float que2_ave=0; //переменная для вычисления средней длины очереди

//ко второму светофору

float soj_ave=0; //переменная для вычисления среднего времени ожидания

long int total; //счетчик модельного времени

class Client

{

int id; //уникальный идентификатор заявки

int time; //время, проведенное в очереди

public:

friend class SignalLights;

Client(int i);

void Print();

};

Client::Client(int i)

{

id=i;

time=0;

}

void Client::Print()

{

printf("id=%d time=%dn", id, time);

}

class SignalLights

{

const static int both=55*K; //продолжительность "красного" интервала

const static int gap=2*K; //интервалвъезданаучасток

float input_rate; //интенсивность входного потока

int id; //номер светофора

int green_I; //продолжительность "зеленого" интервала

int green_other; //продолжительность "зеленого" интервала

//другого светофора

ListNode *queue; //список указателей, моделирующий очередь

//к светофору

int to_red; //время до включения красного света

int to_green; //время до включения зеленого света

int to_forward; //время до въезда на участок следующей

//машины

int to_arrival; //время до прибытия машины извне

int q_length; //текущая длина очереди

public:

SignalLights(float a, int b, int c, int d);

~SignalLights();

void Arrival();

void Forward();

void Red();

void Green();

void run();

};

SignalLights::SignalLights(float a, int b, int c, int pr) //Конструктор.

//В качестве параметров передаются интенсивность входного потока, длины //"зеленых" интервалов, а также номер светофора

{

id=pr;

queue=NULL;

input_rate=a;

green_I=b;

green_other=c;

//Начальное состояние первого светофора - он только что зажег зеленый свет

if (pr==1)

{

to_red=green_I;

to_green=-1;

}

else //соответственно, на втором светофоре горит красный свет

{

to_green=both+green_other;

to_red=-1;

}

to_forward=-1;

//Очередипусты

q_length=0;

to_arrival=(int)(get_exp(input_rate)*K);

if (to_arrival==0) to_arrival=1;

}

//Деструктор. Возвращает память, выделенную под очередь

SignalLights::~SignalLights()

{

while(queue) queue=ListDelete(queue,queue);

}

//Прибытиеновоймашины

void SignalLights::Arrival()

{

Client *ptr=NULL;

ListNode *ptr1=NULL;

//Разыгрываем длину нового интервала между прибытиями

to_arrival=(int)(get_exp(input_rate)*K);

if (to_arrival==0) to_arrival=1;

entered++; //инкремент счетчика поступлений

ptr=new Client(entered); //создаем для новой заявки объект. Память будет

//возвращена либо в методе Forward при проезде

//перекрестка, либо деструктором, если к моменту

//завершения моделирования заявка будет

//находиться в очереди

if (q_length>0) //очередь не пуста, заявка становится в нее

{

ptr1=new ListNode(ptr, NULL);

ListAdd(queue, ptr1);

q_length++;

}

else if (to_green>0) //очередь пуста, но горит красный свет, заявка

//становится в очереди первой

{

ptr1=new ListNode(ptr, NULL);

queue=ptr1;

q_length=1;

}

else //сразу можно ехать

{

completed++; //инкремент счетчика обслуженных заявок

delete ptr; //дальнейшее отслеживание этой заявки

//нам не нужно

soj_ave=soj_ave*(1-1.0/completed); //пересчет среднего времени ожидания

fprintf(sojourn, "0n"); //время ожидания было равно нулю

}

return;

}

//Въезд на участок новой машины

void SignalLights::Forward()

{

int p;

ListNode *ptr;

if (to_red==-1) //уже зажегся красный свет, ехать нельзя

{

to_forward=-1; return;

}

completed++; //инкремент счетчика обслуженных заявок

q_length--; //декремент текущей длины очереди

//Запись в файл времени пребывания убывшей заявки и пересчет среднего

p=queue->Data()->time;

fprintf(sojourn, "%.3fn", ((float)p)/K);

soj_ave=soj_ave*(1-1.0/completed)+((float)p)/completed;

//В очереди еще есть заявки

if (q_length>0)

{

ptr=queue;

to_forward=gap;

queue=queue->Next(); //продвижение очереди

delete ptr; //освобождение памяти, занимаемой покинувшей

//очередь заявкой

}

else //очередь стала пуста

{

to_forward=-1; //освобождение памяти, выделенной для очереди

delete queue;

queue=NULL;

}

return;

}

//Зажегсякрасныйсвет

void SignalLights::Red()

{

to_red=-1;

to_green=2*both+green_other;

to_forward=-1;

}

//Зажегсязеленыйсвет

void SignalLights::Green()

{

to_green=-1;

to_red=green_I;

if (q_length>0) Forward(); //поехали!

}

//Диспетчер

void SignalLights::run()

{

ListNode *ptr=NULL;

if (to_forward>0) to_forward--;

if (to_forward==0) Forward();

if (to_red>0) to_red--;

if (to_red==0) Red();

if (to_green>0) to_green--;

if (to_green==0) Green();

if (to_arrival>0) to_arrival--;

if (to_arrival==0) Arrival();

//Инкремент счетчика времени пребывания для всех заявок, стоящих в очереди

if (q_length>0)

{

ptr=queue;

while(ptr)

{

(ptr->Data()->time)++;

ptr=ptr->Next();

}

}

//Запись в файлы сбора статистики и пересчет средней длины очереди раз в две //секунды

if ((id==1)&&(total%20==0)&&(total/20>0))

{

fprintf(que1, "%dn", q_length);

que1_ave=que1_ave*(1-1.0/(total/20))+((float)q_length)/(total/20);

}

if ((id==2)&&(total%20==0)&&(total/20>0))

{

fprintf(que2, "%dn", q_length);

que2_ave=que2_ave*(1-1.0/(total/20))+((float)q_length)/(total/20);

}

}

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

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

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

//c парметризированным типом

classListNode {

private:

ListNode *next; //указатель на следующий элемент списка

Type *data; //указатель на данные хранящиеся в элементе списка

public:

ListNode(Type *d, ListNode *n); //конструктор

~ListNode(); //деструктор

Type *Data(); //метод для чтения данных

ListNode *Next(); //метод для чтения указателя

//на следующий элемент

voidPutNext(ListNode *n); //метод для записи указателя

//на следующий элемент

voidPrint(); //печать содержимого элемента списка

};

template

ListNode::ListNode(Type *d, ListNode *n) : next(n), data(d){

}

template

ListNode::~ListNode(){

delete data;

}

template

Type *ListNode::Data(){

return data;

}

template

ListNode *ListNode::Next(){

return next;

}

template

void ListNode::PutNext(ListNode *n){

next=n;

}

template

void ListNode::Print(){

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

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

}

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

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

template

void ListAdd(ListNode *head, ListNode *li) {

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

ListNode *old, *v;

//ищем внешний хвост списка

for (v=head; v!=NULL; v=v->Next())

old=v;

old->PutNext(li); //добавляем в след за найденым хвостом новый элемент списка

}

template

ListNode *ListDelete(ListNode *head, ListNode *li) {

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

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

//int j;

ListNode *old, *o1;

if (li==head){

//удаляемый элемент может быть головой списка

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

o1=head->Next();

delete li;

return o1;

}

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

for (ListNode* v=head; v!=li; v=v->Next())

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

old=v;

o1=li->Next();

old->PutNext(o1);

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

//за удаленным

delete li;

returnhead;

}

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

template

void ListPrint(ListNode *head){

for (ListNode* v=head; v!=NULL; v=v->Next())

v->Print(); //подсчет количества элементов в списке с головой head

}

template

int ListCount(ListNode *head){

int i; i=0;

for (ListNode* v=head; v!=NULL; v=v->Next()){

v->Print();

i++;

}

return i;

}

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

#include

#include

#include

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

//экспоненциально (см. главу 3)

{

int r_num; float root, right;

r_num=rand(); /*получение случайного целого

/числа*/

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

root=-log(1-right)/mu; /*вычисление значения обратной

/функции*/

return(root);

}

int get_uniform(int a, int b)

{ //Генерация равномерно распределенной величины a+b

int x, y;

x=rand()%(b+1);

y=rand()%2;

if (y==0) return(a-x);

return(a+x);

}

float get_triangle(float A, float B, float C)

{

int r_num; float root, right;

r_num=rand(); //получение случайного целого

//числа

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

//Константа RAND_MAX=32767 (215-1) определена в cstdlib

if (right<(C-A)/(B-A)) root=A+sqrt(right*(B-A)*(C-A));

else root=B-sqrt((1-right)*(B-A)*(B-C));

return(root);

}

float get_pareto(float A, float B)

{

int r_num; float root, right;

r_num=rand(); /*получение случайного целого числа*/

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

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

return(root);

}

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

#include "stdafx.h"

#include "iostream"

#include "1.h"

#define N 12*3600*K //общее время моделирования - 12 часов

int main()

{

int i;

que1=fopen("que1", "wt");

que2=fopen("que2", "wt");

sojourn=fopen("sojourn", "wt");

srand((unsigned)time(0));

//Создаются два светофора с длиной зеленого интервала 1 мин

SignalLights s1(0.083, 600, 600, 1);

SignalLights s2(0.111, 600, 600, 2);

//Моделирующийцикл

for(total=0L;total

{

s1.run();

s2.run();

} //закрытие файлов сбора статистики

fclose(sojourn);

fclose(que1); fclose(que2);// выводрезультатов

setlocale(LC_ALL, "Russian");

cout << "Всего поступлений " << entered << endl;

cout << "Проехало по участку " << completed << endl;

cout << "Средняя длина очереди к первому светофору " << que1_ave << endl;

cout << "Средняя длина очереди ко второму светофору " << que2_ave << endl;

cout << "Среднее время пребывания в очереди " << soj_ave/K << endl;

_gettch();

}

5.Оптимизация

В условии задачи не заданы длины «зеленых» интервалов. Их требуется найти
опытным путем, чтобы минимизировать общее среднее время ожидания, тоестьчисленно решить задачу двумерной оптимизации функции T=f(g1, g2), гдеТ —
среднее время ожидания, g1и g2— длительности «зеленых» интервалов. Особен-
ности этой функции таковы:

  • ничего не известно о градиенте (частных производных) минимизируемой функции;
  • для получения более или менее достоверного значения функции в одной точке (при фиксированных длительностях «зеленых» интервалов) необходимоусреднить результаты нескольких экспериментов, проведенняхпри однихи тех же исходных данных (в представленных далее расчетах — 1000 прого-
    нов для каждой точки).

Содержательность задачи оптимизации не вызывает возражений. В самом деле,
длительность зеленого интервала не может быть ни слишком малой — автомоби-
ли, стоящие в очереди, не успеют проехать, ни слишком большой — будет накап-
ливаться очередь на другом светофоре, так как пока на одном горит зеленый
свет, на другом горит красный. Следовательно, логично ожидать, что некоторая
пара значений, доставляющая среднему времени ожидания минимальное значе-
ние, существует.

Пусть g1 и g2 — длительности «зеленых» интервалов для первого и второго светофоров. В течение так называемого светофорного цикла (два «красных» и два
«зеленых» интервала) у первого светофора скопятся в среднем (55*2+g1+g2)/12машин, а у второго — (55*2+g1+g2)/9. За это время на участок будут пропущены, соответственно, g1/2 и g2/2 машин. Имеем систему неравенств:

Решением этой системы является следующее двойное неравенство:

(220 + g1)/7 < g2< 5g1 - 110.

Левая и правая часть формулы совпадают при g1 = 29,1, g2 = 35,5. Поэтомуможно сказать, что длительность зеленого интервала на первом светофоре не может быть менее 30 с, а на втором — менее 36 с. Область, задаваемую форму-
лой , легко изобразить графически на координатной плоскости.

Для поиска точки минимума используем метод покоординатного спуска, который хоть и сходится довольно медленно, однако не требует, в отличие от градиентных методов, вычислениячастных производных. Идея метода состоит в следующем. Имея какое-то текущее приближение к точке минимума, мы вычисляем значения минимизируемойфункции в некоторой h-окрестности от него, поочередно увеличивая или уменьшая одну из координат на величину шага h, а значения остальных координатоставляя неизменными. Если в одной из точек Л-окрестности удалось уменшитьзначение функции и эта точка входит в область, заданную ограничениями, то эта точка и становится новым текущим приближением к минимуму. Дллее мы проверяем h-окрестность уже для новой точки

Если же уменьшить значение целевой функции не удалось, для величины шага hназначается меньшее (например, в два раза) значение и вся процедура повторя-
ется для той же самой точки. Вычисления заканчиваются, когда hстанет меньше
некоторой заданной точности.

Рис. 2. Область допустимых значений длин «зеленых» интервалов

5.1 Метод покоординатного спуска

Требуется решить задачу условной оптимизации:. Обозначим

ei = (0,…,0, 1,0,…,0) единичный координатный (базисный) вектор, у которого

i-я координата равна 1, остальные равны нулю, i=1,….,n. Пусть u0 — некоторое
начальное приближение, а 0 — некоторое положительное число, являющееся
параметром метода. Допустим, что нам уже известны точка kи числоk> 0
при каком-либо k>0. Примем

где [k/n] означает целую часть числа k/n. Условие обеспечивает циклический перебор координатных векторов е1, е2,…., enто есть р0 = е1,..., рn-1 = еn,

рn=е1,…,p2n-1=еn, р2n=е1…. Вычислим значение функции J(U)в точке
u = uk+ аkрk и проверим условие . Если оно выполняется, проверяем вы-
полнение неравенства

J(uk+ аkрk)

Если выполняется и оно, то примем

uk+1= uk+ аkрk, ak+1= ak

В том случае, если условие не выполняется либо точка и не входит в область, заданную ограничениями, вычисляем значение функции J(u)в точке uk= uk - аkрk
и проверяем выполнение неравенства

J(uk - аkрk)

В случае выполнения формулы и вхождения в область Uпримем

uk+1= uk - аkрk, ak+1= aak

Назовем (k+ 1)-ю итерацию удачной, если справедливо хотя бы одно из нера-
венстви соответствующая точка u= ukаkрk принадлежит области U. Если (k+ 1)-я итерация неудачная, то есть одновременно с условиемне выполняется ни одно из неравенств и, то полагаем

Здесь— фиксированное число, являющееся параметром метода. Ус-
ловияозначают, что если за один цикл из nитераций при переборе направлений всех координатных осей е1,….,еn с шагом аkреализовалась хотя быодна удачная итерация, то длина шага ак не дробится и сохраняется на протяжении по крайней мере следующего цикла из n итераций. Если же среди последнихn итераций не оказалось ни одной удачной, то шаг ак дробится. Описание методапокоординатного спуска закончено.

5.2 Оптимизация программного кода

Из условия задачи можно сделать вывод, что за эо с автомооиль проезжает ремонтируемый участок дороги от начала до конца. По окончании «зеленого» интервала светофор должен исходить из наихудшего предположения, заключающегося
в том, что последний автомобиль въехал на участок как раз перед включением
красного света, ведь у светофора нет автоматической системы видеонаблюдения
за дорогой и он не может отследить момент въезда последней машины. Но на са-
мом деле такое предположение является избыточным, ведь наверняка возникают
ситуации, когда в последние, скажем, 10 с «зеленого» интервала автомобили на
участок не въезжали. Значит, уже через 45 с на другом светофоре можно вклю-
чать зеленый свет. Сделаем фантастическое предположение: светофоры обо-
рудованы автоматической системой и могут динамически подстраивать длитель-
ности «красных» интервалов друг друга, фиксируя момент проезда последней
машины и одновременно с переключением на красный свет посылая сообщение
«коллеге», через сколько секунд ему включить зеленый. Соответственно, через
некоторое время отправитель и сам получит сообщение от коллеги, через какое
время ему включать зеленый. Если же такое сообщение по каким-то причинам
получено не будет, зеленый свет включится по детерминированному расписа-
нию. Интересно выяснить, как скажется такое дорогостоящее техническое нов-
шество на основном показателе — среднем времени ожидания.

Для сокращения дальнейшего сравнительного анализа назовем прежнюю модельпервой, а рассматриваемую в данном случае — второй. Для второй модели длительность «красного» интервала становится случайной величиной, поэтому между двумя светофорами должна существовать связь для передачи сообщений. Выпишем для второй модели фрагменты кода, которые претерпевают изменения посравнению с первой моделью.

Листинг программы файл 2.h. Описание классов

#include

#include

#include

#include

using namespace std;

#include "List.h"

#include "random.h"

FILE *que1;

FILE *que2;

int K=10;

FILE *sojourn;

int entered=0;

int completed=0;

float que1_ave=0;

float que2_ave=0;

float soj_ave=0;

long int total;

class Client

{

int id;

int time;

public:

friend class SignalLights;

Client(int i);

void Print();

};

Client::Client(int i)

{

id=i;

time=0;

}

void Client::Print()

{

printf("id=%d time=%dn", id, time);

}

class SignalLights

{

const static int both=550;

const static int gap=20;

float input_rate;

int id;

int green_I;

int green_other;

ListNode *queue;

int to_red;

int to_green;

int to_forward;

int to_arrival;

int q_length;

int from_last;

SignalLights *other;

public:

SignalLights(float a, int b, int c, int d);

void Arrival();

void Forward();

void Red();

void Green();

void run();

void PutOther(SignalLights *p);

};

void SignalLights::PutOther(SignalLights *p)

{

other=p;

}

SignalLights::SignalLights(float a, int b, int c, int pr)

{

id=pr;

queue=NULL;

input_rate=a;

green_I=b;

green_other=c;

if (pr==1)

{

to_red=green_I;

to_green=-1;

}

else

{

to_green=both+green_other;

to_red=-1;

}

to_forward=-1;

q_length=0;

to_arrival=(int)(get_exp(input_rate)*K);

if (to_arrival==0) to_arrival=1;

from_last=-1;

}

void SignalLights::Arrival()

{

Client *ptr=NULL;

ListNode *ptr1=NULL;

to_arrival=(int)(get_exp(input_rate)*K);

if (to_arrival==0) to_arrival=1;

entered++;

ptr=new Client(entered);

if (q_length>0)

{

ptr1=new ListNode(ptr, NULL);

ListAdd(queue, ptr1);

q_length++;

}

else if (to_green>0)

{

ptr1=new ListNode(ptr, NULL);

queue=ptr1;

q_length=1;

}

else

{

completed++;

delete ptr;

soj_ave=soj_ave*(1-1.0/completed);

fprintf(sojourn, "1n");

from_last=0;

}

return;

}

void SignalLights::Forward()

{

int p;

ListNode *ptr;

if (to_red==-1) { to_forward=-1; return; }

completed++;

q_length--;

p=queue->Data()->time;

fprintf(sojourn, "%.1fn", ((float)p)/K);

soj_ave=soj_ave*(1-1.0/completed)+((float)p)/completed;

from_last=0;

if (q_length>0)

{

ptr=queue;

to_forward=gap;

queue=queue->Next();

delete ptr;

}

else

{

to_forward=-1;

delete queue;

queue=NULL;

}

return;

}

void SignalLights::Red()

{

to_red=-1;

to_green=2*both+green_other;

to_forward=-1;

other->to_green=both-from_last;

from_last=-1;

}

void SignalLights::Green()

{

to_green=-1;

to_red=green_I;

if (q_length>0) Forward();

}

void SignalLights::run()

{

int zu;

ListNode *pur=NULL;

if ((from_last!=-1)&&(from_last

if (to_forward>0) to_forward--;

if (to_forward==0) Forward();

if (to_red>0) to_red--;

if (to_red==0) Red();

if (to_green>0) to_green--;

if (to_green==0) Green();

if (to_arrival>0) to_arrival--;

if (to_arrival==0) Arrival();

if (q_length>0)

{

zu=0;

pur=queue;

while(pur!=NULL)

{

(pur->Data()->time)++;

pur=pur->Next();

zu++;

}

}

if ((id==1)&&(total%20==0)&&(total/20>0))

{

fprintf(que1, "%dn", q_length);

que1_ave=que1_ave*(1-1.0/(total/20))+((float)q_length)/(total/20);

}

if ((id==2)&&(total%20==0)&&(total/20>0))

{

fprintf(que2, "%dn", q_length);

que2_ave=que2_ave*(1-1.0/(total/20))+((float)q_length)/(total/20);

}

}

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

#include "stdafx.h"

#include "iostream"

#define N 432000 //общее время моделирования - 8 часов

#include "2.h"

int main()

{

int i;

SignalLights *s1, *s2;

que1=fopen("que1", "wt");

que2=fopen("que2", "wt");

sojourn=fopen("sojourn", "wt");

srand((unsigned)time(0));

s1=new SignalLights(0.083, 600, 600, 1);

s2=new SignalLights(0.111, 600, 600, 2);

s1->PutOther(s2);

s2->PutOther(s1);

for(total=0L;total

{ s1->run();

s2->run();

} //удаление объектов

deletes1; deletes2; //закрытие файлов сбора статистики

fclose(sojourn);

fclose(que1); fclose(que2);// вывод на печать результатов имитационного эксперимента

setlocale(LC_ALL, "Russian");

cout << "Всегопоступлений " << entered << endl;

cout << "Проехало по участку " << completed << endl;

cout << "Средняя длина очереди к первому светофору " << que1_ave << endl;

cout << "Средняя длина очереди ко второму светофору " << que2_ave << endl;

cout << "Среднее время пребывания в очереди " << soj_ave/K << endl;

_gettch();

}

6.Анализ результатов работы программы

Рис. 3. Скриншот работы программы (первая модель).

Приведем результаты расчетов методом покоординатного спуска для первой модели. Значения функции (среднего времени ожидания) округлены до одного
знака после запятой. Значение шага не будем принимать меньшим одной секун-
ды. В качестве начального приближения примем значения «зеленых» интерва-
лов равными одной минуте, то есть (g1,g2) = (60,60).

Т(60, 60) = 81,7; а =10.

Результаты первой итерации:

T(50; 60) = 78,8; T(70; 60) = 86,5; T(60; 70) = 79,8; T(60; 50) = 108,1.

Итерация удачна, так как T(50; 60) < T(60; 60). Значение шага сохраняется. Ре-
зультаты второй итерации:

T(40; 60) = 80,2; T(50; 70) = 78,3; T(50; 50) = 88,6.

Итерация удачна. Значение шага сохраняется. Результаты третьей итерации:

T(40; 70) = 83,9; T(50; 80) = 79,4.

Итерация неудачна. Полагаем значение шага равным 5:

T(55; 70) = 78,9; T(45; 70) = 79,8; T(50; 75) = 78,7; T(50; 65) = 78,4.

Итерация неудачна. Полагаем значение параметра равным 2:

T(52; 70) = 78,5; T(48; 70) = 78,4; T(50; 72) = 78,5; T(50; 68) = 78,2.

Формально итерация удачна, хотя вычисления уже можно прекращать — с практической точки зрения точность на уровне десятых долей секунды нам в этой задаче не нужна. Сделаем еще одну итерацию:

T(52; 68) = 78,4; T(48, 68) = 78,2; T(50; 66) = 78,2.

Итак, делаем вывод: для достижения оптимального решения необходимо задать
длину «зеленого» интервала для первого светофора 50 с, для второго светофо-
ра — от 65 до 70 с. При этом среднее время ожидания автомобиля в очереди рав-
но около 78 с.

Добавим, что при оптимальных значениях «зеленых» интервалов, средняя длинаочереди к первому светофору равна около 7, ко второму — около 8. Это логично,так как интенсивность входного потока ко второму светофору выше.

Рис. 4. Скриншот работы программы (вторая модель).

Проведем аналогичные расчеты для второй модели. На основе имеющихся дан-
ных мы можем выбрать для начала расчетов лучшее начальное приближение —
точку (50; 70):

T(50; 70) = 68,2.

Результаты первой итерации, а = 5:

T(55; 70) = 68,3; T(45; 70) = 69,3; T(50; 75) = 68,6; T(50; 65) = 68.

Итерация удачна, так как T(50; 65) < T(50; 70). Значение шага сохраняется. Ре-
зультаты второй итерации:

T(55; 65) = 68,5; T(45; 65) = 68,7; T(50; 60) = 68,3.

Итерация неудачна, а = 2:

T(52; 65) = 68,1; T(48; 65) = 68; T(50; 67) = 68; T(50; 63) = 68,1.

Дальнейшие вычисления излишни. Вывод об оптимальных значениях «зеленых»интервалов такой же, как и для первой модели. А вот среднее время ожиданиясократилось за счет динамической подстройки «красных» интервалов на 10 с.
Средняя длина очереди тоже уменьшилась: 6 — для первого светофора и 7,5 —
для второго. На рис. 5 приведены графики зависимости среднего времени
ожидания от длины «зеленого» интервала для второго светофора при длине «зе-
леного» интервала первого светофора, равной 50. Область определения зависи-
мостей рассчитана с помощью выражения при g1= 50 и представляет со-
бой интервал [46; 139]. Нетрудно заметить идентичность этих двух кривых.


Рис. 5. Зависимости среднего времени ожидания от длины «зеленого» интервалавторого светофора

Средняя длительность «красного» интервала в обоих направлениях уменьшает-
ся во второй модели с 55 до 46-47 с при g1 = 50, g2= 66.

Таким образом, имитационное моделирование свое дело сделало. Теперь слово
за экономистами — они должны подсчитать, покроет ли экономия, полученная в
результате десятисекундного сокращения среднего времени ожидания, затраты
на установку и эксплуатацию следящей видеосистемы или нет.

7. Заключение

В результате выполнения курсовой работы были достигнуты следующие результаты:

    изучены метод имитационного моделирования экономических объектов; получены навыки проведения численных экспериментов на имитационных моделях экономических систем; приобретен опыт проведения анализа по результатам данных экспериментов на имитационной модели;

Список использованной литературы

    Труб И. И. «Объектно-ориентированное моделирование на С++»: Учебный курс.-СПб.:Питер, 2006.-411с.:ил.
  1. Варфоломеев В.И. «Алгоритмическое моделирование элементов экономических систем». - М.: Финансы и статистика, 2008г.
  2. Клейнрок Л. «Теория массового обслуживания.»-М.: Машиностроение, 2018.-432 с.
  3. Прицкер А. «Введение в имитационное моделирование»-М.: Мир, 2010.-644с.
  4. Емельянов А.А.,Власова Е.А., «Имитационное моделирование экономических процессов» - М. Финансы и статистика,2018.
  5. Дубров А.М., Лагоша Б.А., Хрусталев Е.Ю. Моделирование рискованных ситуаций в экономике и бизнесе. –М.: Финансы и статистика, 2008. -224 с. Князевская Н.В., Князевский В.С. Принятие рискованных решений в экономике и бизнесе. –М.: Контур, 2008. -160 с. Шикин Е.В. Математические методы и модели в управлении. –М.: Финансы и статистика, 2005. -430 с. Федосеева В.В. «Экономико-математические методы и прикладные модели», под ред., Москва «Юнити» 2009 г.

7. Гинзбург А.И. Экономический анализ: Предмет и методы. Моделирование ситуаций. Оценка управленческих решений: учебное пособие. –СПб.: Питер, 2008. -622 с.

8. Грабовый П.Г. Риски в современном бизнесе. –М.: Финансы и статистика, 2010. -200 с.