Изменение количества объектов с течением времени в Omnet++

Я хотел бы изменить количество объектов в моей симуляции в зависимости от времени симуляции. Я нашел это решение (найдено здесь: Как изменить значение параметра с течением времени ?):

Network.numberOfEntities = simTime() < 30s ? 50 : 250

Я использую этот параметр для инициализации подмодулей в файле ned следующим образом:

submodules:
        entities[numberOfEntities]: Entity;

Однако здесь это не работает, номер не меняется. Любая идея, как я могу изменить количество сетевых объектов во время выполнения? Единственная альтернатива, о которой я могу думать, - это создать 250 объектов и сделать активными только 50 в начале и изменить это с помощью параметра с течением времени вместо создания новых объектов.


person mapf    schedule 24.07.2018    source источник


Ответы (1)


Изменение numberOfEntities не влияет на количество entities в сети, так как подмодули создаются только во время запуска симуляции (т.е. когда t=0).
Однако в OMNeT++ API есть возможность об удалении и создании модулей в любой момент — см. Руководство по моделированию , 4.13 Создание динамического модуля.

person Jerzy D.    schedule 24.07.2018
comment
Спасибо за Ваш ответ. Правильно ли я понимаю, что мне нужен какой-то модуль, который проверяет каждый тик, если количество существующих сущностей и параметр больше не совпадают для создания недостающих сущностей, как описано в связанной части руководства? - person mapf; 25.07.2018
comment
Да, вам нужен дополнительный модуль, который будет удалять и создавать модули во время эксперимента. Однако вместо постоянной проверки значения numberOfEntities предлагаю добавить новые параметры. Например: numberOfEntities1, numberOfEntities2, ..., changeTime1, changeTime2` и т. д. Затем запланируйте сообщение самому себе на changeTime1. Когда он сработает, начните удалять/создавать модули, чтобы количество модулей было равно numberOfEntities2 и т. д. - person Jerzy D.; 25.07.2018
comment
Хорошо, похоже, это работает, однако чего сейчас не хватает: как добавить созданный объект в массив объектов, указанный в сетевом файле? - person mapf; 25.07.2018
comment
Невозможно использовать быстрый способ инициализации, упомянутый в руководстве. Мне пришлось пойти на ручное создание, используя метод create. В API я обнаружил, что Omnet предлагает метод создания явно для векторов, который выглядит так: cModuleType::create(const char * name, cModule * parentmod, int vectorsize, int index). Теперь это работает, спасибо! - person mapf; 25.07.2018