AnyLogic
Развернуть
Размер шрифта

Программное создание сети

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

Демо-модель: Create Transporter Network by Code Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

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

Чтобы создать сеть программно, мы создаем функцию, в теле которой вводим Java код, который создает сеть, помещает ее на уровень и инициализирует уровень. В демонстрационной модели мы используем следующий код:

// Создать прямоугольный узел с аттрактором внутри
rn = new RectangularNode();
rn.setPos(300.0, 350.0, 0.0);
rn.setSize(100.0, 90.0);
rn.addAttractor(new Attractor(25.0, 25.0, 4.7));

// Создать точечный узел
pn = new PointNode();
pn.setRadius(5);
pn.setLineColor(dodgerBlue);
pn.setPos(50.0, 300.0);

// Создать путь от исходного узла до сетевого порта
Path path = new Path( );
path.setBidirectional(true);
path.addSegment(new MarkupSegmentLine(50.0, 300.0, 0.0, 150.0, 300.0, 0.0));
path.setSource(pn);
NetworkPort outNP = path.createPort(PathEndType.END);

// Создать путь от другого сетевого порта до конечного узла
Path path1 = new Path( );
path1.setBidirectional(true);
path1.addSegment(new MarkupSegmentLine(200.0, 300.0, 0.0, 350.0, 300.0, 0.0));
path1.addSegment(new MarkupSegmentLine(350.0, 300.0, 0.0, 350.0, 350.0, 0.0));
path1.createPort(PathEndType.BEGIN, outNP);
path1.setTarget(rn);

// Создать сеть, в которую входят узлы и пути, созданные ранее
n = new Network(this, "myNetwork");
n.addAll(rn, pn, path, path1);

// Создать и инициализировать уровень, который содержит сеть
Level level = new Level(this, "myLevel", SHAPE_DRAW_2D3D, 0);
level.add(n); level.initialize(); // Нельзя вносить изменения после инициализации! return level;

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

Сначала мы создадим прямоугольный узел и укажем его местоположение и размеры. Местоположение задается функцией узла setPos(), где в качестве аргументов мы передаем X-Y-Z координаты верхнего левого угла прямоугольного узла. Чтобы задать размер, мы передаем ширину и высоту прямоугольного узла в радианах в качестве аргументов функции узла setSize().

Затем мы используем функцию addAttractor(), чтобы создать в узле аттрактор. В качестве аргументов мы передаем X и Y координаты аттрактора и угол его поворота в радианах. Обратите внимание, что у нас нет необходимости указывать аттрактор в качестве места назначения в блоке MoveByTransporter, поскольку при наличии аттрактора в узле транспортер в любом случае будет двигаться именно к нему.

Создание точечного узла

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

Создание путей и соединение их с сетевыми портами и узлами

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

Этот путь состоит из одного сегмента. Сегмент пути создается с помощью функции пути addSegment(), аргументом которой служит конструктор MarkupSegmentLine. Этот конструктор в свою очередь принимает шесть аргументов: X, Y и Z-координаты начальной и конечной точек сегмента.

Создав путь path, мы соединяем его с точечным узлом. Поскольку точечный узел соединяется с начальной точкой пути, то мы используем функцию пути setSource(), в качестве аргумента которой мы передаем сам точечный узел.

Теперь мы создадим другой путь, path1, который будет соединять второй сетевой порт с конечным прямоугольным узлом. Этот путь состоит из двух сегментов. Мы добавим их в порядке размещения от начальной точки пути.

После этого мы соединяем путь path1. Вначале соединяем его начальную точку с сетевым портом, который путем вызова функции path1.createPort(PathEndType.BEGIN, outNP); тут же и создается и связывается с существующим сетевым портом outNP. Далее мы соединяем конечную точку пути с прямоугольным узлом: path1.setTarget(rn);. Поскольку в этот раз мы соединяем конечную точку пути, то мы используем функцию пути setTarget().

Создание сети

Мы указали все необходимые для создания сети элементы. Далее в качестве аргументов конструктора Network мы передаем ссылку на агента (this), внутрь которого будет добавлена сеть, и указываем имя сети ("myNetwork").

После создания пути мы добавляем в нее ранее созданные узлы и пути, передавая их в качестве аргументов функции add():

n.addAll(rn, pn, path, path1);

Создание и инициализация уровня

В последнюю очередь мы создаем уровень, на котором будет размещаться наша сеть. Мы передаем ссылку на агента (this) и имя уровня, задаем режим отображения (2D, 3D или оба режима) и Z-координату уровня (в нашем случае это значение равно нулю):

Level level = new Level(this, "myLevel", SHAPE_DRAW_2D3D, 0);

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

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

Добавление элементов в группу presentation

Чтобы созданные нами элементы были видны во время выполнения модели, мы добавим их в группу presentation. Для этого мы вызываем функцию add() объекта presentation в качестве действия При запуске агента Main (в секции свойств Действия агента) и передаем созданный нами уровень (myLevel) в качестве аргумента.

Как мы можем улучшить эту статью?