Сейчас машины движутся в модели по дороге Tapiolavagen, причем только в одном направлении, с юга на север.
В этой фазе мы создадим перекресток, нарисовав улицу Menninkaisentie, примыкающую к улице Tapiolavagen с востока. После этого мы добавим новые блоки в диаграмму процесса, которые будут моделировать движение машин по обоим дорогам во всех направлениях.
Нарисуйте перекресток
Перекрестки в AnyLogic создаются автоматически при соединении дорог. Нарисуйте улицу Menninkaisentie, примыкающую к Tapiolavagen с востока.
- Как и раньше, начните рисование дороги с двойного щелчка по элементу Дорога в палитре Библиотека дорожного движения.
- Добавьте начальную точку дороги, щелкнув по разделительной полосе Menninkaisentie в правой части рисунка.
- Добавьте конечную точку дороги. Чтобы правильно соединить дороги в Т-образный перекресток, сделайте двойной щелчок мыши, когда увидите зеленую точку на разделительной полосе улицы Tapiolavagen, как показано на рисунке ниже.
- Будет создан трехсторонний перекресток.
- У нарисованной нами дороги по две полосы в каждом направлении, у реальной же улицы Menninkaisentie одна полоса основного движения и одна полоса встречного движения, поэтому нам нужно изменить настройки этой дороги. Откройте свойства только что нарисованной дороги, щелкнув по ней мышью, и сделайте Кол-во полос основного движения и Кол-во полос встречного движения этой дороги равным 1.
- Чтобы в дальнейшем нам было легче ссылаться на эту дорогу в параметрах блоков диаграммы процесса, измените Имя этой дороги на roadEast.
- После внесенных изменений дорожная сеть должна будет выглядеть следующим образом:
Если вы сейчас запустите модель, то увидите, что теперь машины едут не до конца улицы Tapiolavagen, а лишь доезжают до перекрестка и исчезают. Это вызвано тем, что при присоединении новой дороги к уже существующей дороге создается новый элемент разметки пространства AnyLogic - перекресток, который делит существующую дорогу на две отдельные дороги.
В нашей диаграмме процесса блок carSource создает машины в начале дороги road, после чего блок carMoveTo моделирует движение машины до конца той же самой дороги, которая теперь заканчивается у перекрестка (после перекрестка следует уже другая дорога, названная road2).
Давайте переименуем обе эти дороги, чтобы в дальнейшем нам было проще ссылаться на них в блоках диаграммы процесса.
Переименуйте дороги
- Поочередно выделите дороги и измените их имена в свойствах. Пусть дороги теперь называются roadNorth, roadSouth, roadEast (см. рисунок ниже).
Поскольку блоки диаграммы процесса carSource и carMoveTo все еще ссылаются на старое название дороги, нужно внести соответствующие изменения и в параметры этих блоков.
Измените параметры блоков диаграммы процесса
- Выделите блок carSource. Измените его Имя на carSourceS (чтобы подчеркнуть, что этот блок генерирует машины, появляющиеся с юга).
- В поле Дорога этого блока вы увидите старое название дороги. Чтобы заменить его на новое, лучше переключиться из режима задания динамического значения в статический режим выбора элемента, щелкнув по кнопке слева от поля Дорога. Затем выберите имя дороги roadSouth из раскрывающегося списка (см. рисунок ниже).
- Аналогичным образом измените свойства блока carMoveTo. Назовите его carMoveToN (он будет моделировать движение машин до конца уходящей на север дороги) и выберите в поле Дорога: roadNorth.
Если вы сейчас запустите модель, то увидите, что машины снова движутся по дороге Tapiolavagen с юга на север.
Но мы не для того создавали перекресток, чтобы довольствоваться движением машин лишь по одной дороге. Следующим нашим шагом будет добавление новых блоков в диаграмму процесса, чтобы машины начали ездить по всем дорогам, причем в каждом разрешенном направлении.
Добавьте новые блоки в диаграмму процесса
- Вначале давайте переместим существующую диаграмму процесса ниже, под синюю рамку окна модели, поскольку наша диаграмма процесса станет больше, и уже не поместится в ту область под спутниковым снимком, которая отображается в окне модели при ее запуске.
- Теперь давайте добавим блоки, моделирующие движение по той же дороге, но с севера на юг (по полосе встречного движения улицы Tapiolavagen). Добавьте еще один блок CarSource и блок CarMoveTo. Соедините их, как показано на рисунке ниже:
Как вы видите на рисунке, соединители блоков имеют сложную форму. Чтобы соединить порты двух блоков соединителем нестандартной формы, нужно начать рисование с двойного щелчка мышью по первому соединяемому порту, затем (если нужно) добавить точки изгиба соединителя, щелкнув в соответствующих местах холста, и завершить рисование, сделав щелчок внутри второго соединяемого порта.
Измените параметры добавленных блоков диаграммы процесса
- Переименуйте блок carSource в carSourceN (этот блок генерирует машины, появляющиеся с севера).
- В поле Дорога выберите дорогу, на которой будут появляться создаваемые этим блоком автомобили: roadNorth.
- Поскольку нам нужно, чтобы автомобили появлялись в начале полосы встречного движения этой дороги (у ее северного конца), выберите в параметре Помещается на полосу: встречного движения.
- Разверните секцию свойств Автомобиль и выберите в свойстве Новый автомобиль: Car. Теперь блок carSourceN будет генерировать машины созданного нами типа Car, и они будут отображаться в трехмерной анимации не параллелепипедами, а выбранными нами ранее фигурками зеленых автомобилей.
- Аналогичным образом измените свойства блока carMoveTo. Назовите его carMoveToS (он будет моделировать движение машин на юг), выберите в поле Дорога: roadSouth, а также выберите опцию Доехать до конца полосы: встречного движения.
Если вы запустите модель, то увидите, что теперь машины движутся по Tapiolavagen в обоих направлениях.
Теперь давайте промоделируем движение машин, едущих по Menninkaisentie с востока. На перекрестке часть этих машин (примерно половина) будет следовать на юг, а оставшаяся часть - на север.
Добавьте новые блоки в диаграмму процесса
- Добавьте еще один блок CarSource (он будет генерировать машины у начала дороги Menninkaisentie).
- Назовите этот блок carSourceE, а в поле Дорога выберите roadEast. Разверните секцию свойств Автомобиль и выберите в свойстве Новый автомобиль: Car.
- Теперь нам нужно добавить блок, который будет направлять часть машин по дороге Tapiolavagen на север, а часть - на юг. Для этого нам понадобится блок SelectOutput Библиотеки моделирования процессов. Переключитесь на палитру Библиотека моделирования процессов и перетащите блок SelectOutput на диаграмму так, чтобы он соединился с только что созданным блоком carSourceE.
- Назовите этот блок selectNS.
- Два выходных порта блока SelectOutput соедините с входными портами блоков carMoveToN и carMoveToS. Диаграмма процесса должна в итоге выглядеть следующим образом:
Блок SelectOutput перенаправляет поступающих на его вход агентов (в нашем случае - автомобили) на один из двух его выходов согласно заданным вероятностям или в зависимости от выполнения заданного условия. По умолчанию блок работает согласно вероятностям, направляя в верхний порт примерно 50 процентов агентов, что нас устраивает, поэтому менять свойства этого блока нет смысла.
Чаще всего диаграммы процесса моделей дорожного движения составляются из блоков Библиотеки дорожного движения CarSource, CarMoveTo и CarDispose, а также блоков Библиотеки моделирования процессов SelectOutput или SelectOutput5 (для маршрутизации машин по разным направлениям) и Delay (для моделирования пребывания машин на парковках и автобусов на остановках, мы рассмотрим эти случаи в данном учебном пособии позже).
Если вы запустите модель, то увидите, что теперь машины движутся в обоих направлениях по Tapiolavagen, а также приезжают с востока по Menninkaisentie, после чего направляются либо на юг, либо на север. Единственное, что осталось неучтенным в текущей модели - это поворот машин с Tapiolavagen на Menninkaisentie.
Давайте добавим еще несколько блоков в диаграмму процесса, которые позволят нам промоделировать и этот последний неучтенный сценарий движения машин.
Измените диаграмму процесса
- Добавьте еще один блок Библиотеки моделирования процессов SelectOutput. Поместите его между блоками carSourceS и carMoveToN (так, чтобы он автоматически соединился с обоими этими блоками, см. рисунок ниже). Этот блок нужен нам, чтобы распределить поток автомобилей с юга между восточным и северным направлениями. Назовите этот блок selectNE.
- Откройте свойства этого блока. Настройте маршрутизацию автомобилей. Предположим, что большинство автомобилей, едущих по главной дороге (примерно 70%) будут продолжать ехать прямо по ней. В этом случае нам нужно изменить долю автомобилей, которые будут перенаправляться в первый выходной порт этого блока SelectOutput. В свойстве блока Вероятность введите 0.7. Теперь в среднем 70 процентов агентов будут направляться в верхний порт, а 30 - в нижний (мы соединим нижний порт с соответствующим блоком позже).
- Добавьте еще один блок SelectOutput. Назовите этот блок selectSE. Поместите его между блоками carSourceN и carMoveToS (см. рисунок ниже). Этот блок нужен для выбора пути автомобилей, едущих с севера. Аналогично измените долю автомобилей, едущих на перекрестке прямо, на 70 процентов, введя в поле Вероятность 0.7
- Теперь добавьте еще один блок Библиотеки дорожного движения CarMoveTo. Назовите его carMoveToE (он будет моделировать движение машин по Menninkaisentie на восток). Соедините входной порт с нижними портами двух (!) блоков, selectNE и selectSE. Выходной же порт соедините с блоком carDispose, как показано на рисунке ниже.
- Откройте свойства этого блока. Выберите в поле Дорога: roadEast, а также выберите опцию Доехать до конца полосы: встречного движения.
Мы наконец-то закончили задание логики движения машин на перекрестке. Запустите модель и пронаблюдайте за тем, как машины движутся по дорогам.
Демо-модель: Road Traffic Tutorial — Phase 3 Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.-
Как мы можем улучшить эту статью?
-