Вы находитесь на странице: 1из 98

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

Федеральное государственное бюджетное образовательное учреждение


высшего образования
«ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ

Факультет Кафедра
вычислительной техники МОиПЭВМ

Направление подготовки 09.04.02 «Информационные системы и технологии»


Проектирование, разработка и эксплуатация
Профиль информационных систем

ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ
РАБОТА МАГИСТРА
на тему
Модели и алгоритмы автоматизированной системы
управления дорожным движением

Студент ___________ Шишов Дмитрий Дмитриевич


(подпись, дата) (ФИО полностью)

Руководитель ___________ Бибарсов А.Д,


(подпись, дата) (фамилия, инициалы)

Нормоконтролер ___________ Такташкин Д.В.


(подпись, дата) (фамилия, инициалы)

Рецензент ___________ Васин Л. А.


(подпись, дата) (фамилия, инициалы)

Работа допущена к защите (протокол заседания кафедры от ___________№_____)

Заведующий кафедрой __________________ Макарычев П.П.


(подпись) (фамилия, инициалы)

Работа защищена с отметкой ______ (протокол заседания ГЭК от ______№____)

Секретарь ГЭК __________________ Попова Н.А.


(подпись) (фамилия, инициалы)

Пенза, 2017
2

Содержание
Введение.....................................................................................................................4

Глава 1. Анализ существующих методов управления транспортными потоками


.....................................................................................................................................7

§ 1.1 Транспортный поток как объект моделирования.........................................7

§ 1.2 Методы управления транспортными потоками..........................................14

§ 1.3 Модель сетевого движения...........................................................................21

§ 1.4. Макроскопическое моделирование транспортного потока......................24

Выводы по главе 1...................................................................................................30

Глава 2. Математические модели сетевого движения и балансировки..............32

§ 2.1 Математическая модель сетевого движения...............................................32

§ 2.2 Поток насыщения в транспортной сети......................................................37

§ 2.3 Определение параметров начального цикла светофорного объекта........41

§ 2.4 Балансировка транспортного спроса и предложения................................44

§ 2.5 Модель задержки и очереди на изолированном перекрестке....................46

Выводы по главе 2..................................................................................................50

Глава 3. Разработка средств интеллектуального анализа транспортной............51

сети............................................................................................................................51

§ 3.1 Разработка редактора транспортной сети...................................................51

§ 3.2 Библиотека расчетов задержки и очереди в транспортной сети...............53

§ 3.3 Программное тестирование библиотеки расчетов состояния


транспортной сети..................................................................................................61

Выводы по главе 3...................................................................................................65

Список используемых источников.........................................................................67

1. K. Nagel and M. Paczuski, Phys. Rev. E51, 2909 (1995).....................................67

Приложение А XSD–СХЕМЫ (обязательное).....................................................69


3

Приложение Б КОД БИБЛИОТЕКИ РАСЧЕТА СОСТОЯНИЯ


ТРАНСПОРТНОЙ СЕТИ (обязательное)..............................................................75
4

Введение
Актуальность темы работы. Концентрация автотранспортного парка в
городах за последнее десятилетие стала причиной интенсивного роста загрузки
транспортных сетей и как следствие, увеличение количества дорожно-
транспортных происшествий, уровня транспортных задержек и ухудшения
экологической обстановки.
Заторы, образующиеся вследствие перегрузки городских сетей, особенно в
крупных городах, с каждым годом становятся не только повседневным, но и
постоянным явлением. Что в свою очередь приводит к экономическим потерям
из-за продолжительных задержек, которые они вызывают, а также оказывают
негативное воздействие на окружающую среду, увеличивая уровень шума и
загрязнение токсинами отработанных газов.
Следует учесть, что строительство новой или реконструкция уже
существующей инфраструктуры позволяет снизить нагрузку на транспортные
сети, но является наиболее трудоёмким процессом, где требуются значительные
временные и денежные затраты, а так же приводящее к возмущению со стороны
городского населения
Повторное использование имеющиеся инфраструктуры, с применением
автоматизированных систем управления дорожным движением (АСУДД),
позволит предотвратить или, по крайней мере, снизить уровень перегрузки
транспортных сетей, в сочетании с использованием современных методов и
подходов к управлению дорожным движением.
В этой связи данное научное исследование, посвященное методам
повышения эффективности организации дорожного движения посредством
АСУДД, является актуальным.
Цель и задачи работы. Разработка моделей и алгоритмов управления
режимами работы светофорных объектов с применением макроскопических
представлений движения транспортных средств в транспортной сети.
Методы исследования. Диссертационное исследование выполнено на
основе трудов ведущих отечественных и зарубежных ученых в области
5

организации дорожного движения, моделирования и управления


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

Структура и объем диссертации. Работа состоит из введения, трех


тематических глав, заключения и списка литературы. Общий объем основного
6

текста 66 страниц, включая 14 рисунков и 13 таблицы. Список литературы


изложен на 2 страницах и содержит 12 наименований.
7

Глава 1. Анализ существующих методов управления транспортными


потоками

§ 1.1 Транспортный поток как объект моделирования


Теория транспортного потока, в своем первозданном виде, была узко
специализируемой дисциплиной, которая решала узкий круг задач, например,
изучение и обоснование пропускной способности магистралей и их
пересечений, операясь в основном на эмпирические даннве.
Как отдельное научное направление, теория транспортных потоков
сформировалось вначале 1950-х года. Математический подход, применительно
к теоретическому анализу, получили главенствующее место, вытеснив
эмпирический подход. Вследствие чего, для описания транспортного потока
стали использоваться идеи из статистики, гидродинамики и т.д. Данный период
характеризуется бурным прогрессом научной мысли и становлением основных
направлений исследований.
В 1955 году, М.Дж. Лайтхилл (M. Lighthill), Дж.Б. Уизем (G. B. Whitham) и П.
Ричардс (P. Richards) предложили первую макроскопическую модель (LWR-
модель), в которой движение транспортного потока, рассматривается с точки
зрения механики сплошной среды. Они доказали, что методы описания
процессов переноса в сплошных средах могут быть успешно применимы для
моделирования заторовых ситуаций. Разработанная ими макроскопическая
модель легла в основу к описанию транспортного потока.
В то же промежуток времени, изучая процесс следования за лидером (car-
following), в лаборатории Дженерал Моторс, положили начало
микроскопической теории транспортных потоков.
В 1960-х годах с выходом в свет первых персональных компьютеров
возобновился интерес к исследованию транспортных систем. Теория
транспортных потоков стала рассматриваться как теоретическая база
функционирования систем управления транспортными потоками в тоннелях и
на пересечениях. В дальнейшем, посредством эволюции автоматизированных
8

систем управления движением привела к появлению интеллектуальных


транспортных систем (Intelligent Transportation Systems – ITS), охватывающих
все аспекты перевозок.
С 1970-x по 1980-х гг. не было достигнуто существенных результатов, за
исключением работ И. Пригожина и Р. Германа. В качестве основной причин
стагнации в развитии теории транспортных потоков считается возврат ученых,
вложивших основной вклад в развитие теории, к базовым научным
дисциплинам, утратив к возможности приложения своих методик к решению
транспортных проблем.
В начале 1990-х гг. вновь возродился интерес исследователей к вопросу
моделирования транспортных потоков. Одним из направлений исследований
стало использование подходов статистической физики для моделирования
движения транспортных средств. В качестве примера использования данного
подхода можно привести модель клеточных автоматов [1] К. Нагеля (K.Nagel) и
М. Шрекенберга (M.Schreckenberg). Кроме того стали подвергаться сомнению
многие традиционные подходы к моделированию транспортных потоков, в
частности гидродинамические модели. В результате чего, появилось большое
количество моделей, и встал вопрос их соответствия реальным наблюдениям
состояния транспортного потока. Вне зависимости от того, какой использовался
подход к моделированию, исследователи должны всегда сравнивать свои
результаты с действительностью реального мира.
Возникновение различных направлений и подходов к моделированию движения
транспортных потоков создало предпосылки к созданию платформы для
ведения научных дискуссий сообществом ученых. Наиболее значимыми
мероприятиями стали ежегодные «International Symposium on Transportation and
Traffic Theory» и проводимые раз в два года «Traffic and Granular Flow» (в 2011
году проводился в г. Москве).
Какими бы ни были подходы к моделированию транспортных потоков,
необходимо учитывать, что они обладают рядом особенностей, усложняющих
их формализацию [2].
9

Во-первых, это стохастичность транспортных потоков – их характеристики


допускают прогноз только с определённой вероятностью. Транспортный поток
движется по транспортной сети, которая также обладает определёнными
характеристиками, допускающими более или менее строгое описание, и
которые являются нестационарными. Во-вторых, это не стационарность
транспортных потоков, причём колебания их характеристик происходят как
минимум в трёх циклах: суточном, недельном и сезонном. В-третьих, это
неполная управляемость, суть которой состоит в том, что даже при наличии
полной информации о потоках и возможности информирования водителей о
необходимых действиях, эти требования носят рекомендательный характер.
Решения о выборе маршрута или режима движения производится водителем с
присущими только ему субъективными факторами. В-четвёртых, особенностью
дорожного движения как объекта управления является сложность и даже
невозможность замера даже основных характеристик, определяющих качество
управления. Так, оценка величины интенсивности движения требует либо
наличия датчиков транспортных потоков на всех направлениях их движения,
либо использования данных аэрофотосъемки, либо проведения трудоёмкого
ручного обследования. В-пятых, принципиальная невозможность проведения
масштабных натурных экспериментов в сфере управления дорожным
движением. Эта невозможность предопределена, во-первых, необходимостью
обеспечения безопасности движения, во-вторых, материальными и трудовыми
затратами на проведение эксперимента (изменение разметки и дислокации
дорожных знаков) и, в-третьих, тем, что серьёзные изменения в комплексной
схеме организации движения затрагивают интересы большого количества
людей – участников движения.
Транспортный поток и комплекс условий, в которых он движется,
представляет собой типичный пример сложной системы, содержащей большое
количество взаимно связанных и взаимодействующих между собой элементов.
Движение транспортного потока является результатом непрерывного
взаимодействия между отдельными элементами системы «водитель –
10

автомобиль – дорога – окружающая среда» (ВАДС) как в пространстве, так и во


времени. Особенностью этой системы является функционирование в условиях
действия большого количества случайных факторов. Таким образом, трудности
формализации процесса движения транспортного потока являются серьезной
проблемой обеспечения адекватности моделей транспортного потока.
Целью всякого моделирования является исследование объекта вначале на
качественном, а затем, по мере накопления информации и развития модели, на
количественном уровне.
Целью моделирования дорожного движения является определение и
прогноз всех параметров функционирования транспортной сети, таких как
интенсивность движения, на всех элементах сети, объемы перевозок
общественного транспорта, средние скорости движения, задержки и потери
времени и т.д. Основным инструментом решения данных задач является
математическое моделирование. Под термином математическое моделирование
понимают описание явления посредством математических формул, уравнений и
неравенств. Классификацию математических методов моделирования и моделей
можно представить в виде таблицы 1.
11

Таблица 1 – Классификация математических моделей и методов


Основание Классы методов и моделей
классификации
Цели Описание процессов Оптимизация
Оценка систем
моделирования и систем систем
Принцип
Кибернетический Стохастический
моделирования
Применяемые
критерии оценки и Векторные Скалярные
оптимизации
Фактор времени Статические Динамические
Степень
абстракции Аналитические Вычислительные Имитационные
модели
Учет
Вероятностные
вероятностных Детерминированные
(стохастические)
факторов

Модели описания – это разомкнутые модели, предполагающие построение


описания объекта или процесса Р, содержащего функциональные или
алгоритмические связи между входами (m, u) и выходами Y (рисунок 1).

Рисунок 1– Структура модели описания


Входами являются внешние воздействия на объект (неуправляемые и
управляемые), выходами – реакция объекта или процесса.
Модели оценки позволяют оценить те или иные состояния комплекса
«объект–орган управления–среда». В структуре модели на технологические
характеристики связей между входами (m, u) и выходами Y объекта
накладывают укрупненные технологические характеристики Со (рисунок 1).
12

Рисунок 2 – Структура модели оценки


Для проведения оценки принято использовать целевые функции управляемого
объекта (или функции качества состояния) G=G(m, u).
Модели оптимизации предполагают постановку оптимизационной задачи.
Например, определить такое значение mМ , которое обеспечивает максимум
(минимум) G=G(m, u) .
Для анализа дорожного движения и транспортных сетей принято выделять
три основные группы моделей: прогнозные модели; имитационные модели;
оптимизационные модели [3]. Прогнозные модели предназначены для
моделирования транспортных потоков в сетях с известной геометрией и
характеристиками, при известном размещении потокообразующих объектов
города. При их помощи прогнозируется последствия в изменении транспортной
сети или размещении объектов. Целью прогноза загрузки транспортной сети
является расчет усредненных характеристик движения, таких как объемы
межрайонных корреспонденций, распределение участников движения по путям
движения, определение интенсивности движения на отдельных участках
транспортной сети. Модели этого типа применяются при поддержке решений в
области планирования развития города, для анализа последствий тех или иных
мер по организации дорожного движения, выбора альтернативных проектов
развития транспортной сети города.
Имитационное моделирование ставит своей целью воспроизведение всех
деталей движения и позволяет определить скорость движения, задержки на
перекрестках, динамику и длину очередей, другие характеристики движения.
Модели данного типа широко применяются при улучшении организации
движения. Прогнозные и имитационные модели дополняют друг друга.
13

Например, прогноз интенсивности движения служит в качестве исходных


данных для имитационного моделирования работы системы координированного
управления. В свою очередь улучшение условий движения приводит к
перераспределению транспортных потоков в транспортной сети. Маршрут с
лучшими условиями движения привлекает дополнительный объем движения.
Примечательно, что основные разработчики систем моделирования
дорожного движения в своих продуктах совмещают прогнозные и
имитационные модели. PTV AG выпускает два продукта – VISUM и VISSIM.
Первый из них решает задачи прогноза распределения транспорта по сети, а
второй выполняет задачи имитационного моделирования отдельных ее
элементов. Программа AIMSUN решает те же задачи, что и VISSIM – имитация
движения автомобилей по транспортной сети. Дополнительный модуль
PLANER позволяет производить расчет загрузки транспортной сети, так же как
и программа VISUM. Модели прогноза потоков и имитационные модели ставят
своей целью адекватное воспроизведение транспортных потоков. По своей сути
они являются моделями описания и различаются лишь степенью детализации
транспортной сети.
На основе моделей описания строятся модели оценки. В качестве
критериев оценки используют экономические (расход топлива, потери
транспорта, пешеходов и пассажиров в пути), экологические (выбросы
токсичных компонентов и транспортный шум), критерии безопасности
(конфликтная загрузка, шум ускорений или энергии). Функции оценки
характеристик транспортных сетей имеются как у пакета программ VISUM+
VISSIM, так и у программы AIMSUN.
Модели оптимизации решают задачи оптимизации маршрутов
пассажирских и грузовых перевозок, выбора оптимальной конфигурации сети,
расчета оптимальных сигнальных планов работы светофорной сигнализации.
При разработке оптимизационной модели основной задачей является
определение целевой функции и установка ограничений. В качестве целевой
функции обычно принимают функцию затрат на движение и проводят ее
14

минимизацию. В качестве ограничений выступают требования безопасности


движения или обеспечения минимальных потребностей в передвижении.

§ 1.2 Методы управления транспортными потоками


Транспортным потоком можно манипулировать тремя основными
способами – остановкой транспортных средств, изменением параметров
движения, информацией и изменением направления движения. В городских
условиях используются все вышеуказанные методы управления городским
движением автотранспорта.
Управление путем остановки транспортных средств. Подход к управлению
потоком автотранспорта путем остановки транспортных средств является
основным, и типичным примером выступает управление посредством
светофоров. На каждый транспортный поток, проходящий через перекресток,
воздействуют три основных световых сигнала – красный, желтый и зеленый.
Однако при своей внешней простоте, управляющие воздействия на
светофорную сигнализацию имеют достаточно сложную структуру,
обусловленную спецификой объекта управления. Данные воздействия можно
охарактеризовать как многомерный вектор, компонентами которого являются:
- длительности промежуточных фаз (переходных интервалов), во время
которых происходят закрытие и подготовка к открытию направлений движения;
- длительность цикла регулирования – интервал времени, в течение
которого происходит смена всех разрешенных тактов;
- распределение эффективной длительности цикла между фазами
регулирования;
- временные сдвиги между включениями фаз на соседних перекрестках,
влияющие на возможность безостановочного движения транспортных средств
по дорожной сети;
- последовательность фаз в цикле, обуславливающая очередность открытия
движений на перекрестке.
15

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


как многомерный вектор, состоящий из перечисленных параметров,
устанавливаемых для каждого перекрестка индивидуально. В качестве
исполнительных элементов, помимо светофоров, для остановки транспортных
средств могут применяться управляемые дорожные знаки, например «Въезд
запрещен», светофоры для выделенного направления движения или
механические препятствия - шлагбаумы.
Недостатком данного подхода, управление путем остановки, является
осложнение экологических условий, вызванных повышением расхода топлива
транспортными средствами для восстановления кинетической энергии после
остановки.
Управление путем изменения параметров движения. Управление путем
изменения параметров движения транспортных потоков заключается в том, что
транспортное средство не производит остановку, а лишь корректирует
параметры своего движения, например, соблюдая ограничение на скорость
посредством знака «Ограничение максимальной скорости» или ограничения
относительно полосы движения. Данный способ управления применяется не
только для гармонизации транспортного потока при управлении движением
относительно полос автомагистралей, но он так же имеет весомое значение и в
городских системах обеспечения безопасности движения, когда ограничение
максимальной скорости вводится перед опасным участками дорожного полотна
или предупреждает водителя об иной опасности.
Исполнителями в этом случае выступают управляемые дорожные знаки на
базе светодиодов. Информация на этих знаках несет оперативный характер, что
позволяет быстро отреагировать на изменяющиеся параметры транспортного
потока. Доказано, что динамически изменяемая информация на знаках,
построенных на данной базе, адекватнее воспринимается водителями, в
сравнении со статичными знаками.
Управление информацией и направлением движения. Третья категория
управления транспортным потоком основана на изменении маршрута движения
16

в результате получения водителем информации об условиях движения. Этот


способ управления все чаще используется в городах при перегрузке дорог и
заключается в направлении транспортного потока в обход участка, на котором
образуются заторы. В эту категорию управления входит управление
информацией, предназначенной как для индивидуального транспортного
средства (Vehicle Information and Communication System), так и в целом для
транспортного потока (Traffic Flow Information System).
Информационные и направляющие системы в зависимости от характера
объекта управления располагаются:
–непосредственно в автомобиле при управлении индивидуальными
транспортными средствами;
–рядом с дорогой при воздействии на весь транспортный поток.
Принципиальная разница между информационными и направляющими
системами заключается в том, что при управлении информацией водитель
получает информацию о транспортной ситуации на его пути, и принимает
решение о дальнейшем маршруте движения самостоятельно. При воздействии
направляющих систем транспортные средства направляются принудительно на
новый маршрут движения. В случае применения информационных систем в
индивидуальных транспортных средствах водитель может отказаться от
предложенного маршрута движения. Результаты некоторых европейских
проектов показали, что существенные изменения в транспортной ситуации
наблюдаются в том случае, если 10 – 15 % водителей следуют рекомендациям
информационных систем.
В случае применения направляющих систем, транспортные средства
направляются на новые маршруты движения управляемыми запрещающими и
предписывающими знаками. Этот способ управления предъявляет жесткие
требования к техническому оснащению, так как он нуждается в обозначении
маршрута движения по всей длине. В городских условиях при применении
информационных и направляющих систем необходима согласованность
изменения маршрутов движения с работой светофорных объектов. Светофорное
17

регулирование первоначально вводилось для обеспечения безопасного


пересечения конфликтующих транспортных потоков автомобилей и пешеходов.
Рост транспортного спроса вскоре показал, что при установке светофора
появляется возможность осуществлять (при обеспечении безопасности
движения) более или менее эффективное воздействие на транспортный поток в
рамках транспортной сети. Указанный эффект послужил основой при
разработке стратегий оптимального управления, выполняющих минимизацию
полного времени движения.
Светофорное регулирование – основной способ управления в
транспортных сетях городов. Современное состояние управления
транспортными потоками в большинстве городов можно вообще
характеризовать так, что устройства управления (узлы) управляются по
фиксированному графику или по состоянию транспортного потока (адаптивное
управление). Существенная разница заключается в том, что для управления по
графику времени не нужны детекторы, но система не способна реагировать на
какие-либо изменения транспортного потока. В случае адаптивного управления
имеются детекторы, которые фиксируют присутствие транспортных средств, и
устройство управления, реагирующее на мгновенные условия в узле или
транспортной сети.
Временно-зависимое (автономное) управление. Управление ведется по
временному графику. Применение метода требует всестороннего изучения
характеристик состояния транспортных потоков в районе управления.
Информацию получают путем статистического анализа данных о
характеристиках движения транспортных потоков (интенсивности и состава
движения) за прошлые годы, измеренных в характерных точках транспортной
сети, и на их основании определяется режим работы системы управления.
На основании эпизодических измерений параметров транспортных потоков
(X ) производится, в основном вручную, анализ эффективности действующих
планов – F z (X ) и сравнение ее с контрольными значениями – F kz ( X ) .
18

При F kz ( X ) – Fz ( X ) ≥ A производится перерасчет библиотеки планов


управления (координации) {Y i } и контрольных значений времен их действия
{t k } . Ввод в действие плана Y i , производится при совпадении реального

времени t r с контрольным t k .
При расчетах оптимизируется длительность разрешающих сигналов,
продолжительность цикла и временной сдвиг. Затем они вводятся в устройства
управления и производят смену сигнальных планов в зависимости от времени
суток или дня года.
Временно-зависимое управление имеет определенные преимущества:
– возможность простого контроля,
– простота модификации сигнальных планов,
– относительно низкие расходы на оборудование и установку.
Вместе с тем, имеются существенные недостатки метода:
– невозможно повысить эффективность использования времени
разрешающих сигналов;
– нельзя покрыть пики интенсивности;
– нельзя устранить возникшие транспортные заторы.
Транспортно-зависимое (traffic-responsive) управление характеризуется
тем, что для различных состояний транспортных потоков на сети заранее
рассчитываются сигнальные планы, которые хранятся в устройствах
управления или в центре управления движением. В области управления
устанавливаются стратегические детекторы транспорта. Логика управления
производит выбор конкретных сигнальных планов по состоянию транспортного
потока в зоне расположения указанных детекторов транспорта.
Смена сигнальных планов происходит в результате анализа параметров
транспортных потоков, который обычно сводится к их усреднению в течение
заранее заданного периода времени Ту и получению оценки:
n r
r  Xi
X  Ty   1
n (1)
19
r
где п – количество измерений в течение Ty X
; i – многомерный вектор –
результат измерения параметров в заранее заданных сечениях дорожной сети.
r
X  Ty 
После получения оценки формулой (1), осуществляется подбор
r
Xk  i
ближайшего многомерного контрольного вектора по формуле (2) из
r
R
заранее заданного множества (i=1..M) по минимуму вектора разницы min :
r r r
X i  Ty  R  X k  i   Rmin
(2)
Для каждого контрольного вектора имеется заранее рассчитанный сигнальный
план. При принятии решения о вводе сигнального плана взамен действующего
необходимо учитывать наличие переходного интервала Tпеp, в течение которого
эффект от координированного управления резко снижается и практически
становится равным нулю. Поэтому решение о смене плана координации Yi, на
план Yj целесообразно принимать при условии:
Fэ  Yi  Ty  Fэ  Y j   Ty  Tпер  ,
(3)
где Fэ(Yi) – эффективность управления за единицу времени при действующем
плане; Fэ(Yj) – эффективность нового плана.
Практические исследования, проведенные на действующих системах,
показывают, что длительность Tпер составляет два – три цикла управления.
Оценки Fэ(Yj) и Fэ(Yi) могут быть получены моделированием. Длительность Tу
может быть выбрана по критерию минимальной ошибки усреднения
измеряемых параметров. Практически невозможно оборудовать детекторами
транспорта все разрешенные направления движения в районе управления.
Обычно возникает необходимость выбора представительного подмножества
точек измерения. В этом случае целесообразным было бы соблюдение
следующего равенства:
dX * dX  t 

dt dt (4)
20

где левая часть представляет полную производную изменения нормы вектора


параметров в точках измерения, правая – полную производную нормы вектора
параметров на всех разрешенных направлениях движения.
Соответствующим подбором точек измерения возможно обеспечить:
dX * dX  t 
 C (5)
dt dt
где С – допустимое отклонение.
Методика выбора точек измерения основана на трудоемких длительных
измерениях с выявлением максимальной области представительства в каждой
предполагаемой точке.
Управление в реальном времени. Под этим термином понимается такое
системное управление, при котором запаздывание управляющих воздействий,
рассчитываемых в процессе функционирования системы, не превышает
интервала, при котором можно пренебречь нестационарностью транспортных
потоков. Системы, реализующие управление в реальном времени, получили
название адаптивные системы управления дорожным движением (Adaptive
Traffic Control Systems - ATCS). Они требуют наличия развитой системы
контроля состояния транспортных потоков и коммуникационной
инфраструктуры, обеспечивающей связь периферийного оборудования с
управляющим центром. Адаптивные системы управления дорожным
движением, как правило, оптимизируют в реальном времени некоторый
функционал:
Q  X ,U   min
(6)
где X – вектор состояния управляемых объектов; U – вектор соответствующих
управляющих воздействий.
Хотя соответствующая задача об оптимальном управлении может быть
сформулирована для любой транспортной сети, ее решение в реальном времени
и реализация в системе управления имеет ряд особенностей:
21

– переключение режимов красный-зеленый светофора требует введения


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

§ 1.3 Модель сетевого движения


Модель сетевого движения определяется в виде графа. Основными
элементами модели сетевого движения являются:
– узлы («nodeType») (таблица 2):
– связи («edgeType») (талица 3);
– группам полос движения ("lane_groupType") (таблица 4).
Таблица 2 – Спецификация узла графа
Атрибуты
Наименование Тип Описание
tlLogic tlLogicType Задает схему движения по фазам
connection connectionType Определяет внутренние соединения (задает
направление движения в пределах
перекрестка)
priority_rule priority_ruleType Описывает правила приоритета
Id Int Уникальный идентификатор
type traffic_light Светофорное регулирование;
roundband Круговое движение;
22

Продолжение таблицы 2
type priority Нерегулируемое пересечение с
установленным приоритетом проезда;

OD_connector Узел, зарождаются и гашения


корреспонденции;

not_defined Не определенный

inEdg array Массив входящих в перекресток перегонов


outEdg array Массив выходящих из перекрестока
перегонов

Таблица 3 – Спецификация связи (перегона) графа


Атрибуты
Наименование Тип Описание
Id Int Уникальный идентификатор
From и To NodeType Определяют направление
связи (от узла "from" к узлу
"to")
length unsignedLong Определяет длину связи
typeRoad CityMainRoad Магистральная улица
общегородского значения
Highway Шоссе
MainRoad Магистральная улица
районного значения
MinorRoad Второстепенная улица
Journey Проезд
lane_group lane_groupType Определяет группы полос
движения в пределах
сегмента.
internalJunction internalJunctionType Определяет внутренние
соединения в связи
23

Таблица 4 – Спецификация группы полос графа


Атрибуты
Наименование Тип Описание
Id Int Уникальный идентификатор
lanes Int Определяет количество полос в
группе
maxSpeed unsignedLong Определяет максимальную
скорость по полосе.
idealSaturation Float Определяет идеальный поток
насыщения
saturationSettingsID Int Определяет идентификатор
справочника для расчета
потока насыщения.
disAllowed array Указывает для каких типов
транспортных средств
запрещено движение

Состояние сети определяется для зон области управления по отдельным


временным периодам, ее представление в форме xsd-схемы приведено в
приложении А. Модель предусматривает возможность оценки состояния сети
по элементам сети:
- связям ("edgState" - e);
- сегментам связи ("segmentState" - s);
- группам полос движения ("laneGrouptState" - l).
Для каждого элемента сети могут быть определены следующие атрибуты:
- идентификатор элемента связи "idEdgElement"(e,s,l);
- случайная задержка "uniformDelay" (l);
- задержка управления "incrementalDelay" (l);
- задержка перенасыщения "totalDelay" (l);
- суммарная задержка "totalDelay" (l);
- остаточная очередь "initialQueue" (l);
- максимальная очередь в цикле "maxQueue" (l);
- максимальное положение фронта очереди в цикле "maxFrontQueue"(l);
- временной шаг построения профилей "timeStepProfile" (l);
- входящий профиль "InProfile" (l);
- профиль отъезда "OutProfile" (l);
- профиль насыщения "GoProfile" (l);
24

- профиль очереди "QueueProfile" (l);


- профиль вероятности прибытия автобусов "BusDepProfile" (l);
- время движения в свободных условиях "freeTravelTime" (e,s,l);
- время движения в текущих условиях "currentTravelTime" (e,s,l);
- загруженность "capacity" (l);
- поток насыщения (пропускная способность) "currentSaturation" (l);
- плотность транспортного потока "density" (s);
- интенсивность движения "flow"(e,s,l).
Касательно оставшихся элементов, которое обеспечивают поддержку
расчетов и хранение личной информации (узла, связи и группы полос) так же
приведены в Приложении А.

§ 1.4. Макроскопическое моделирование транспортного потока


Макроскопические модели транспортного потока воспроизводят
агрегированные свойства взаимодействий транспортных средств, используя для
этого макроскопические переменные:

– средняя скорость v ( x , t ) м/ч;

– плотность транспортного потока ρ ( x , t ) авт/км;

– интенсивность движения q ( x ,t ) , авт/ч;


В выражениях выше x и t представляют соответственно переменные
пространства и времени.

Плотность транспортного потока ρ(x,t) представляет собой число


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

с помощью средней дистанции d̄ и числа автомобилей N vech как:


N vech N vech 1
  Nvech 
L d
 di
i 1 , (7)
25

где L – длина рассматриваемого сегмента транспортной сети.

Интенсивность q ( x ,t ) (или объем движения) является числом транспортных


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

быть определена как обратная величина среднего времени проезда h̄ .

Рассматривая период времени Δt , интенсивность движения может быть


выражена как:
N veh N veh 1
q  Nveh 
t h
 hi i 1 . (8)

Средняя скорость v (x,t ) может быть определена как средняя временная и


пространственная скорость:
– средняя временная скорость это среднее арифметическое скоростей
транспортных средств, которые проходят сечение во время определенного
периода.
– пространственная средняя скорость это среднее арифметическое
скоростей транспортных средств, которые присутствуют в сегменте дороги в
определенное время.
Модели данного типа были разработаны для математической интерпретации
зависимости между скоростью, плотностью и интенсивностью транспортного
потока:
q ( x ,t )=v ( x , t )⋅ρ ( x , t ) ; (9)

v ( x, t )=f ( q ( x, t ) , ρ ( x ,t ) ) , (10)

где f ( ¿ ) – некоторая функция.


Зависимость интенсивности движения q от плотности транспортного
потока  принято называть фундаментальной (или основной) диаграммой
транспортного потока (рисунок 3) [4]. Левая часть кривой (показана сплошной
линией) отражает устойчивое состояние потока, при котором по мере
увеличения плотности транспортный поток проходит фазы свободного, затем
26

частично связанного и наконец связанного движения, достигая точки


максимально возможной интенсивности, т. е. пропускной способности
(точка qmax = Рa).

Рисунок 3 Диаграмма транспортного потока в координатах q – 

В процессе этих изменений скорость потока падает – она характеризуется


тангенсом угла наклона α радиус–вектора, проведенного от точки О к любой
точке кривой, характеризующей изменение q. Соответствующие точке qmax = Рa
значения плотности и скорости потока считаются оптимальными по
пропускной способности (опт и vопт). При дальнейшем росте плотности (за
точкой Ра перегиба кривой) поток становится неустойчивым (эта ветвь кривой
показана прерывистой линией). Переход потока в неустойчивое состояние
происходит вследствие несинхронности действий водителей для поддержания
дистанции безопасности (действия «торможение–разгон») на любом участке
пути и особенно проявляется при неблагоприятных погодных условиях. Все это
создает «пульсирующий» (неустойчивый) поток.
В точках О и max интенсивность движения q = 0, т. е. соответственно на
дороге нет транспортных средств или поток находится в состоянии затора
(неподвижности). При изменении состояния покрытия, условий видимости для
водителей, состава потока, вертикального и горизонтального профилей дороги
изменяется характер диаграммы.
27

Транспортный поток можно рассматривать как поток одномерной


сжимаемой жидкости, допуская, что поток сохраняется и существует
однозначная зависимость между скоростью и плотностью транспортного
потока. Первое допущение выражается уравнением неразрывности, второе –
функциональной зависимостью между скоростью и плотностью для учета
уменьшения скорости движения автомобилей с ростом плотности потока.
Модель Лайтхила-Уизема-Ричардса (LWR-модель). Модель
транспортного потока была предложена в работах [5, 6] и известна как LWR-
модель или модель первого порядка. Ключевая идея LWR–модели состоит в
том, что интенсивность транспортного потока q может быть выражена как
функция плотности  и наличием фундаментальной зависимости между
макроскопическими переменными. В модели предполагается:
– существование взаимно-однозначной зависимости между скоростью
v ( t , x ) и плотностью потока ρ ( t , x ) ;
– выполнение закона сохранения массы (числа транспортных средств).
Первое предположение выражается условием:
v ( t , x )=V ( ρ ( t , x ) ) . (11)
Если обозначить интенсивность транспортного потока как
q ( ρ ) =ρV ( ρ ) , (12)
то второе предположение будет выражаться законом сохранения:
∂ ρ ∂q ∂ ρ
+ =0
∂t ∂ ρ ∂x . (13)
Данное дифференциальное уравнение первого порядка в частных
производных может быть решено при использовании метода характеристик.
Идея этого численного подхода состоит в том, чтобы сократить
дифференциальное уравнение в частных производных до уравнения полного
дифференциала, используя:
ρ ( x , t )=f ( x−ct , 0 ) ; (14)
28

где f – произвольная функция, определенная комбинацией начальных и


граничных условий.

В линейном волновом уравнении каждая начальная величина ρ0 =ρ ( x 0 , t 0 )

∂x
c=
перенесена незатухающей волной со скоростью ∂t по прямым линиям во
временной и пространственной области. Эти линии называют
характеристическими линиями.
dq
Модель не линейна, так как dρ зависит от плотности и скорости волны,

dq
(ρ)
содержащей dρ . Каждая начальная величина ρ0 =ρ ( x 0 , t 0 )
перенесена с
различными скоростями, и, таким образом, характеристики могут или

пересекаться или отклоняться. Когда функция плотности ρ0 =ρ ( x 0 , t 0 )


является возрастающей функцией x, эти характеристики располагаются ближе и
могут пересекаться друг с другом. Пересечение двух характеристик
непрерывно в плотности распределения (ударные волны), которые двигаются со
скоростью:
q ( x 2 ) −q ( x 1 )
с=
ρ ( x 2 ) −ρ ( x 1 )
. (15)
Один из способов определения зависимости, описывающей соотношение
«скорость-плотность», позволяет получить выражение:
1
ρ ( v )=
L+c 1 v + c2 v 2 , (16)

где L – средняя длина транспортного средства, c 1 – время реакции водителя,

с; c 2 – коэффициент пропорциональности тормозному пути.


В зависимости от дорожных условий формула (2.6) может принимать
различные виды. Для нормальных условий формула имеет вид:
29

1
ρ ( v )=
5,7+ 0,504⋅v +0, 0285⋅v 2 ; (17)
Для мокрого асфальта формула имеет вид:
1
ρ ( v )=
5,7+0,504⋅v +0, 0570⋅v 2 ; (18)
При гололеде формула записывается в виде:
1
ρ ( v )=
5,7+ 0,504⋅v +0, 1650⋅v 2 . (19)
Допущения о неразрывности и сохранении транспортного потока
теоретически могут привести к отрицательной величине плотности или
скорости. Очевидно, одному значению плотности может соответствовать
несколько значений скорости. Поэтому для второго допущения средняя
скорость потока в каждый момент времени должна соответствовать
равновесному значению при данной плотности автомобилей на дороге.
Равновесная ситуация – чисто теоретическое допущение и может наблюдаться
только на участках дорог без пересечений.
Дискретная форма модели первого порядка. Данная модель была
разработана с целью уменьшения вычислительных сложностей непрерывных
моделей. В этой модели связь длиной d и число автомобилей в каждой ячейке
обновляется для каждого временного шага t. автомобильной дороги разделена
на множество небольших секций или ячеек, i
Все автомобили в ячейке i движутся в расположенную по ходу движения
ячейку i + 1. Средняя скорость вычисляется от интенсивности и плотности:
1
ρ ( i, k +1 ) −ρ (i , k ) = [ Y ( i, k )−Y ( i+1, k ) ]
v (i , k ) (20)

где
  J
Y  i, k   min v  i, k    i, k  , qmax , w  i, k     i, k   .
Уравнение (2.10) может быть эквивалентно представлено в виде:
T
  i, k  1    i, k   Y  i, k   Y  i  1, k  
L , (21)
30

где i – индекс ячейки, и k– индекс времени; ρ ( i, k ) – плотность в ячейке i в

периоде времени k; v ( i, k ) – скорость в ячейке i в периоде времени k; w ( i , k ) –

скорость ударной волны в ячейке i в периоде времени k; q max – максимальный


поток ячейки, который будет идентифицирован как постоянный параметр –

пропускная способность; ρJ – плотность при заторе.


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

Выводы по главе 1
1. Теория транспортных потоков сформировалась как научное направление
в начале 1950—х года, но до 1960-х годов находилась в стагнации, не считая
выдвинутой идей в 1955 году. С приходом персональных компьютеров, в начале
1960-х годах, получило резкий скачет в развитии, а с 1970-х по 1980-х гг, так же
характеризуется стагнацией. Лишь в 1990-х гг. возродился интерес к данной
дисциплине, возникали новые направления для исследования. На фоне
возросшего интереса, стали возникать как имитационные так и
прогнозирующие модели
2. Стала возможным управление транспортным потоком посредством трех
основных подходов, наиболее применим к городским условие выступил подход
к управлению транспортным потоком посредством остановки транспортных
средств, воздействуя на сигнальный план светофорных объектов и дорожных
знаков. Что поспособствовало к возникновению адаптивных систем управления
дорожным движением в реальном времени.
Было приведены спецификации, позволяющие описать модель сетевого
движения, как на организационном уровне так и на физическом уровне.
3. Транспортный поток можно рассматривать как поток одномерной
сжимаемой жидкости, допуская, что поток сохраняется. При этом существует
однозначная зависимость между скоростью и плотностью транспортного
потока.
31

4. Формализованное описание состояния транспортного потока на


пересечении заключаться в определении состояния ячеек модели на входах и
выходах пересечения. Для решения этой задачи необходимо выделить
элементарные операторы преобразования транспортного потока.
32

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

§ 2.1 Математическая модель сетевого движения


Периодичность работы светофорного объекта формирует на выходе группы
автомобилей, движущиеся по исходящим транспортным связям. Было замечено,
что вследствие дисперсии скоростей транспортных средств, происходит
изменение параметров группы вплоть до ее полного распада [7]:

[ ]
2
D D
f ( τ )= 2
D
exp
τ

τ̄ ( )
τ σ √ 2π 2σ 2 , (22)
где D – расстояние от стоп-линии до точки наблюдения;  – индивидуальное
время прохождения автомобилем расстояния D; τ̄ – среднее время
прохождения расстояния D;  – дисперсия скорости.
Распределение времени прохождения используется для преобразования
профиля транспортного потока при движении по транспортной связи на
дистанцию D:
q 2 ( t 2 ) dt 2 =∫ q 1 ( t 1) f ( t 2 −t 1 ) dt 1 dt 2
t1 (23)
q 2 ( t 2 ) dt 2
– общее количество автомобилей, проходящих через некоторую
где
точку, расположенную на некотором расстоянии от стоп-линии в интервале
d 1 ( t 1 ) dt 1
(t, t+dt); – общее количество автомобилей, проходящих через стоп-

линию; f ( t 2 −t 1 ) – плотность вероятности времени движения ( t 2 −t 1 )

Прибывающий к перекрестку поток характеризуют изменением во времени

при постоянных средних характеристиках интенсивности q ( t ) . На выходе с


перекрестка поток определяется временной длиной р группы автомобилей и
'
средней интенсивностью потока q в течение эффективного зеленого сигнала
(рисунок 4).
33

Рисунок 4 Аппроксимация группового движения кусочно-постоянной функцией


Временная длина определяется следующим образом:
p= p' + p p ' ' , (24)
где р' – длительность эффективного зеленого сигнала.

Величина p'' обусловлена поворотными потоками на перегоне и


рассчитывается по формуле:
q пов T
p'' =
q' , (25)

где q пов – суммарная интенсивность поворотных потоков.

Причем величина q' связана со средней интенсивностью q, соотношением:


qT
q' =
t эф ; (26)

где t эф – эффективная длительность зеленого сигнала.


По мере удаления от перекрестка характеристики (модельные) потока
изменяются. Если t – среднее время движения (от перекрестка) до

рассматриваемого сечения перегона, то в этом сечении p ( t ) и q ( t ) могут быть


определены по формулам:
0 .008 t
p ( t )= p ( 0 ) e , (27)
p ( 0)
q ( t )=q ( 0 )
p (t ) , (28)
34

p ( 0 )= p' + p' ' , (29)


q ( 0 )=q ' . (30)

Причем, если оказывается, что p ( t ) >T , то в силу физических

соображений принимается p ( t )=T . Длительность задержки z и число


остановок N транспортных средств (за цикл) могут быть определены
следующим образом:
q⋅α 2 q q β2
z=q⋅r⋅α +
2 C ( )
−1 + q⋅γ⋅β +q⋅ −1 ⋅ ;
C 2 ( ) (31)
где
C⋅r C⋅γ
α=min x ,( ) ( )
C−q
; β=min p ,
C−q
;

q⋅x
γ =max (0, r + −τ ) ; x=max ( τ+ p−T , 0 ) ;
C
N=q ( α+β ) .
К недостаткам приведенной модели сетевого движения следует отнести
фиксированную степень дисперсии группы автомобилей и предположение о
том, что все прибывающие к перекрестку автомобили останавливаются на стоп-
линии.
Модель TRANSYT [8,9]. Моделирование движения производится на основе
преобразования профилей транспортных потоков при их движении по
транспортным связям и через перекрестки. Различают три типа профилей – IN-
профиль, GO-профиль и OUT-профиль.
GO-профиль (профиль потока насыщения) – это норма потока, который
проезжал бы через стоп-линию при насыщенном разрешающем сигнале.
Фактически GO-профиль представляет собой профиль потока насыщения на
регулируемом пересечении. Для конфликтующих потоков GO-профиль
определяется согласно соответствующим моделям просачивания.
OUT-профиль (профиль исходящего потока) – это профиль потока,
фактически проезжающего стоп-линию. При наличии очереди OUT-профиль
35

равен GO-профилю, после разъезда очереди на оставшееся время эффективного


разрешающего сигнала OUT-профиль равен IN-профилю:

{
0, если u (t )=0
OUT t = GO t , если u ( t )=1 и m t >0
IN t , если u ( t )=1 и m t =0
;, (32)

где u (t) – бинарная функция управления, принимающая значение «1» при

включенном разрешающем сигнале и «0» при запрещающем; mt –


количество автомобилей в очереди.
Количество автомобилей в очереди определяется следующей итерационной
процедурой:
m t =max { ( m t −1 +q t −s t ) , 0 }
, (33)

где mt – число автомобилей в очереди в интервале времени t на данной связи;


qt – число автомобилей, прибывающих за интервал t согласно IN-профилю;
s t – число автомобилей, отъезжающих за интервал t, согласно GO-профилю.

На каждой внутренней связи сети происходит преобразование OUT-


профиля в соответствующий IN-профиль следующим рекуррентным
уравнением:
v ( t + βT )= F⋅v t + [ (1−F )⋅v ( t + βT−1 ) ]
, (34)
v ( t+ βT ) t+βT
где – предсказанная интенсивность в интервале времени
предсказанной группы;
vt – интенсивность начальной группы во время шага t; β ("бета") –
эмпирический фактор, равный в общем случае 0.8;
T – время прохождения маршрута на связи, в шагах; F – фактор сглаживания,
В основе популярности TRANSYT лежит возможность калибровки модели,
что обеспечивает высокую реалистичность результатов. В идеале PDF должен
быть откалиброван таким образом, чтобы профили потока модели как можно
ближе соответствовали наблюдаемым профилям потока.
36

При использовании пошагового моделирования TRANSYT явно определяет


остаточную очередь (если она существует) и, соответственно, задержку
перенасыщения d 3 . В тех случаях, когда пропуск левоповоротных потоков

производится с конфликтом (permitted moving vehicles) для формирования GO–


профиля необходимо решить задачу описания просачивания левоповоротных
потоков (рисунок 5).

Рисунок 5 – Просачивание левоповоротных потоков


В TRANSYT данная задача решается применением следующей модели:

GO perm ( t )=
{ 0 если конфликтные потоки насыщены
MFR ( t ) при разъезде конфликтных потоков ,

где MFR ( t ) – интенсивность просачивающихся потоков.

В TRANSYT реализовано несколько моделей для вычисления MFR ( t ) –


модель Australian Road Research Board (ARRB), FHWA/TRC и др.
37

§ 2.2 Поток насыщения в транспортной сети


Расчету режима регулирования предшествует составление базисных схем
движения транспортных и пешеходных потоков в основных тактах, при этом
определяется специализация полос движения [10] (т.е. определяется, потоки
каких направлений движения будет обслуживать каждая из полос).
Полосы движения на подходах к регулируемым перекресткам делятся на
два типа:
– выделенные полосы, на которых разрешается движение только в одном
направлении (например, только левые повороты);
– полосы с распределением потоков, на которых разрешается движение по
разным направлениям (например, движение прямо и направо).
При проектировании регулируемого перекрестка необходимо определить
количество групп полос на каждом из подходов к перекрестку и количество
полос в составе каждой группы. Группа полос может обслуживать от одного до
нескольких направлений движения на регулируемом объекте.
При формировании групп полос можно руководствоваться следующими
положениями:
– выделенная левоповоротная или правоповоротная полоса (полосы)
рассматривается как отдельная группа полос;
– если на подходе к перекрестку имеется выделенная право- или
левоповоротная полоса (или обе), все остальные полосы, как правило,
объединяются в одну группу полос.
Если две или более полос движения объединяются в группу, то в
последующих расчетах эти полосы рассматриваются как единое целое.
В таблице 5 приведены формулы расчета коэффициентов, позволяющих
скорректировать значение идеального потока насыщения, учитывая реальные
условия движения на конкретном рассматриваемом пересечении. Коэффициент,
учитывающий ширину полосы движения f Ш . Значение ширины полосы

движения может варьировать в пределах от 2,4 до 4,8 м. Полосу движения


шириной более 4,8 м следует рассматривать как две узкие полосы движения.
38

Коэффициенты, учитывающие величину продольного уклона f у . Значение

величины продольного уклона на подходе i может меняться к перекрестку в


пределах от –6% до +10% («минус» – означает, что поток на подходе движется
на спуск, «плюс» – поток движется на подъем).
Таблица 5 – Рекомендуемые значения коэффициентов
Коэффициент, Формула определения Переменные,
учитывающий коэффициента используемые в расчете
(b  3,6)
ширину полос fØ  1  b – ширина полосы, м
9
i – величина продольного
i
продольный уклон fÓ  1  уклона на подходе к
2000
перекрестку, ‰
n – число полос в группе;

18nì nм – число маневров,


наличие уличных n  0,1 
3600 связанных с
стоянок fÏ 
n паркированием ,
маневров/ч
n – число полос в группе
14, 4nî ñò движения;
n
остановки автобусов 3600
fÀ  nост – число случаев
n
остановки автобусов/ч
в центральном районе fТ= 0,9, в
тип территории –
других районах fТ= 1,0
Nгр – интенсивность
движения в группе полос,
неравномерность прив.ед./ч;
f Í  N ãð / ( N ãð max n)
загрузки полос Nгр max – интенсивность
движения движения на максимально
загруженной полосе в
группе, прив.ед./ч

Коэффициент, учитывающий наличие уличных стоянок fП. Автомобили,


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

среднем, на 18 с. Учитываются только те уличные стоянки, которые находятся


на расстоянии не более 75 м до или после рассматриваемого перекрестка. При
наличии более 180 маневров/ч принимается предельное значение – 180
маневров/ч. При 0 ≤ nм ≤ 180 значение коэффициента f П ≥ 0,05 . При

отсутствии уличной стоянки значение коэффициента fП принимается равным


1,0.
Коэффициент fA учитывает помехи, создаваемые потоку, движущемуся
по группе полос, вдоль которой размещен остановочный пункт автобусов.
Учитываются только те остановочные пункты, которые находятся на расстоянии
не более 75 м до или после рассматриваемого перекрестка. В случае, если на
остановочном пункте останавливается более 250 автобусов/ч, необходимо
принимать предельное значение, равное 250 автобусов/ч. В среднем величина
помехи от одного остановившегося автобуса принимается равной 14,4 с в
течение зеленого сигнала светофора. При 0 ≤ nост ≤ 250 значение
коэффициента f A ≥ 0,05.
Коэффициент, учитывающий тип территории fт . Коэффициент
учитывает относительное снижение потока насыщения в центральных районах
города по сравнению с остальными районами. Здесь учитывается совокупность
узких улиц, частого паркирования, деятельности общественного транспорта,
малых радиусов поворотов, ограниченных возможностей использования
выделенных левоповоротных полос движения, большого количества пешеходов.
Коэффициент, учитывающий неравномерность загрузки полос движения
f н . Коэффициент учитывает неравномерное распределение транспортного

потока по полосам в группе полос, включающей более одной полосы.


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

всего, геометрические особенности рассматриваемого регулируемого


40

пересечения. Возможны три случая: правоповоротное движение


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

движение, различают два случая: движение налево осуществляется в конфликте


с противоположным приоритетным транспортным потоком; левоповоротный
поток движется без конфликта.
В случае отсутствия конфликта левоповоротный поток рассматривается
аналогично правоповоротному потоку. В случае движения с конфликтом или
при сочетании бесконфликтного движения и движения с конфликтом
(например, при ранней «отсечке») используется специальная процедура расчета
коэффициента f лп .
Коэффициенты, учитывающие помехи, создаваемые пешеходами лево- и
правоповоротным транспортным потокам, f Лпеш и f Ппеш . Для определения

этих коэффициентов применяются специальные расчетные процедуры. При


этом для левоповоротных потоков учитывается не только конфликт с
пешеходным потоком, но и одновременный конфликт с транспортным потоком
41

§ 2.3 Определение параметров начального цикла светофорного


объекта
При управлении светофорными объектами возможно использование двух
подходов к формированию схемы разъезда:
– пофазное управление, при котором движение с каждой из групп полос
движения осуществляется только в одной фазе;
– управление по направлениям, когда движение с групп полос движения
осуществляется только в двух и более фазах. При пофазном управлении расчет
исходной длительности светофорного цикла и фаз не представляет
сложности [11, 12].
Основная сложность, при управлении по направлениям, выступает определение
фазовых коэффициентов. Первый шаг в определение параметров начального
цикла светофорного объекта заключается в расчете (обновлении) поток
насыщения для каждой из групп полос [10]:
S=S 0 ∙ n ∙ f Ш ∙ f У ∙ f П ∙ f Ф ∙ f ЛП ∙ f ПП ∙ f ПЕШ ∙ f ГР (35)
где S0 – идеальный поток насыщения, по умолчанию 1920 авт/ч;
n – количество полос движения в группе полос движения;
fШ – коэффициент, учитывающий ширину полосы движения;
fУ – коэффициент, учитывающий продольные уклоны;
fП – коэффициент, учитывающий влияние припаркованных автомобилей;
fФ – коэффициент, учитывающий влияние останавливающихся на проезжей
части автобусов;
f ЛП – коэффициент, учитывающий помехи, создаваемые левоповоротными
потоками;
f ПП – коэффициент, учитывающий помехи, создаваемые правоповоротными
потоками;
f ПЕШ – коэффициент, учитывающий помехи, создаваемые пешеходами;
f ГР – коэффициент, учитывающий помехи, создаваемые грузовыми
автомобилями (при использовании данных в физических автомобилях).
Формулы для расчета корректирующих коэффициентов:
42

b−3.6
f ш=1+ (36)
9
где b – ширина полос движения, м.
i
f у =1− (37)
2000
где i – величина продольного уклона на подходе к перекрестку, %.
18 ∙n м
n−0.1
f П=
3600 (38)
n
где n – величина полос движения; n м – число маневров, связанных с

парковкой.
14.4 ∙ na
n−
f А=
3600 (39)
n
где na – количество остановок автобусов, уд/ч
100
f ГР = (40)
100+ PГР (Е ГР −1)
где PГР – процент грузовых автомобилей в соответствующей движущейся
группе полос движения, %; Е ГР – коэффициент проведения к легковому
автотранспорту Е ГР =2,0 .
Был опущен коэффициент f ПЕШ , учитывающие снижение пропускной

способности из-за конфликта с пешеходами. Таа как конфликт пешеходных и


транспортных потоков в одной фазе не допустим [9]. По этой причине они
должны приниматься равными «1» и при проектировании подобная ситуация
должна исключаться.

На втором шаге определяются фазовые коэффициенты yk для каждой


группы полос движения по формуле:

qk
yk  , (41)
Sk
где q k – интенсивность движения по группе полос движения, авт/ч;
Sk – поток насыщения по полосе движения k, авт/ч.

Третьим шагом определяется множество полос движения O^ пропуск


транспорта, по которым осуществляется только в одной фазе и множество
43

полос B^ , движение транспорта по которым производится в двух и более


транспортных фазах.
На четвертом шаге производится определение фазовых коэффициентов на

множестве O^ следующим образом:


^
Y n =max ( y m)
, m∈O∧m∈n (42)
Для фаз, значение которых не было определено по формуле (42)
устанавливается значение фазового коэффициента равным нулю (другими
словами если в фазе нет групп полос, которые пропускаются только в данной
фазе).

На пятом шаге, для групп полос движения b∈ B^ проверяют условие:

 
b   yb   Ybn   0. (43)
 n  Bˆ 

Если условие выполняется, то:

- находим все фазы с Ybn  0 и распределяем


b между ними:
b
Ybn  Ybn 
size  bn 
, (44)

где
Y bn – фазовые коэффициенты тех фаз n, в которых производится
движение с группы полос движения b;
size  bn 
– оператор определения количества фаз, в которых пропускается

транспорт по полосе b и выполняется заданное условие Ybn  0 .

Если таких фаз нет, то находим фазу с меньшим значением Ybn и


выполняем:

Ybn  Ybn   b . (45)


На шестом, производится расчет длительность цикла регулирования:
44

1,5  t j 5
С J
(46)
1   Yn
N
,где Т – длительность цикла, с;

∑t j
J – сумма всех фаз, длительность которых фиксирована (переходных

тактов, пешеходных фаз и т.д.), j∈J ;


Y n – фазовые коэффициенты транспортных фаз, n∈N ;

J – множество фаз, длительность которых фиксирована;


N – множество транспортных фаз, длительность которых подлежит
определению.

Расчет завершается определением длительность транспортных фаз gn


для

каждого светофорного объекта соответственно:

 


T  J j  Yn
t
gn  (47)
 Yn N .

§ 2.4 Балансировка транспортного спроса и предложения


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

Введем следующие обозначения: J – множество транспортных связей


области управления; N – множество регулируемых пересечений.
Рассмотрим процесс формирования транспортного потока в пределах
отдельного пересечения (рисунок 31) происходит преобразование
входящих q arriv
a транспортных потоков в исходящие qleaving
a .
arriv
Каждый из входных потоков qa в пределах перекрестка делится на m
потоков следующим образом:
q arriv
a =∑ β a ,b q arriv
a (48)
arriv
где β a ,b – доля входящего потока q a , движущегося со связи a на связь b,
∑ β a , b=10 ;
a – множество связей, входящих в перекресток, a ∈ J ; b – множество связей,

исходящие из перекрестка,
b ∈ J ; J – множество транспортных связей области управления.

Рисунок 31 – Формирование транспортных потоков на пересечении


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

qleaving
b =∑ β a , b qarriv
a (49)
a
46

Для получения всех значений интенсивностей движения на связях сети


необходимо выполнение следующей итерационную последовательность
действий:
1. задаем кортеж M , определяющий интенсивность входящих потоков на
связях j;
2. задаем кортеж K, который будет включать связи транспортной сети, для
которых определены все входящие потоки;
3. выполняем расчет входящих потоков для связей кортежа M по
формуле (48);
4. связи, для которых определены все входящие потоки, перенесем в
кортеж Q;
5. выполним расчет исходящих потоков по формуле (49);
6. если кортеж M не пуст, выполняем п. 3 – 5, иначе процедура
завершается.
Балансировка спроса заключается в установке транспортного спроса на
входах в зону управления или доли поворотных потоков таким образом, чтобы
минимизировать расхождение между данными наблюдений и
сбалансированным спросом:
¿ x obs balans
i −xi ∨¿→ min
n
, (50)
∑¿
i=0

при ограничениях:
min balans max
xi ≤ xi ≤ xi .
(51)

§ 2.5 Модель задержки и очереди на изолированном перекрестке


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

дорожным движением получили распространение модели, сочетающие в себе


как детерминированную, так и стохастическую составляющие задержки.
Детерминированная составляющая задержки определяется в условиях
стационарности движения:
– в начале разрешающего сигнала очередь равна нулю;
– транспортные средства прибывают одинаковыми группами с
интенсивностью движения q за цикл;
– разъезд осуществляется одинаковыми группами с интенсивностью,
равной потоку насыщения S при наличии очереди и с интенсивностью, равной
интенсивности прибытия при ее разъезде;
– спрос транспортных средств не превышает пропускной способности
элемента перекрестка. Данное условие характеризуется отношением потока
насыщения S к отношению разрешающего сигнала ко времени цикла (g/c).
Упрощенно процесс формирования очереди транспортных средств можно
представить в форме диаграммы (рисунок 6).
48

Рисунок 6 Детерминированная составляющая модели


образование задержек
На запрещающий сигнал r формируется очередь транспортных средств с
интенсивностью q(t). При включении разрешающего сигнала g начинается
разъезд очереди с интенсивностью q-S, при этом количество транспортных
средств в очереди принимает максимальное значение Qmax . Область под

линией профиля очереди представляет собой детерминированную задержку за


цикл.
Необходимость учета остаточной очереди послужила стимулом в
проведении исследований по получению закрытой формы уравнения
остаточной очереди, однако оно так и не было получено. Необходимость оценки
остаточной очереди и наличие строгих ограничений, накладываемых
предположением о законе распределения прибытия транспортных средств,
ограничивает применимость «точных» моделей на практике. Это положило
начало исследованиям по получению приближенных формул (моделей с
49

элементами аппроксимации) для оценки задержек с более простыми


ограничениями, которые способны учитывать разнообразие реальных условий.
Приведенные выше модели задержки требуют достижения стохастического
равновесия. Для его достижения требуется бесконечное время при стабильных
условиях движения (прибытие, обслуживание, регулирование). При низком
отношении интенсивности потока к пропускной способности это достигается в
разумных пределах времени, поэтому такие модели являются приемлемой
аппроксимацией реальных процессов.
При достижении интенсивностью движения пропускной способности
время, необходимое для достижения такого равновесия, обычно превышает
период, в течение которого спрос является стабильным. Кроме того, во многих
случаях интенсивность движения превышает пропускную способность, при
этом нарушаются ограничения моделей.
Попытки преодолеть указанные ограничения были предприняты с
использованием двух различных подходов. Наиболее простой подход
предполагает функцию интенсивности прибытия и разъезда рассматривать как
детерминированный процесс. Второй подход предусматривает моделирование
транспортного потока на перекрестке, предполагая стабильность процессов
прибытия и обслуживания, но не предполагает обязательного достижения
стохастического равновесия. При этом проводится оценка средней задержки и
длины очереди для рассматриваемого периода времени. Данный подход
предусматривает аппроксимацию интенсивности прибытия некоторой
функцией времени (ступенчатая, параболическая или треугольная функция) и
определение соответствующего значения задержек.
В последнее время популярность приобрел метод трансформации
координат. Хотя метод и использует стабилизированную кривую очереди,
полученную по классической теории, в результате получается временно-
зависимая формула задержки. Основой развития данного метода послужило
следующее наблюдение: при низкой степени насыщения (х<<1) задержка всегда
равна такому значению, которое может быть при постоянной плотности в
50

течение всего времени; при высокой степени насыщения (х>>1) задержка


может быть описана с разумной степенью точности следующим
детерминированным выражением:
T
d  d1  (x 1)
2 , (52)

где d1 – задержка, наблюдаемая при низкой плотности (постоянная задержка),


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

Выводы по главе 2.
1. Пошаговое моделирование явно определяет остаточную очередь (если
она существует) и, соответственно, задержку. В тех случаях, когда пропуск
левоповоротных потоков производится с конфликтом необходимо решить
задачу описания просачивания левоповоротных потоков.
2. При моделировании регулируемого перекрестка необходимо учитывать
количество групп полос на каждом из подходов к перекрестку и количество
полос в составе каждой группы. Группа полос может обслуживать от одного до
нескольких направлений движения на регулируемом объекте.
3. В условиях насыщенного транспортного движения важно учитывать а
модели не только количество автомобилей в очереди, но и ее пространственно-
временное распределение по связи.
4. При формализованном описании свойств транспортного потока принято
различать детерминированные и стохастические модели задержки. В практике
управления дорожным движением получили наибольшее распространение
модели, сочетающие в себе как детерминированную, так и стохастическую
составляющие задержки
51

Глава 3. Разработка средств интеллектуального анализа транспортной


сети
§ 3.1 Разработка редактора транспортной сети
Предназначение редактора транспортной сети («EditorTransportNetwork»)
заключается в следующем:
- избавление пользователей от монотонного, ручного набора разметки
XML, чтобы описать компоненты транспортной сети;
- предоставить удобный и простой интерфейс создания/редактирования
сети;
- снятие с пользователя переживание о географической привязки к
местности;
- отвечать всем требованиям к описанию модели сетевого движения
(приложение A);
- выполнение в локальном или клиент-серверном режиме расчета
состояния транспортной сети;
- доведение рассчитанных сигнальных планов до светофорных объектов.
Интерфейс редактора транспортной сети приведен на рисунке 7.
52
2 1

1– вниз-спадающий список выбора, компонент toolboxcontrol;


2– кнопки выбора, компонент button;
3– панель компонентов;
4– компонент группа полос, «LanesGroup»;
5– компонент зарождения потока автотранспорта, «ODConnector»;
6– компонент внутреннего соединения, «InternalJunction»;
7– компонент перекресток со светофорным
регулированием, «Traffic_Light»;
8 – географическая карта, «OpenStremMap».
Рисунок 7 – Интерфейс редактора транспортной сети

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


именно реализует общий для всех компонентов транспортной сети функционал,
а именно:
- изменение высоты (ширены) компонентов;
- поворот на 360° против/по часовой стрелки, относительно центра
компонента;
- использование карт OpenStremMap на заднем фоне транспортной сети, с
поддержкой привязки к местности в виде координат долготы и широты;
- совместное масштабирование компонентов сети и карт OpenStremMap;
- наличие панели компонентов сети;
= сохранение сконструированной сети в локальной базе данных RaveDB.
53

В будущем будет реализован следующий функционал:


- выполнение в «локальном» или «клиент-серверном» режиме расчета
состояния транспортной сети;
- распределение прав доступа;
- выполнение работы редактора в режиме «клинет-сервер»;
- замена локальной СУБД RaveD системой управления
базой данных Postgresql;
- доведения компонентов редактора транспортной сети до уровня
предметной области.

§ 3.2 Библиотека расчетов задержки и очереди в транспортной сети


Реализованная библиотека поддерживает следующие расчеты:
- восстановление интенсивности автотранспорта на основе входящих в
зону управления потоков автотранспорта;
- расчет долей поворотных потоков в пределах зоны управления:
- вычисление начальных параметров цикла светофорного объекта;
- расчет длительности транспортных фаз регулирования;
- моделирование сетевого движения, модель TRANSYT;
- вычисление задержки и очереди транспортной сети.
Код реализации приведен в приложении В.
Ядром расчетов выступает специализированный класс DeleyTool
таблица (6), реализующий все необходимые математические подходы к расчету
очереди и задержки.
54

Таблица 6 – Спецификация класса DeleyTool


Методы
Наименование Описание
CurrentSaturation() Вычисление текущего потока насыщения
UniformDeley() Вычисление нормальной составляющей задержки
IncrementalDeley() Вычисление случайной составляющей задержки (d2)
InitialQueueDeley Вычисление задержки перенасыщения по стандарту
HCM2000
ControllDeley() Вычисление задержки управления на регулируемом
перекрестке
DurationUnmetDemand() Вычисление продолжительности неудовлетворенного
спроса t
Queue() Вычисление остаточной очереди
QueueClearingTime() Вычисление времени разъезда очереди
Calc_U_Parametr() Вычисление параметра u задержки перенасыщения
Calc_I_Factor() Вычисление коэффициента, учитывающего влияние
смежного пересечения, от которого прибывают
автомобили
Сalc_Xu() Вычисление загрузки X u исходящей связи смежного
пересечения
ProgressionFactor() Вычисление фактора прогрессии

Для выполнения расчетов, не достаточно одного класса DeleyTool,


необходим целый комплекс (рисунок 8), реализующие предобработку,
обработку и постобработку входных данных. В данном случае входными
данными выступает описание транспортной сети в формате XML за 15 мин., на
выходе получаем рассчитанную задержку и очередь относительно групп полос
движения. Последовательность расчетов приведена на рисунке 9.
55

Рисунок 8 – Диаграмма классов библиотеки расчетов задержки и очереди в


транспортных сетях
56

Рисунок 9 – Диаграмма последовательности расчета

Оформим спецификации каждого класса (приложение Б) приведенного на


рисунке 8 в виде таблиц (таблицы c 8 по 13), не учитывая класс StateWrap,
который по своей сути является копией класса DeleyTool, описанного ранее.
57

Таблица 8 – Спецификация класса Optimization


Класс Optimization
Наименование Назначение
Атрибуты
List<EdgeWrap> EdgesWrap Хранение информации об связях после
обхода транспортной сети
List<NodeWrap> NodesWrap Хранение информации об уздах после обхода
транспортной сети
Методы
List<LineGroupWrap> GetGoProfiles() Получение полного GO–профиля для каждой
группы полос, путем обхода фаз
регулирования
List<double> GeneralGoProfile() Функция получения GO–профиля в виде
единичного вектора, с учетом типов фаз
регулирования
IEnumerable<double> GeneralProfil() Генерирование GO–профиля, учитывая
разрешено ли движение переданной группы
полос относительно текущей фазы
регулирования
Network Modeling() Входная точка, для запуска процессов расчет
транспортной сети
List<NodeWrap> PrepareOD() Функция по предобработки узлов типа
ODConnector
List<EdgeWrap> PrepareEdges() Функция по предобработки связей
(перегонов) транспортной сети
IEnumerable<NodeWrap> TrafficLightCycle() Функция генерирования оптимальных
сигнальных планов светофорных объектов,
на основе измерения транспортного спроса
NodeWrap LogicCycle() Функция рассчитывающая фазовые
коэффициенты (фаз регулирования)

Таблица 9 – Спецификация класса TlLogicWrap


Класс TlLogicWrap
Наименование Назначение
Атрибуты
ICollection<PhaseWrap> Phase Общий список фаз регулирования (фазы
очистки, транспортные фазы и пешеходные
фазы)
ICollection<PhaseWrap> PhaseVehicle Список транспортных фаз
ICollection<PhaseWrap> PhaseClearing Список фаз очистка
ICollection<PhaseWrap> PhasePedestrian Список пешеходных фаз
double TimeClear Сумма длительностей пешеходных фаз и
очистных фаз
Dictionary<LineGroupType, float> Intensity Словарь, где ключ группа полос, значение
интенсивность автотранспорта
Методы
ICollection<PhaseWrap> PreparationVehicle() Функция расчета коэффициентов групп
полос, на основе интенсивности
автотранспорта, в транспортной фазе
58

Продолжение таблицы 9
ICollection<PhaseWrap> Preparation() Функция объединения фаз регулирования в
общий список
ICollection<PhaseWrap> Preparation() Подготовительная функция к расчетам, с
учетом типа фазы регулирования
double ArithmeticSum() Получение арифметической суммы фазовых
коэффициентов, при условии, что переданной
группе полос разрешен проезд
List<LineGroupWrap> AllGoLineGroup() Функция объединения групп полос в одно
множество из всех фаз регулирования,
относительно светофорного объекта

Таблица 10 – Спецификация класса PhaseWrap


Класс PhaseWrap
Наименование Назначение
Атрибуты
PhaseDefinitionTypeEnum Type Тип фазы регулирования
double PhaseFactor Фазовый коэффициент
ICollection<LineGroupWrap> GoLineGroup Список разрешенных к проезду групп полос
double Dur Оптимальная длительность светового
сигнала фазы регулирования
PhaseDefinitionType Phase Предметное описание фазы регулирования
Методы
bool LineGroup() Функция принадлежности группы полос к
фазе регулирования
double[] ToLineGroupProfile() Выравнивание профиля групп полос
относительно длительности цикла
регулирования и фазы регулирования

Таблица 11 – Спецификация класса NodeWrap


Класс NodeWrap
Наименование Назначение
Атрибуты
List<int> BufferEdgeOut Буфер идентификаторов выходных связей
double[ ] OutProfil Выходной профиль
Dictionary<EdgeWrap List<LineGroupType>> Словарь, где ключ связь, значение список
OutEdge_InLineGroup направлений, составляющие в сумме
выходную связь
List<int> BufferEdgeId Буфер идентификаторов связей
List<LineGroupWrap> GetGoLineGroup Список групп полос, с разрешенным
проездом
ICollection<LineGroupWrap> InLineGroup Список входящих групп полос
NodeType Node Описание узла (перекрестка) сети в
предметной области
TlLogicWrap tlLogic Логика управления потоками автотранспорта
на перекрестке
float CycleTime Длительность цикла регулирования
NodeTypeEnum Type Тип узла транспортной сети
List<LineGroupWrap> oneLineGroup Список групп полос, пропускаемые лишь в
одной, собственной фазе регулирования
59

Продолжение таблицы 11
List<LineGroupWrap> multyLineGroup Список групп полос, пропускаемые более
чем в одной фаре регулирования
int CountGoLineGroup Количество разрешенных к проезду групп
полос
bool Condition Состояние узла, определяющее, что данный
узел является рассчитанным либо не
рассчитанным. Узел может считаться
рассчитанным, при условии что входящие и
исходящие связи рассчитаны.
Методы
bool SetInEdge() Ввод возможно входной связи в узел
IEnumerable<EdgeWrap> GetOutEdge() Получить перечисление выходящих связей
(перегонов)
double[ ] GetGoProfil() Получить GO–профиль узла
double[ ] GeneralOutProfil() Сгенерировать выходной профиль узла
Dictionary<EdgeWrap, List<LineGroupType>> Определение требуемого списка группы
RealLineGroupInEdge() полос, выходной связи

Таблица 12 – Спецификация класса LineGroupWrap


Класс LineGroupWrap
Наименование Назначение
Атрибуты
DeleyTool _deley Набор математических инструментов к
расчетам в транспортной сети
CyclicProfileTool _cyclic Вспомогательный набор инструментов
манипуляций с массивами
double Dur Длительность разрешающего сигнала
относительно группы полос
double Coefficient Коэффициент группы полос (применяется
для расчета фазового коэффициента)
int LinesCount Количество полос движения
Dictionary<LineGroupWrap, List<double>> Словарь, где ключ группа полос, а значение
ToLineGroup список значений с плавающей точкой
LineGroupType LineGroup Тип группы полос
int InternalId Уникальный идентификатор
double[ ] GoProfil Профиль разъезда (GO–провиль)
double[ ] OutProfil Выходной профиль
double[ ] InProfil Входной профиль
double[ ] QueueProfil Профиль очереди
Методы
double[ ] OutProfile() Функция получения выходного профиль
потока с группы полос
double CurrentSaturation() Текущий поток насыщения
60

Таблица 13 – Спецификация класса EdgeWrep


Класс EdgeWrap
Наименование Назначение
Атрибуты
DeleyTool _deley Набор математических инструментов к
расчетам в транспортной сети
CyclicProfileTool _cyclic Вспомогательный набор инструментов
манипуляций с массивами
Методы
List<LineGroupWrap> nextLineGroup() Просчет последующих групп полос связи,
начиная со второй группы полс, с начала
связи
LineGroupWrap FirstLineGroup() Просчет первой группы полос, с начала
связи. Начало связи определяется как первое
вхождение потока, относительно
направления движения.
61

§ 3.3 Программное тестирование библиотеки расчетов состояния


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

4
5

3
2

1 – Узлы (перекрестки)
2 – Связи (перегоны)
3 – Группы полос
4 – Внутренние соединения (узлы), между группами полос
5 – Коннекторы, внутренние соединения узла (перекрестка)

Рисунок 10 – Схема тестового перекрестка


62

На рисунке 11 приведен расчет транспортной сети за 15 мин. с графиком


профиля отъезда (GO-профиль), сразу можно отметить, что видна явная
корреляция с профиля очереди (рисунок 12).

Рисунок 11 – Интерфейс программы тестирования «ProfileNode».


Профиль отъезда

Рисунок 12 – Интерфейс программы тестирования «ProfileNode».Профиль очереди


63

Практически, при каждой включении разрешающего сигнала светофора,


наблюдается сокращение очередь, что не удивляет, ведь длительность цикла
регулирования и длительности фаз настраиваются автоматически на основе
полевых измерений интенсивности автотранспорта, и тем самым не позволяет
образовываться очереди (IntialQueue = 0).
При последующих прогонах, на 30 (рисунок 12), 45 (рисунок 13) и 60 мин.
(рисунок 14) сохраняет стабильная тенденция к разъезду очереди.

Рисунок 12 – Интерфейс программы тестирования «ProfileNode».Профиль очереди при 30


мин. моделирования
64

Рисунок 13 – Интерфейс программы тестирования «ProfileNode».Профиль очереди при


45мин. моделирования

Рисунок 14 – Интерфейс программы тестирования «ProfileNode».Профиль очереди при 60


мин. моделирования
65

Выводы по главе 3
1. Реализован прототип редактора транспортной сети в соответствии с
паттернов проектирования «Модель-Представдение-ПредставлениеМодель»
(Model-View-ViewModel), С поддержкой следующих возможностей к
проектированию:
 добавление/удаление компонентов графа транспортной сети;
 создание/удаление связей между компонентами графа;
 вывод диалогового окно относительно выбранного компонента;
 отображение панель компонентов, с возможностью перетаскивание на
рабочий стол редактора транспортной сети;
 поддержка модификаций высоты/ширины/поворота;
 поддержка масштабирования компонентов графа;
 отображение географической карты на заднем фоне рабочего стола
редактора, с поддержкой масштабирования;
 возможность деформации связи между компонентами по принципу
кривых Безье.
2. Библиотека по расчету задержки и очереди в транспортной сети
поддерживает следующие расчеты:
- восстановление интенсивности автотранспорта на основе входящих в
зону управления потоков автотранспорта;
- расчет долей поворотных потоков в пределах зоны управления;
- вычисление начальных параметров цикла светофорного объекта;
- расчет длительности транспортных фаз регулирования;
- моделирование сетевого движения, модель TRANSYT;
- вычисление задержки и очереди транспортной сети.
66

Заключение
1. Предложен подход к управлению насыщенными транспортными
потоками на основе формализации задач управления изолированным
перекрестком и магистральной улицей, что позволяет предотвратить
блокирование транспортных связей.
2. Обоснованы математические модели и разработана методика,
обеспечивающие оптимизацию работы изолированных светофорных объектов.
3. Реализован прототип редактора транспортной сети в соответствии с
паттернов проектирования «Модель-Представдение-ПредставлениеМодель»
(Model-View-ViewModel), с поддержкой: добавления/удаления компонентов
графа транспортной сети; создания/удаления связей между компонентами
графа; вывода диалогового окно относительно выбранного компонента;
отображения панели компонентов и других операций.
4. Разработана библиотека по расчету задержки и очереди в транспортной
сети поддерживает следующие расчеты, обеспечивающая восстановление
интенсивности автотранспорта на основе входящих в зону управления потоков
автотранспорта, расчет долей поворотных потоков в пределах зоны управления,
вычисление начальных параметров цикла светофорного объекта, расчет
длительности транспортных фаз регулирования.
67

Список используемых источников


1. K. Nagel and M. Paczuski, Phys. Rev. E51, 2909 (1995)
2. Моделирование дорожного движения : учебное пособие [Электронный
ресурс]: для студентов специальности 190702 «Организация и безопасность
движения» очной формы обучения / А. В. Косолапов – Электрон. дан. –
Кемерово : КузГТУ, 2012.
3. Математическое моделирование загрузки транспортных сетей [Текст]/
Швецов В.И., Алиев А.С. – М.: Едиториал УРСС, 2003. - 64 с. ISBN 5-354-
00385-7
4. Организация дорожного движения: Учеб. для вузов.– 5-е изд., перераб. и
доп. [Текст] / Клинковштейн Г. И., Афанасьев М. Б. – М: Транспорт, 2001 –
247 с.
5. On kinematic waves: a theory of traffic flow on long crowded roads. /
Lighthill M.J., Whitham G. B. // In Proceedings Royal Society, London, UK, 1955.
pp 317–345,.
6. Shockwaves on the highway / Richards P. I. // Operations Research, №4.
1955. pp. 42–51
7. The Progress of a Bunch of Vehicles Released from a Traffic
Signal / Pacey, G. M. – Research Note No. Rn/2665/GMP. Road Research
Laboratory, London. 1956. – 9 c.
8. TRANSYT-7F User's Manual. / Wallace, C. E. – Report UF-TRC-U32 FP-
06/07. U.S. Department of Transportation, Federal
HighwayAdministration, 1984. – 530 c.
9. TRANSYT: A Traffic Network Study Tool / Robertson, D. I. // Road Research
Laboratory Report LR 253, Crowthorne, 1969. – 37 c.
10. ГОСТ Р 52289-2004 «Технические средства организации дорожного
движения. Правила применения дорожных знаков, разметки, светофоров,
дорожных ограждений и направляющих устройств»
11. Models of freeway traffic and control / Payne H. J. // Simulation Councils
Proceedings., Lajolia, California, 1971. pp. 51–61
68

12. Организация дорожного движения в городах. Методическое пособие.


Под общ. ред. Ю.Д. Шелкова. Научно-исследовательский центр ГАИ МВД
России. – М.: 1995. –143 с.
69

Приложение А
XSD–СХЕМЫ
(обязательное)
70

<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:include schemaLocation="baseTypes.xsd"/>
<xsd:include schemaLocation="tlsDefinitionTypes.xsd"/>
<xsd:include schemaLocation="netBaseTypes.xsd"/>

<xsd:element name="net" type="netType"/>

<xsd:complexType name="netType">
<xsd:annotation>
<xsd:documentation>
Транспортная сеть представляет собой направленный граф, состоящий из узлов "node" и
связей "edge".
Геометрия сети определена элементами "netGeometry" (для связей "edge") и "node".
Элемент create содержит информацию о создании сети.
"SRID" - SRID-код проекции EGPS.
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="netGeometry" type="netGeometryType" minOccurs="0"
maxOccurs="unbounded"/>
<xsd:element name="edge" type="edgeType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="node" type="nodeType " minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="lane" type="laneType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="create" type="createType" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="version">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d+.\d+"></xsd:pattern>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="SRID" type="xsd:int" use="required"/>
</xsd:complexType>

<xsd:complexType name="netGeometryType">
<xsd:annotation>
<xsd:documentation>
Тип "netGeometryType" определяет геометрию сети и адресную привязку элементов
обустройства дороги (например при ее паспортизации).
Элемент "roadAxis" определяет ось участка (перегоны между узлами) из которых
состоит дорога.
Элемент "nodeShape" определяет форму представления узла на карте
Элемент "edgeGeometry" определяет форму связи на карте.
internalJunction
Элемент "lane" определяет форму отдельных полос движения и коннекторов на
перекрестках
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
71

<xsd:element name="roadAxis" type="roadAxisType" minOccurs="0"


maxOccurs="unbounded"/>
<xsd:element name="nodeShape" type="nodeShapeType" minOccurs="0"
maxOccurs="unbounded"/>
<xsd:element name="internalJunctionShape" type="nodeShapeType" minOccurs="0"
maxOccurs="unbounded"/>
<xsd:element name="edgeGeometry" type="roadElementGeometryType" minOccurs="0"
maxOccurs="unbounded"/>
<xsd:element name="segmentGeometry" type="roadElementGeometryType" minOccurs="0"
maxOccurs="unbounded"/>
<xsd:element name="laneGroupGeometry" type="roadElementGeometryType" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="nodeType">
<xsd:annotation>
<xsd:documentation>
Тип "nodeType" определяет атрибутивную информацию об узлах транспортной сети.
Атрибут "name" - наименование транспортного узла.
Атрибут "type" - определяет тип транспортного узла:
- "traffic_light" - светофорное регулирование;
- "roundband" - круговое движение;
- "priority" - нерегулируемое пересечение с установленным приоритетом проезда;
- "OD_connector" - узел, в котором зарождаются и гасятся коореспонденции;
- "not_defined" - не определенный.
При создании нового узла ему присваивается тип "not_defined".
Элементы "connection" содержат описание внутренних связей узла,
"priority_rule" - правила приоритета,
"tlLogic" - схему движения по фазам.

</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="tlLogic" type="tlLogicType" minOccurs="0" maxOccurs="1"/>
<xsd:element name="priority_rule" type="priority_ruleType" minOccurs="0"
maxOccurs="1"/>
<xsd:element name="connection" type="connectionType" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:int" use="required"/>
<xsd:attribute name="name" type="xsd:string" use="optional"/>
<xsd:attribute name="geometryID" type="xsd:int" use="optional"/>
<xsd:attribute name="type" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="traffic_light"/>
<xsd:enumeration value="roundband"/>
<xsd:enumeration value="priority"/>
<xsd:enumeration value="OD_connector"/>
<xsd:enumeration value="not_defined"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
72

<xsd:attribute name="inEdg" type="array" use="optional"/>


<xsd:attribute name="outEdg" type="array" use="optional"/>
</xsd:complexType>

<xsd:complexType name="edgeType">
<xsd:annotation>
<xsd:documentation>
Тип "edgeType" определяет направленные транспортные связи в сети.
Атрибут "geometryID" определяет ссылку на геометрический объект, представляющий
связь на карте.
Атрибуты "from" и "to" определяют направление связи (от узла "from" к узлу "to").
Атрибут "length" определяет длину связи. Первоначально устанавливается по геометрии
связи.
Атрибут "typeRoad" определяет тип дороги:
"CityMainRoad" - магистральная улица общегородского значения;
"MainRoad" - магистрильная улица районного значения;
"MinorRoad" - второстепенная улица;
"Journey" - проезд.
Атрибут "disAllowed" содержит массив типов транспортных средств, для которых
движение по связи запрещено:
1. легковые автомобили "Cars";
2. автобусы "Bus";
3. грузовики "Trucks".
Атрибут "disAllowed" потребуется позднее для решения задач транспортного
планирования.
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="lane_group" type="lane_groupType" minOccurs="1"
maxOccurs="unbounded"/>
<xsd:element name="internalJunction" type="internalJunctionType" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:int" use="required"/>
<xsd:attribute name="geometryID" type="xsd:int" use="optional"/>
<xsd:attribute name="from" type="xsd:int" use="required"/>
<xsd:attribute name="to" type="xsd:int" use="required"/>
<xsd:attribute name="length" type="xsd:unsignedLong" use="required"/>
<xsd:attribute name="disAllowed" type="array" use="optional"/>
<xsd:attribute name="typeRoad" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="CityMainRoad"/>
<xsd:enumeration value="Highway"/>
<xsd:enumeration value="MainRoad"/>
<xsd:enumeration value="MinorRoad"/>
<xsd:enumeration value="Journey"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:schema>
<?xml version="1.0" encoding="UTF-8"?>
73

<xsd:schema elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:include schemaLocation="baseTypes.xsd"/>

<xsd:element name="state" type="stateUrbanNetType"/>

<xsd:complexType name="stateUrbanNetType">
<xsd:annotation>
<xsd:documentation>
Элемент "period" определяет период анализа состояния сети.
Атрибут "idArea" - идентификатор области управления.
Атрибут "idZone" - идентификатор зоны управления.
Атрибут "date" - дата оценки состояния сети (для архива состояний).
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="period" type="statePeriodType" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="idArea" type="xsd:int" use="required"/>
<xsd:attribute name="idZone" type="xsd:int" use="required"/>
<xsd:attribute name="date" type="xsd:date" use="optional"/>
</xsd:complexType>

<xsd:complexType name="statePeriodType">
<xsd:annotation>
<xsd:documentation>
"edgState" - состояние связей (e);
"lineGrouptState" - состояние групп полос движения (l);
Атрибуты "fromTime" и "toTime" определяют период действия оценки состояния.
</xsd:documentation>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="edgState" type="edgStateType" minOccurs="0"
maxOccurs="unbounded"/>
<xsd:element name="lineGrouptState" type="edgStateType" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="fromTime" type="xsd:time" use="required"/>
<xsd:attribute name="toTime" type="xsd:time" use="required"/>
</xsd:complexType>

<xsd:complexType name="edgStateType">
<xsd:annotation>
<xsd:documentation>
Спецификация атрибутов:
- идентификатор элемента связи "Edge"(e);
- идентификатор элемента групп полос "LineGroup" (l)
- случайная задержка "uniformDelay" (l);
- задержка управления "incrementalDelay" (l);
- задержка перенасыщения "totalDelay" (l);
- суммарная задержка "totalDelay" (l);
74

- остаточная очередь "initialQueue" (l);


- максимальная очередь в цикле "maxQueue" (l);
- максимальное положение фронта очереди в цикле "maxFrontQueue" (l);
- временной шаг построения профилей "timeStepProfile" (l);
- входящий профиль "InProfile" (l);
- профиль отъезда "OutProfile" (l);
- профиль насыщения "GoProfile" (l);
- профиль очереди "QueueProfile" (l);
- профиль вероятности прибытия автобусов "BusDepProfile" (l);
- время движения в свободных условиях "freeTravelTime" (e,l);
- время движения в текущих условиях "currentTravelTime" (e,l);
- загруженность "capacity" (l);
- поток насыщения (пропускная способность) "currentSaturation" (l);
- идентификатор справочника потока насыщения "saturationSettingsID" (l).
- количество шагов при моделировании движения профиля "numberStepFromModelling"
(l)
</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="idEdgElement" type="xsd:int" use="required"/>
<xsd:attribute name="incrementalDelay" type="xsd:float" use="optional"/>
<xsd:attribute name="uniformDelay" type="xsd:float" use="optional"/>
<xsd:attribute name="initialQueueDelay" type="xsd:float" use="optional"/>
<xsd:attribute name="totalDelay" type="xsd:float" use="optional"/>
<xsd:attribute name="initialQueue" type="xsd:float" use="optional"/>
<xsd:attribute name="maxQueue" type="xsd:float" use="optional"/>
<xsd:attribute name="maxFrontQueue" type="xsd:float" use="optional"/>
<xsd:attribute name="timeStepProfile" type="xsd:int" use="optional"/>
<xsd:attribute name="InProfile" type="array" use="optional" />
<xsd:attribute name="OutProfile" type="array" use="optional" />
<xsd:attribute name="GoProfile" type="array" use="optional" />
<xsd:attribute name="QueueProfile" type="array" use="optional" />
<xsd:attribute name="BusDepProfile" type="array" use="optional" />
<xsd:attribute name="freeTravelTime" type="xsd:float" use="optional"/>
<xsd:attribute name="currentTravelTime" type="xsd:float" use="optional"/>
<xsd:attribute name="capacity" type="xsd:float" use="optional"/>
<xsd:attribute name="currentSaturation" type="xsd:float" use="optional"/>
<xsd:attribute name="saturationSettingsID" type="xsd:int" use="optional"/>
<xsd:attribute name="numberStepFromModelling" type="xsd:int" use="optional"/>
</xsd:complexType>
</xsd:schema>
75

Приложение Б
КОД БИБЛИОТЕКИ РАСЧЕТА
СОСТОЯНИЯ ТРАНСПОРТНОЙ СЕТИ
(обязательное)
76

partial class Optimization


{
public struct Network
{
public List<EdgeWrap> Edges { get; private set; }
public List<NodeWrap> Nodes { get; private set; }
public Network(List<NodeWrap> nodes, List<EdgeWrap> edges)
{
Edges = edges;
Nodes = nodes;
}
}
private List<EdgeWrap> _edgeWrap = new List<EdgeWrap>();
public List<EdgeWrap> EdgesWrap
{
get { return _edgeWrap; }
private set { _edgeWrap = value; }
}
private List<NodeWrap> _nodeWrap = new List<NodeWrap>();
public List<NodeWrap> NodesWrap
{
get { return _nodeWrap; }
private set { _nodeWrap = value; }
}
public Network Modeling
(List<NodeWrap> nodeTraff, Dictionary<NodeType, float> nodeOD_flow,
FlowPeriodType flowPeriod, double T = 0.25)
{ var nodeRes = new List<NodeWrap>();
var edgeRes = new List<EdgeWrap>();
var nodeOD = PrepareOD(nodeOD_flow, T);
var edgesWrap = PrepareEdges(nodeOD, nodeTraff, flowPeriod);
while (nodeTraff.Count != 0)
{ foreach (var node in nodeTraff)
{ var buffreEdge = new List<EdgeWrap>();

var inEdgeNode = edgesWrap


.Where(e => e.Edge.To == node.Node)
.ToList();
for (int i = 0; i < inEdgeNode.Count(); i++)
{
var edge = inEdgeNode[i];
node.SetInEdge(ref edge);
buffreEdge.AddRange(node.GetOutEdge(flowPeriod));
}
if (buffreEdge.Count > 0)
{
var newEdges = buffreEdge
.GroupBy(r => r.InternalId)
.Select(y => y.First());
edgesWrap.AddRange(newEdges);
}
}
nodeRes.AddRange(nodeTraff.Where(w => w.Condition == true));
77

nodeTraff
.RemoveAll(r => r.Condition);
}
edgeRes.AddRange(edgesWrap);

NodesWrap.AddRange(nodeRes);
EdgesWrap.AddRange(edgeRes);
return new Network(nodeRes, edgeRes);
}
static List<NodeWrap> PrepareOD(Dictionary<NodeType, float> nodeOD_flow, double T =
0.25)
{
var listNodeOptim = new List<NodeWrap>();
foreach (var node in nodeOD_flow.Keys)
{
var nodeOptim = new NodeWrap(node, nodeOD_flow[node], T);
listNodeOptim.Add(nodeOptim);
}
return listNodeOptim;
}

/// <summary>
/// Подготовка исходящих связей от узлов типа ODConnector
/// </summary>
/// <param name="NodeOD"></param>
/// <param name="tlLogic"></param>
/// <returns></returns>
static List<EdgeWrap> PrepareEdges(List<NodeWrap> nodeOD, List<NodeWrap> nodeTraff,
FlowPeriodType flowPeriod)
{
var edgesPrep = new List<EdgeWrap>();

foreach (var node in nodeOD)


{
foreach (var edge in node.OutEdge)
{
NodeWrap nodeTo = nodeTraff
.Where(w => w.Node.InternalId == edge.To.InternalId).Last();
var edgeOut = new EdgeWrap(edge, flowPeriod, node.OutProfil, node, nodeTo)
{ Condition = true };
//yield return edgeOut;
edgesPrep.Add(edgeOut);
}
}
return edgesPrep;
}
public IEnumerable<NodeWrap> TrafficLightCycle(FlowPeriodType flowPeriod, double T,
int MaxCycleTime = 120,
int MinCycleTime = 40)
{
var nodesTraff = flowPeriod.NodeFlow
.Where(w => w.Node.TransportType == NodeTypeEnum.TrafficLight);
foreach (var nodeFlow in nodesTraff)
78

{ var node = nodeFlow.Node;


var intensityLineG = (new GCityAnalysis()).GetIntensityNode(node, nodeFlow);
var tlLogic = new TlLogicWrap(node.TlLogic);
tlLogic.Intensity = intensityLineG;
//NodeWrap nodeWrap = new NodeWrap(node, tlLogic);
var nodeWrap = new NodeWrap(node, nodeFlow, T);
nodeWrap = LogicCycle(nodeWrap);
var tlLogicNode = nodeWrap.tlLogic;
var arifSum = nodeWrap.tlLogic.PhaseVehicle.Sum(s => s.PhaseFactor);
if (arifSum <= 0.97)
{
var cycleTime = (float)Math.Round(
(1.5 * nodeWrap.tlLogic.TimeClear + 5) / (1 - arifSum), 0);
if ((cycleTime <= MaxCycleTime) && (cycleTime >= MinCycleTime))
nodeWrap.CycleTime = cycleTime;
else
{
if (MaxCycleTime < cycleTime)
nodeWrap.CycleTime = MaxCycleTime;
else
nodeWrap.CycleTime = MinCycleTime;
} }
else
nodeWrap.CycleTime = MaxCycleTime;

foreach (var phase in tlLogicNode.PhaseVehicle)


{
phase.Dur =
Math.Round((((nodeWrap.CycleTime - tlLogicNode.TimeClear) *
phase.PhaseFactor) / arifSum), 0);
}
yield return nodeWrap;
} }
public IEnumerable<NodeWrap> UserTrafficLighCycle(float cycleTime, FlowPeriodType
flowPeriod,
int MaxCycleTime = 120,
int MinCycleTime = 40)
{
foreach (var nodeFlow in flowPeriod.NodeFlow)
{
var node = nodeFlow.Node;
NodeWrap nodeWrap = new NodeWrap(node, nodeFlow);
nodeWrap = LogicCycle(nodeWrap);
var tlLogicNode = nodeWrap.tlLogic;
var arifSum = nodeWrap.tlLogic.PhaseVehicle.Sum(s => s.PhaseFactor);
if ((cycleTime <= MaxCycleTime) && (cycleTime <= MinCycleTime))
nodeWrap.CycleTime = cycleTime;
else
if (MaxCycleTime < cycleTime)
nodeWrap.CycleTime = MaxCycleTime;
else
nodeWrap.CycleTime = MinCycleTime;
foreach (var phase in tlLogicNode.PhaseVehicle)
79

{
phase.Dur =
Math.Round((((cycleTime - tlLogicNode.TimeClear) * phase.PhaseFactor) /
arifSum), 0);
}
yield return nodeWrap;
} }
static private NodeWrap LogicCycle(NodeWrap nodeWrap)
{
var tlLogic = nodeWrap.tlLogic;
var phaseList = tlLogic.PhaseVehicle;
var onelineG = nodeWrap.oneLineGroup;
var multylineG = nodeWrap.multyLineGroup;
var bufferPhase = new List<PhaseWrap>();
foreach (var phase in phaseList)
{
var count = 0;
var list = new List<LineGroupWrap>();
foreach (var lineGroup in phase.GoLineGroup)
{
if (onelineG.Contains(lineGroup))
{
list.Add(lineGroup);
count++;
} }
if (count > 0)
phase.PhaseFactor = (float)list.Max(x => x.Coefficient);
else
if (count == 0)
bufferPhase.Add(phase);
}
if (bufferPhase.Count() > 0)
foreach (var lineGroup in multylineG)
{
var sqB = (float)(lineGroup.Coefficient - tlLogic.ArithmeticSum(lineGroup));
if ((sqB >= 0) && (bufferPhase.Count > 1))
{
var nullPhase = phaseList.Where
(x => (x.PhaseFactor == 0) && x.GoLineGroup.Contains(lineGroup));
var size = nodeWrap.CountGoLineGroup(lineGroup);
foreach (var phase in nullPhase)
phase.PhaseFactor += (float)Math.Round(sqB / size, 2);
}
else
if ((sqB >= 0) && (bufferPhase.Count == 1))
{
var nullPhase = phaseList.Where
(x => (x.PhaseFactor == 0) && x.GoLineGroup.Contains(lineGroup));
foreach (var phase in nullPhase)
phase.PhaseFactor += sqB;
}
else
{
80

var min = phaseList.Min(m => m.PhaseFactor);


var minPhaseFactor = phaseList.Where
(x => (x.PhaseFactor == min) && (x.GoLineGroup.Contains(lineGroup)));
foreach (var phase in minPhaseFactor)
phase.PhaseFactor += sqB;
} }
return nodeWrap;
} } }

class TlLogicWrap
{
private TlLogicType tlLogic;
#region property
public ICollection<PhaseWrap> Phase
{
get;
protected set;
}
public ICollection<PhaseWrap> PhaseVehicle
{
get;
protected set;
}
public ICollection<PhaseWrap> PhaseClearing
{
get;
protected set;
}
public ICollection<PhaseWrap> PhasePedestrian
{
get;
protected set;
}
public double TimeClear
{
get;
protected set;
}
private Dictionary<LineGroupType, float> _intensity;
public Dictionary<LineGroupType, float> Intensity
{
get { return _intensity; }
set
{
_intensity = value;
PhaseVehicle = Preparation(tlLogic, PhaseDefinitionTypeEnum.Vehicle, Intensity);
PhasePedestrian = Preparation
(tlLogic, PhaseDefinitionTypeEnum.Pedestrian, Intensity);
PhaseClearing = Preparation
(tlLogic, PhaseDefinitionTypeEnum.Clearing, Intensity);
Phase = Preparation(PhaseVehicle, PhasePedestrian, PhaseClearing);
TimeClear = PhaseClearing.Sum(s => s.MaxDur) + PhasePedestrian.Sum(s =>
s.MaxDur); } }
81

#endregion
public TlLogicWrap(TlLogicType tlLogic)
{
this.tlLogic = tlLogic;
Phase = new HashSet<PhaseWrap>();
PhaseVehicle = new HashSet<PhaseWrap>();
PhasePedestrian = new HashSet<PhaseWrap>();
PhaseClearing = new HashSet<PhaseWrap>();
}
#region Preparation
private ICollection<PhaseWrap> PreparationVehicle
(TlLogicType tlLogic, Dictionary<LineGroupType, float> Intensity)
{
var phaseWrap = new List<PhaseWrap>();

var phaseVehicle = tlLogic.PhaseDefinition.Where


(w => w.Type == PhaseDefinitionTypeEnum.Vehicle);
foreach (var phaseDefin in phaseVehicle)
{
var listLineGroupOptim = new List<LineGroupWrap>();
foreach (var lineG in phaseDefin.GoLineGroups)
{
var coutLine = Convert.ToInt32(lineG.LinesCount);
var currentSaturation = (new DeleyTool()).CurrentSaturation(coutLine);
double flow = Intensity[lineG];
double coeffcient = Math.Round(flow / currentSaturation, 2);
var lineGroupOptim = new LineGroupWrap(lineG)
{
Coefficient = coeffcient,
Flow = flow
};
lineGroupOptim.CurrentSaturation();
listLineGroupOptim.Add(lineGroupOptim);
}
var phase = new PhaseWrap(phaseDefin)
{
GoLineGroup = listLineGroupOptim,
PhaseFactor = 0,
};
phaseWrap.Add(phase);
}

return phaseWrap;
}

private ICollection<PhaseWrap> Preparation


(ICollection<PhaseWrap> PhaseVehicle, ICollection<PhaseWrap> PhasePedestrian,
ICollection<PhaseWrap> PhaseClearing)
{ var allPhase = new List<PhaseWrap>();
allPhase.AddRange(PhaseVehicle);
allPhase.AddRange(PhasePedestrian);
allPhase.AddRange(PhaseClearing);
82

return allPhase; }
private ICollection<PhaseWrap> Preparation(TlLogicType tlLogic, PhaseDefinitionTypeEnum
PhaseType,
Dictionary<LineGroupType, float> Intensity)
{
var phaseWrapList = new List<PhaseWrap>();
switch (PhaseType)
{
case PhaseDefinitionTypeEnum.Vehicle:
{
phaseWrapList = PreparationVehicle(tlLogic, Intensity).ToList();
}
break;
case PhaseDefinitionTypeEnum.Pedestrian:
{
var phasePedestrian = tlLogic.PhaseDefinition.Where
(w => w.Type == PhaseType).ToList();
foreach (var phase in phasePedestrian)
{
var pedestrian = new PhaseWrap(phase)
{
PhaseFactor = 0
};
phaseWrapList.Add(pedestrian);
}
}
break;
case PhaseDefinitionTypeEnum.Clearing:
{
var phaseClearing = tlLogic.PhaseDefinition.Where
(w => w.Type == PhaseType).ToList();
foreach (var phase in phaseClearing)
{
var clearing = new PhaseWrap(phase)
{
PhaseFactor = 0
};
phaseWrapList.Add(clearing);
}
}
break; }
return phaseWrapList;}
#endregion
public double ArithmeticSum(LineGroupWrap lineG)
{
double sum = 0;
foreach (var phase in Phase)
if (phase.GoLineGroup.Contains(lineG))
sum += phase.PhaseFactor;
return sum;
}
public List<LineGroupWrap> AllGoLineGroup()
{
83

var allGoLineGroup = new List<LineGroupWrap>();


//foreach (var phase in PhaseVehicle)
foreach (var phase in Phase)
allGoLineGroup.AddRange(phase.GoLineGroup);
return allGoLineGroup;
}
}
}
using GCity.Admin.Interfaces.Entities;
using GCity.OptimizationTool;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GCity.OptimizationTool.Wraping
{
public class StateWrap
{
private DeleyTool _deley;
private CyclicProfileTool _cyclic;
private SaturationSettings SaturationSettings;

#region parametr

private LineGroupWrap LineGWrap { get; set; }


private double Cycle { get { return LineGWrap.Cycle; } }
private double Flow { get { return LineGWrap.Flow; } }
private double Dur { get { return LineGWrap.Dur; } }
private double Saturation { get { return LineGWrap.Saturation; } }
private int LinesCount { get { return LineGWrap.LinesCount; } }
#endregion

public double Qb
{
get;
set;
}

/// <summary>
/// Конструктор рассчетной оболочик группы полос
/// </summary>
/// <param name="LineGroup">Расчитываемая группа полос</param>
/// <param name="Cycle">Максимальное длительность цикла регулирования</param>
/// <param name="Flow">Интенсивность в данной группе полос</param>
/// <param name="GreenTime">Длительность горения разрешающего сигнала светофора
данной группе полос</param>
/// <param name="Saturation">Текущая величина потока насыщения</param>
public StateWrap(LineGroupWrap lineG, SaturationSettings settings)
{
84

_deley = new DeleyTool();


_cyclic = new CyclicProfileTool();
SaturationSettings = settings;
this.LineGWrap = lineG;
}
public StateWrap(LineGroupWrap lineG)
{
_deley = new DeleyTool();
_cyclic = new CyclicProfileTool();
SaturationSettings = new SaturationSettings();
this.LineGWrap = lineG;
}
#region methods
public double CurrentSaturation(SaturationSettings SaturationSettings, double E_HV = 2)
{
this.SaturationSettings = SaturationSettings;
return _deley.CurrentSaturation(this.LinesCount, SaturationSettings, E_HV);
}
public double CurrentSaturation(double E_HV = 2)
{
this.SaturationSettings = new SaturationSettings();
return _deley.CurrentSaturation(this.LinesCount, E_HV);
}
private double Capacity()
{
return this.Saturation * Dur / Cycle;
}
private double UniformDeley()
{
var uniformDelay = _deley.UniformDeley(Cycle, Dur, Saturation, Flow);
return (uniformDelay > 0) ? uniformDelay : 0;
}
private double UniformDeley(double X)
{
var uniformDelay = _deley.UniformDeley(Cycle, Dur, Saturation, Flow, X);
return (uniformDelay > 0 ) ? uniformDelay : 0;
}
private double IncrementalDeley(double T = 0.25, double I = 1.0, double k = 0.5)
{
var incrementtalDeley = _deley.IncrementalDeley(Cycle, Dur, Saturation, Flow, T, I, k);
return incrementtalDeley;
}
private double IncrementalDeley(double T, double I, double k, double X, double Capacity)
{
var incrementtalDeley = _deley.IncrementalDeley(Cycle, Dur, Saturation, Flow, T, I, k, X,
Capacity);
return incrementtalDeley;
}
private double InitialQueueDeley(double T = 0.25)
{
//var Qb = 10; //OldLineGroupState.InitialQueue;
var initialQueueDeley = _deley.InitialQueueDeley(Cycle, Dur, Saturation, Flow, Qb, T);
if (initialQueueDeley > 0) return initialQueueDeley;
85

return 0;
}
private double InitialQueueDeley(double X, double Capacity, double t, double T = 0.25)
{
//var Qb = OldLineGroupState.InitialQueue;
var initialQueueDeley = _deley.InitialQueueDeley(Cycle, Dur, Saturation, Flow, Qb, X,
Capacity, t, T);
return initialQueueDeley;
} private double ControllDeley(double T = 0.25, double I = 1.0, double PF = 1.0, double k
= 0.5)
{
var Capacity = Saturation * Dur / Cycle;
var X = Flow / Capacity;
// var Qb = OldLineGroupState.InitialQueue;
var t = _deley.DurationUnmetDemand(Qb, X, Capacity, T);
double contDeley = 0;
if (t == 0)
{
var d1 = UniformDeley();
var d2 = IncrementalDeley();
contDeley = d1 * PF * d2;
} else {
var d1 = UniformDeley(1.0) * t / T + UniformDeley(X) * PF * (T - t) / T;
var d2 = IncrementalDeley();
var d3 = InitialQueueDeley();
contDeley = d1 * d2 * d3;
}
return contDeley;
}
private double Queue(double Qb_old, double X_old, double T = 0.25)
{
var Capacity = Saturation * Dur / Cycle;
return _deley.Queue(Qb_old, X_old, Capacity, T);
}
#endregion

public EdgStateType LineGroupState()


{
var stateLineG = new EdgStateType()
{
Capacity = Capacity(),
UniformDelay = UniformDeley(),
IncrementalDeley = IncrementalDeley(),
InitialQueue = Queue(0, 0),
InitialQueueDelay = InitialQueueDeley(),

MaxFrontQueue = 0,
MaxQueue = 0,

CurrentSaturation = LineGWrap.Saturation,

//SaturationSettings = this.SaturationSettings
LineGroup = LineGWrap.LineGroup,
86

Coefficient = LineGWrap.Coefficient,

GoProfile = LineGWrap.GoProfil,
InProfile = LineGWrap.InProfil,
QueueProfile = LineGWrap.QueueProfil,
OutProfile = LineGWrap.OutProfile()
};

return stateLineG;
}
}
}

using GCity.Admin.Interfaces.Entities;
using GCity.OptimizationTool;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GCity.OptimizationTool.Wraping
{
public class PhaseWrap
{
private PhaseDefinitionType phase;
#region property
public int InternalId
{
get { return phase.InternalId; }
}
public PhaseDefinitionTypeEnum Type
{
get { return phase.Type; }
}
public PhaseDefinitionType Phase
{
get { return phase; }
}
public double MaxDur
{
get { return Convert.ToDouble(phase.MaxDur); }
}
public double MinDur
{
get { return Convert.ToDouble(phase.MinDur); }
}
/// <summary>
/// Длительность разрешающего сигнала
/// </summary>
public double Dur
{
get;
87

set;
}
public bool LineGroup(LineGroupWrap lineG)
{
return (GoLineGroup.Contains(lineG));
}
public ICollection<LineGroupWrap> GoLineGroup
{
get;
set;
}
public double PhaseFactor
{
get;
set;
}
#endregion
public PhaseWrap(PhaseDefinitionType phase)
{
this.phase = phase;
GoLineGroup = new HashSet<LineGroupWrap>();
}
public double[] ToLineGroupProfile
(LineGroupType toLineGroup, int CycleTime)
{
var buffer = new double[CycleTime];
var profileTool = new CyclicProfileTool();
foreach (var lineG in GoLineGroup)
{
if (lineG.ToLineGroup.Keys.Contains(toLineGroup))
{
var toProfile = lineG.ToLineGroup[toLineGroup].ToArray();
buffer = profileTool.AddTwoArr(buffer, toProfile);
}
}
return buffer;
} }}
public class NodeWrap
{
private static CyclicProfileTool _cyclic = new CyclicProfileTool();
private static DeleyTool _deley = new DeleyTool();
private static Optimization _optim = new Optimization();
#region property
public bool Condition
{ get
{ if (BufferEdgeId.Count == Node.InEdge.Count)
return true;
else
return false; } }
private List<int> _bufferEdgeOut = new List<int>();
public List<int> BufferEdgeOut
{
get { return _bufferEdgeOut; }
88

set { _bufferEdgeOut = value; }


}
private double T { get; set; }
private double[] _outProfil;
public double[] OutProfil
{ get { return _outProfil; }
private set { _outProfil = value; } }
private Dictionary<EdgeType, List<LineGroupType>> OutEdge_InLineGroup
{ get; set; }
private bool _state = false;
public bool State
{
get { return _state; }
set { _state = value; }
}
private List<int> BufferEdgeId
{ get; set; }
public List<LineGroupWrap> GetGoLineGroup
{
get
{
return _optim.GetGoProfiles(this.tlLogic, this.CycleTime, this.T);
}
}
public double F
{
get;
private set;
}
private ICollection<LineGroupWrap> InLineGroup
{ get; set; }
public NodeType Node
{
get;
private set;
}
public TlLogicWrap tlLogic
{
get;
private set;
}
public float CycleTime
{ get; set; }
public NodeTypeEnum Type
{
get
{
return Node.TransportType;
}
}
public List<LineGroupWrap> oneLineGroup
{
get
89

{
var oneLG = tlLogic.AllGoLineGroup().
GroupBy(v => v).
Where(g => g.Count() == 1).
Select(s => s.Key).ToList();
return oneLG.ToList();
}
}
public List<LineGroupWrap> multyLineGroup
{
get
{
var multyLG = tlLogic.AllGoLineGroup().
GroupBy(v => v).
Where(g => g.Count() > 1).
Select(s => s.Key);
return multyLG.ToList();
}
}
public ICollection<EdgeType> OutEdge
{
get { return Node.OutEdge; }
}
public ICollection<EdgeType> InEdge
{
get { return Node.InEdge; }
}
public NodeWrap(NodeType node, NodeFlowType nodeFlow, double T = 0.25, double F = 0.1)
{
Node = node;
this.T = T;
this.F = F;

var intensityLineG = (new GCityAnalysis()).GetIntensityNode(node, nodeFlow);


var tlLogic = new TlLogicWrap(node.TlLogic)
{
Intensity = intensityLineG
};
this.tlLogic = tlLogic;
InLineGroup = new HashSet<LineGroupWrap>();
BufferEdgeId = new List<int>();
OutEdge_InLineGroup = RealLineGroupInEdge(node);
}
public NodeWrap(NodeType node, double flow, double T = 0.25, double F = 0.1)
{
Node = node;
this.T = T;
this.F = F;
_cyclic = new CyclicProfileTool();
_deley = new DeleyTool();
var length = (int)(T * 3600);
OutProfil = _cyclic.InitDefaultCPF(flow, length);
}
90

public NodeWrap(NodeType node)


{
Node = node;
_cyclic = new CyclicProfileTool();
_deley = new DeleyTool();
}
public int CountGoLineGroup(LineGroupWrap lineG)
{
int count = 0;
foreach (var phase in tlLogic.Phase)
if (phase.LineGroup(lineG) && (phase.PhaseFactor == 0))
count++;
return count;
}
public bool SetInEdge(ref EdgeWrap edge)
{
if (BufferEdgeId.Contains(edge.InternalId) == false)
{
BufferEdgeId.Add(edge.InternalId);
var LineGroup = edge.LineGroup
.Where(w => w.LineGroup.To == Node)
.ToList();
var goLineGroup = GetGoLineGroup;
int countLineG = LineGroup.Count();
for (int index = 0; index < countLineG; index++)
{
var lineG = LineGroup[index];
var lineGProperty = goLineGroup.Single(s => s.LineGroup == lineG.LineGroup);
lineG.OutProfil = _cyclic.InProfil(lineG.OutProfile(), F);
lineG.GoProfil = lineGProperty.GoProfil;
lineG.Dur = lineGProperty.Dur;
lineG.Cycle = lineGProperty.Cycle;
lineG.Coefficient = lineGProperty.Coefficient;
lineG.Flow = lineGProperty.Flow;

InLineGroup.Add(lineG);
} return true; } else return false;
}
public IEnumerable<EdgeWrap> GetOutEdge(FlowPeriodType flowPeriod)
{
var dicEdgeLineG = new Dictionary<EdgeType, List<LineGroupWrap>>();

var inLineG = InLineGroup.Select(s => s.LineGroup)


.ToList();
NodeFlowType nodeFlow = flowPeriod.NodeFlow
.Single(s => s.Node == Node);
var length = (int)(T * 3600);
foreach (var edge in OutEdge_InLineGroup.Keys)
{
if (BufferEdgeOut.Contains(edge.InternalId) == false)
{
var profil = new double[length];
var flag = true;
91

var lineGroup = OutEdge_InLineGroup[edge];


var countLineG = lineGroup.Count;
for (int index = 0; index < countLineG; index++)
{
var lineG = lineGroup[index];
if (inLineG.Contains(lineG) == true)
{
var lineGWrap = InLineGroup
.Single(s => s.LineGroup == lineG);
//На входе в связь может быть несколько/пара групп полос
var toLineGroup = edge.LineGroup
.Where(w => w.From == this.Node)
.First();//!!!
var rate = nodeFlow.TurnRate
//где, текущая груп. полос является From
.Single(s => ((s.FromConnector.From == lineG)
// а To принимающая группа полос
&& (s.FromConnector.To == toLineGroup)))
.Rate;
var buffRate = _cyclic.MultiplicationArrToConst
(lineGWrap.OutProfil.ToArray(), rate);
var goProfilLineGW = GetGoLineGroup
.Single(s => s.LineGroup == lineGWrap.LineGroup)
.GoProfil;
lineGWrap.QueueProfil = _cyclic.QueueProfil(lineGWrap.OutProfil,
goProfilLineGW);
profil = _cyclic.AddTwoArr(buffRate, profil); } else {
flag = false;
break; } }
if (flag == true) {
if (edge.To.TransportType == NodeTypeEnum.TrafficLight)
{
var toNodeFlow = flowPeriod.NodeFlow
.Single(s => s.Node == edge.To);

var toNode = new NodeWrap(edge.To, toNodeFlow);


int countLine = (int)edge.LineGroup
.Single(s => s.From == this.Node)
.LinesCount;
var goProfil = GetGoProfil(lineGroup, GetGoLineGroup, CycleTime);
var outProfil = GeneralOutProfil(profil, goProfil, countLine);
var edgeWrap = new EdgeWrap(edge, flowPeriod, outProfil, this, toNode)
{ Condition = true };
BufferEdgeOut.Add(edgeWrap.InternalId);
yield return edgeWrap;
} else {
var odNode = new NodeWrap(edge.To);
var edgeWrap = new EdgeWrap(edge, flowPeriod, profil, this, odNode)
{ Condition = true };
BufferEdgeOut.Add(edgeWrap.InternalId);
yield return edgeWrap;
} } } } }
92

private double[] GetGoProfil(List<LineGroupType> lineGroup, List<LineGroupWrap>


GoLineGroup, double CycleTime)
{ var goProfilLineG = GoLineGroup
.Where(w => lineGroup.Contains(w.LineGroup) == true)
.ToList();
double[] goProfil = new double[(int)CycleTime];
int countGo = goProfilLineG.Count();
for (int g = 0; g < countGo; g++)
{
goProfil = _cyclic.AddTwoArr(goProfil, goProfilLineG[g].GoProfil);
}
goProfil = _cyclic.ExpansionArr(goProfil, (int)(T * 3600));
return goProfil;
}
private double[] GeneralOutProfil(double[] profil, double[] GoProfil, int countLine)
{
var queueProfil = _cyclic.QueueProfil(profil, GoProfil);
var saturation = _deley.CurrentSaturation(countLine);
var outProfil = new List<double>();
for (int i = 0; i < outProfil.Count(); i++)
{
if (GoProfil[i] == 0) outProfil.Add(0);
else
if ((GoProfil[i] > 0) && (queueProfil[i] > 0))
outProfil.Add(GoProfil[i]);
else
if ((GoProfil[i] > 0) && (queueProfil[i] == 0))
outProfil.Add(profil[i]);
}
return profil;
Dictionary<EdgeType, List<LineGroupType>> RealLineGroupInEdge(NodeType node)
{
var resDic = new Dictionary<EdgeType, List<LineGroupType>>();
var connectors = node.Connection.Connectors;
var edges = node.OutEdge;
foreach (var connect in connectors)
{
foreach (var edge in edges)
{
if (edge.LineGroup.Contains(connect.To))
{
if (resDic.Keys.Contains(edge))
resDic[edge].Add(connect.From);
else
{
var listLineGroup = new List<LineGroupType>();
listLineGroup.Add(connect.From);
resDic.Add(edge, listLineGroup);
} } } } return resDic; } }}

class LineGroupWrap
{ private LineGroupType lineGroup;
private DeleyTool _deley;
93

private CyclicProfileTool _cyclic;


public double Dur
{ get; set; }
public double Coefficient
{ get; set; }
public int LinesCount
{
get
{ return Convert.ToInt32(lineGroup.LinesCount); } }
private Dictionary<LineGroupType, List<double>> _toLineGroup =
new Dictionary<LineGroupType, List<double>>();
public Dictionary<LineGroupType, List<double>> ToLineGroup
{
get
{ return _toLineGroup; }
set
{ _toLineGroup = value; }
}
public LineGroupType LineGroup
{
get
{ return lineGroup; }
protected set
{ lineGroup = value; }
}
public int InternalId
{
get
{ return lineGroup.InternalId;
}
}
private double[] _goProfil;
public double[] GoProfil
{
get
{ return _goProfil;}
set
{ _goProfil = value; } }
private double[] _outProfil;
public double[] OutProfil
{
get
{ return _outProfil; }
set
{
_outProfil = value;1 }
private double[] _inPrifil;
public double[] InProfil
{
get
{ return _inPrifil; } set
{ _inPrifil = }
private double[] _queueProfil;
94

public double[] QueueProfil


{ get
{ return _queueProfil; }
set
{ _queueProfil = value; } }
private EdgStateType _oldLineGroupState;
public EdgStateType OldLineGroupState
{
get
{ return _oldLineGroupState; }
set
{ _oldLineGroupState = value; } }
private double _cycle = 0;
public double Cycle
{ get
{ return _cycle;
}
set
{ _cycle = value; } }
private double _flow = 0;
public double Flow
{
get
{ return _flow; }
set
{
_flow = value;
} }
private double _saturation = 0;
public double Saturation
{
get
{ return _saturation; }
set
{
_saturation = (value > 0) ? value : CurrentSaturation();
}
}
private SaturationSettings _saturationSettings;
public SaturationSettings SaturationSettings
{
get
{ return _saturationSettings; }
set
{ _saturationSettings = value; } }
public LineGroupWrap(LineGroupType LineGroup,
double Cycle = 0, double GreenTime = 0, double Saturation = 0)
{ _deley = new DeleyTool();
_cyclic = new CyclicProfileTool();
this.LineGroup = LineGroup;
this.OldLineGroupState = new EdgStateType()
{
InitialQueue = 0,
95

LineGroup = this.LineGroup
};
this.Cycle = Cycle;
this.Saturation = Saturation;
}
public double[] OutProfile()
{
if (this.OutProfil == null)
return this.InProfil;
else
return this.OutProfil;
}
public double CurrentSaturation(SaturationSettings SaturationSettings, double E_HV = 2)
{
this.SaturationSettings = SaturationSettings;
return _deley.CurrentSaturation(this.LinesCount, SaturationSettings, E_HV);
}
public double CurrentSaturation(double E_HV = 2)
{
this.SaturationSettings = new SaturationSettings();
return _deley.CurrentSaturation(this.LinesCount, E_HV);
}
}
}

public class EdgeWrap


{
private DeleyTool _deley;
private CyclicProfileTool _cyclic;

private bool _condition = false;


public bool Condition
{
get { return _condition; }
set { _condition = value; }
}
public double[] InProfil
{
get;
protected set;
}
public double[] OutProfil
{
get;
set;
}
private EdgeType _edge;
/// <summary>
/// Связь
/// </summary>
public EdgeType Edge
{
get { return _edge; }
96

protected set { _edge = value; }


}
public int InternalId
{
get { return Edge.InternalId; }
}
private ICollection<NodeFlowType> InternalNodeFlow
{
get;
set;
}
private LineGroupWrap FirstLineG
{
get;
set;
}
private List<LineGroupWrap> _lineGroup;
private LineGroupWrap firstLineG;
public List<LineGroupWrap> LineGroup
{
get { return _lineGroup; }
set { _lineGroup = value; }
}
public List<LineGroupWrap> LastLineGroup
{
get
{
if (LineGroup.Count() == 1)
return LineGroup;
else
return LineGroup.Where(w => w.LineGroup.To == To.Node).ToList();
} }
public NodeWrap From
{
get;
protected set;
}
public NodeWrap To
{
get;
protected set;
}
#endregion
public EdgeWrap(EdgeType Edge, FlowPeriodType FlowPeriod, double[] InProfil,
NodeWrap NodeFrom, NodeWrap NodeTo)
{
_deley = new DeleyTool();
_cyclic = new CyclicProfileTool();
LineGroup = new List<LineGroupWrap>();
//Получаем связь
this.Edge = Edge;
this.InProfil = InProfil;
this.From = NodeFrom;
97

this.To = NodeTo;
this.InternalNodeFlow = FlowPeriod.NodeFlow
.Where(s => s.Node.TransportType == NodeTypeEnum.InternalJunction)
//которые принадлежат данной связи
.Where(w => Edge.InternalJunctions.Contains(w.Node))
ToList();
//Просчитываем группу полос, для которой InProfil явяляется входным
firstLineG = FirstLineGroup(InProfil);
//Если связь состоит из более чем одной группы полосы,
if (Edge.LineGroup.Count() > 1)
this.LineGroup = nextLineGroup(firstLineG);

private List<LineGroupWrap> nextLineGroup


(LineGroupWrap first)
{ var buffer = new List<LineGroupWrap>();
//Выбераем все гурппы полос, кроме первой
var lineGroup = Edge.LineGroup.Where(w => w != first.LineGroup).ToList();
//Получаем доли поворотных потоков внутренних узлов
var turnRate = InternalNodeFlow
.SelectMany(s => s.TurnRate);
///Получаем выходной поток от первой с начла группы полос
var outPrifil = first.OutProfile();
//Проходим по всем, кроме первой, группам полос
foreach (var lineG in lineGroup)
{
//Удостоверяемся, что на данная груп. полос существ. коннектор
//где данная группа полос является To
var connectorFlag = turnRate.Select(s => s.FromConnector.To).Contains(lineG);
if (connectorFlag == true)
{
//Берем долю поворотного потока
var rate = turnRate
//где, груп. полос From, а текущая To
.Single(w => ((w.FromConnector.To == lineG)
&& (w.FromConnector.From == first.LineGroup)))
//для которых есть доля поворотного потока
.Rate;
//Умножаем выходной профиль первой груп. полос на долю
//поворотного потока текущей группы полос, получая InProfil
var profil = _cyclic.MultiplicationArrToConst(outPrifil, rate);
//Создаем оболочку для текущей груп. полос (From)
var lineGWrap = new LineGroupWrap(lineG)
{
//и передаем ей входной профиль
InProfil = profil
};
//optimLine.OutProfile();
buffer.Add(lineGWrap);
} } return buffer; }

private LineGroupWrap FirstLineGroup(double[] Inprofil)


{ //Получаем узел с From, от текущей связи
var fromNode = Edge.From;
98

//Получаем первую группу полос


var firstLine = Edge.LineGroup
//при условии, что From груп. полос есть fromNode связи
.Where(w => w.From.InternalId == fromNode.InternalId).First();
//По умолчанию создаем разрешающий GoProfil
//длины равной входному профилю
var goProfil = new double[Inprofil.Count()];
for (int i = 0; i < Inprofil.Count(); i++)
{
goProfil[i] = 1;
}
var lineGroupWrap = new LineGroupWrap(firstLine)
{
InProfil = Inprofil,
//и GoProfil
GoProfil = goProfil
};
//Возврящаем первую группу полос
return lineGroupWrap;
}
}