Моделирование транспортных сетей

Группа объектов Основной библиотеки, имена которых начинаются с Network, используется при моделировании транспортных сетей, строящихся на базе имеющегося плана (помещения, местности и т.п.). Обычно они используются при моделировании процессов, проистекающих в каком-то определенном физическом пространстве и включающих в себя движение заявок и ресурсов. Например, это могут быть логистические модели больницы или завода. В таких моделях первым делом задается топология транспортной сети (она задается путем рисования фигур, например, поверх плана здания, используемого в качестве подложки), затем задаются наборы сетевых ресурсов с помощью объектов NetworkResourcePool (отличных от ресурсов ResourcePool: они могут быть статическими, движущимися и переносными), и затем с помощью блок-схемы задается сам моделируемый процесс. Блок-схема может включать в себя вышеуказанные "сетевые" объекты, а может и "обычные", такие, как Delay, Seize, Release и т.д. Заявки и ресурсы автоматически отображаются на анимации движущимися вдоль сегментов сети или пребывающими в узлах сети, и опять же эти анимации можно комбинировать с "обычными" анимациями моделей Основной библиотеки.

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

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

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

Чтобы войти в сеть, заявка должна пройти через объект NetworkEnter, чтобы покинуть сеть - через объект NetworkExit. Переместить заявку по сети можно с помощью объекта NetworkMoveTo.

Типы сетевых ресурсов

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

Переносные ресурсы могут переноситься по сети с помощью заявок и/или движущихся ресурсов. Примером переносного ресурса является передвижная рентгеноустановка или тележка. У движущихся и переносных ресурсов есть базовые местоположения. При освобождении движущиеся и переносные ресурсы могут соответственно возвращаться или переноситься в свое базовое местоположение. Сетевые ресурсы задаются с помощью объектов NetworkResourcePool. Ресурсы одного типа (заданные одним объектом NetworkResourcePool) могут иметь различные свойства, но заявка не может выбирать какой-то определенный ресурс из их общего числа: она ссылается на набор ресурсов одного типа просто по имени соответствующего объекта NetworkResourcePool.

Заявка может производить с сетевыми ресурсами следующие операции: захватывать заданное количество ресурсов (моделируется объектом NetworkSeize), освобождать их (NetworkRelease), отсылать захваченные ресурсы в заданный узел сети (NetworkSendTo), присоединять ресурсы к заявке, чтобы они перемещались вместе с ней (NetworkAttach), отсоединять ранее присоединенные ресурсы (NetworkDetach). В том случае, если какая-то из этих операций производится сразу с несколькими ресурсами, задается список имен объектов NetworkResourcePool, например: { nurse, nurse, XRay }.

Управление ресурсами

Управление сетевыми ресурсами осуществляется централизованно. Сеть хранит очередь запросов ресурсов (исходящих от объектов NetworkSeize) и обрабатывает ее от начала к концу. Если запрос может быть удовлетворен (т.e. все запрашиваемые ресурсы доступны одновременно), то эти ресурсы выделяются для запрашивающей их заявки, иначе доступные ресурсы резервируются этим запросом, а сам запрос помещается в очередь. Это означает, что запрос из середины очереди может быть обслужен только если он не конфликтует ни с одним запросом, находящимся в очереди до него. 

Например, пусть нет ни одного свободного доктора (ресурс  Doctor), один свободный аппарат УЗИ (ресурс U-Sound) и две свободные медсестры (ресурс Nurse). Предположим, в очереди хранится три запроса: { Doctor, U-Sound, Nurse }, { U-Sound }, { Nurse }. Первый запрос не может быть удовлетворен, потому что нет свободных докторов Doctor, но этот запрос все равно резервирует один ресурс U-Sound и один Nurse. Второй запрос не сможет быть удовлетворен, потому что будет зарезервирован U-Sound (хотя он и свободен!), а вот третий запрос удовлетворен будет, потому что одна из двух свободных медсестер Nurse не была ранее зарезервирована ни одним другим запросом.

Находящиеся в сети заявки могут использовать и обычные (несетевые) ресурсы с помощью объектов Seize, Release и Service. Такие ресурсы могут совместно использоваться в нескольких сетях и "переноситься" из одной сети в другую.

Анимация заявок и сетевых ресурсов

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

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

Программный интерфейс сетевых ресурсов и заявок

Находясь в сети заявки и ресурсы предоставляют дополнительный программный интерфейс:

Network getNetwork() - возвращает сеть, в которой находится заявка или ресурс, или null, если таковой сети нет

ShapeRectangle getNetworkLocation() - возвращает узел сети, в котором в текущий момент времени находится заявка или ресурс

setNetworkSpeed( double speed ) - устанавливает новое значение скорости перемещения заявки или ресурса по сети (в пикселах за единицу времени)

double getNetworkSpeed() - возвращает скорость заявки или сетевого ресурса

У класса Entity есть следующие дополнительные методы:

LinkedList<ResourceUnit> getNetworkResourceUnits() - возвращает список сетевых ресурсов, которыми в данный момент владеет заявка (отличается от списка "обычных" сетевых ресурсов). Пользователь не должен самостоятельно изменять этот список.

ResourceUnit getNetworkResourceUnit( NetworkResourcePool pool ) - возвращает (первый найденный) ресурс заданного типа, которым владеет заявка в данный момент, если такого не будет, метод возвращает null

У класса ResourceUnit, в свою очередь, есть следующие методы:

ShapeRectangle getNetworkHomeLocation() - возвращает базовое местоположение ресурса (если это сетевой ресурс)

boolean isNetworkAttached() - проверяет, присоединен ли ресурс к владеющей им заявке (если таковая имеется)

double getNetworkHomeX() - возвращает смещение по оси X базового положения ресурса относительно его базового узла 

double getNetworkHomeY() - возвращает смещение по оси Y базового положения ресурса относительно его базового узла