NetworkStorage


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

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

Параметр Количество мест в ряду определяет, сколько узлов сети будет создано на каждой стороне прохода; каждый узел фактически является проекцией набора вертикально расположенных ячеек (их количество задается параметром Количество уровней). Следовательно, такой объект с 60 местами в ряду и 4 уровнями будет иметь 60 * 4 * 2 = 480 ячеек, где коэфффициент 2 означает, что по каждую сторону от прохода будет создано по стеллажу. У каждой ячейки есть координаты: ряд (0..1), место (0..npositions-1) и уровень (0..nlevels-1).

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

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

NetworkStorage может проводить с ячейкой следующие операции:

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

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

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

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

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

  1. Нахождение ячейки, в которой хранится заявка (и соответствующего узла сети)
  2. Возможно, вызов ресурсов к этому узлу
  3. Извлечение заявки из ячейки
  4. Перемещение заявки в заданный узел сети

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

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

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

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

Параметры

Сеть
Имя объекта Network, задающего сеть, в которой находятся данные стеллажи.
Синтаксис: Network network
Обновлять сеть при запуске
Если опция выбрана (true), то при запуске будет вызван метод network.refreshNetwork(). Если у Вас смоделировано много стеллажей, то имеет смысл установить этот параметр в false и обновить сеть, например, по событию в момент времени 0.
Синтаксис: boolean refreshNetwork
Значение по умолчанию: true
Количество мест в ряду
Количество мест в ряду стеллажа (расположенных на одном уровне).
Синтаксис: int npositions
Значение по умолчанию: 10
Количество уровней
Количество (вертикальных) уровней в стеллаже.
Синтаксис: int nlevels
Значение по умолчанию: 1
Фигура прохода
Прямоугольник, задающий фигуру прохода между стеллажами (не должен входить в группу фигур сети).
Синтаксис: ShapeRectangle aisleShape
Не отображать фигуру прохода
Если опция выбрана (true), то фигура прохода не будет отображаться на презентации во время выполнения модели.
Синтаксис: boolean hideAisleShape
Значение по умолчанию: true
Глубина ячейки
Глубина ячейки.
Синтаксис: int positionDepth
Значение по умолчанию: 5
Узел у начала прохода
Узел сети, из которого доступен узел, находящийся в начале прохода между стеллажами.
Синтаксис: ShapeRectangle entryFront
Узел у конца прохода
Узел сети, из которого доступен узел, находящийся в конце прохода между стеллажами.
Синтаксис: ShapeRectangle entryBack
Рисовать хранящиеся заявки
Здесь Вы можете выбрать, где будут рисоваться нахзодящиеся в ячейках зоны хранения заявки: В позиции по умолчанию, В левом верхнем углу или В центре ячейки.
Синтаксис: int drawMode
Значение по умолчанию: В позиции по умолчанию (NetworkStorage.DRAW_DEFAULT)
Действие при помещении [динамический]
Код, выполняемый при помещении заявки в ячейку зоны хранения.
Синтаксис: void onPut
Локальные переменные: T entity - заявка.
             int row - ряд ячейки.
             int position - место ячейки.
             int level - уровень ячейки.
             ShapeRectangle rect -  узел сети, соответствующий ячейке
Действие при извлечении [динамический]
Код, выполняемый при извлечении заявки из ячейки зоны хранения.
Синтаксис: void onRemove
Локальные переменные: T entity - заявка.
             int row - ряд ячейки.
             int position - место ячейки.
             int level - уровень ячейки.
             ShapeRectangle rect -  узел сети, соответствующий ячейке
Действие при резервировании [динамический]
Код, выполняемый, когда ячейка помечается как зарезервированная.
Синтаксис: void onReserve
Локальные переменные: T entity - заявка.
             int row - ряд ячейки.
             int position - место ячейки.
             int level - уровень ячейки.
             ShapeRectangle rect -  узел сети, соответствующий ячейке
Действие при освобождении [динамический]
Код, выполняемый, когда отменяется резервирование ячейки.
Синтаксис: void onRelease
Локальные переменные: int row - ряд ячейки.
             int position - место ячейки.
             int level - уровень ячейки.
             ShapeRectangle rect -  узел сети, соответствующий ячейке
Включить сбор статистики
Если опция выбрана (true), то для объекта будет собираться статистика.
Синтаксис: boolean enableStats
Значение по умолчанию: false

Функции

int capacity() - возвращает вместимость объекта, равной 2*npositions*nlevels

boolean contains(T entity)проверяет, содержат ли данные стеллажи заявку entity.

T get(int row, int position, int level)возвращает заявку, хранящуюся в ячейке с заданными координатами [ряд row, место position, уровень level] (или null, если эта ячейка зарезервирована или свободна).

T getByIndex(int index)возвращает заявку с заданным номером index. Порядок заявок определяется объектом и может изменяться при добавлении и удалении заявок. Если index+1 больше, чем количество заявок, то метод возвращает null.

int[] getCellOf(T entity)возвращает массив координат [ряд row, место position, уровень level] ячейки, содержащей заявку entity, или null, если такая заявка здесь не хранится.

int[] getFreeCell(boolean infront)возвращает массив координат [ряд row, место position, уровень level] свободной ячейки, ближайшей к началу или концу стеллажа, в зависимости от значения параметра infront. Если стеллажи переполнены, возвращает null.

ShapeRectangle getLocationInAisle(int row, int position)возвращает узел сети, расположенный в проходе перед ячейкой с заданными координатами [ряд row, место position] (уровень не имеет значения, поскольку ячейки, располагающиеся одна над другой, имеют один и тот же узел).

ShapeRectangle getLocationOfCell(int row, int position)возвращает узел сети, соответствующий ячейке с заданными координатами [ряд row, место position] (уровень не имеет значения, поскольку ячейки, располагающиеся одна над другой, имеют один и тот же узел).

T getRandom()возвращает случайную заявку из стеллажей, моделируемых данным объектом  или null, если в них не хранится ни одной заявки.

boolean hasSpace()проверяет, есть ли свободное место в стеллажах, моделируемых данным объектом, т.e. есть ли незанятые и незарезервированные ячейки.

boolean isFree(int row, int position, int level)проверяет, свободна ли ячейка [ряд row, место position, уровень level]. Свободной считается не занятая и не зарезервированная ячейка.

boolean isReserved(int row, int position, int level)проверяет, зарезервирована ли ячейка [ряд row, место position, уровень level].

void put(int row, int position, int level, T entity)Помещает заявку entity в ячейку [ряд row, место position, уровень level]. Если ячейка занята, выдает ошибку. Не проверяет ячейку на предмет резервирования.

void release(int row, int position, int level)отменяет резервирование ячейки [ряд row, место position, уровень level]. Ячейка должна быть зарезервирована.

T remove(T entity)извлекает заявку entity из стеллажей, моделируемых данным объектом, и возвращает ее. Если такая заявка не хранится, то возвращает null.

T removeFromCell(int row, int position, int level)извлекает заявку из заданной ячейки [ряд row, место position, уровень level] и возвращает ее.

void reserve(int row, int position, int level)помечает ячейку [ряд row, место position, уровень level] как зарезервированную. При этом яечйка должна быть свободной.

int reserved()возвращает количество зарезервированных ячеек в текущий момент.

void resetStats()удаляет статистику, собранную объектом к текущему моменту времени.

int size()возвращает количество заявок, находящихся в стеллажах, моделируемых данным объектом, в текущий момент.