Я хочу изменить некоторые параметры элемента .ини файл в OMNeT ++, скажем, скорость передачи узла, во время прогона моделирования, например, когда узел получает какое-то управляющее сообщение.
Я нашел информацию о том, что можно как-то зациклить конфигурацию, указанную как: some_variable = $ {несколько значений}, но в .ини файлы и нет возможности передать в эти файлы какие-либо данные из функций C ++ (насколько мне известно).
Я использую INET, но, возможно, пользователи некоторых других моделей уже обеспокоены такой проблемой.
Хотя вы можете, конечно, вручную изменить изменчивые параметры, OMNeT ++ (насколько мне известно) не предлагает интегрированной поддержки автоматического изменения параметров во время выполнения.
Вы можете, однако, написать некоторый код модели, который изменяет изменчивые параметры программно.
Я нашел информацию о том, что можно как-то зациклить конфигурацию, указанную как: some_variable = $ {несколько значений}, но нет никаких условных оговорок в файлах .ini, и нет возможности передать в эти файлы какие-либо данные из функций C ++ (насколько мне известно).
На самом деле вы можете использовать встроенный ограничение Выражение в файле INI. Это позволит вам создавать прогоны для данной конфигурации, соблюдая при этом ограничение (состояние).
Однако это ограничение будет применяться только к параметрам, указанным в INI-файле, т. Е. Это не поможет вам, если переменная, которую вы пытаетесь изменить, динамически вычисляется как часть кода.
Ниже я приведу довольно сложный «фрагмент кода» из файла .ini, в котором используются многие из упомянутых вами встроенных функций (итерация переменных, условия и т. Д.).
# Parameter assignment using iteration loops and constrains #
# first define the static values on which the others depend #
scenario.node[*].application.ADVlowerBound = ${t0= 0.1}s
scenario.node[*].application.aggToServerUpperBound = ${t3= 0.9}s
#
## assign values to "dependent" parameters using variable names and loop iterations #
scenario.node[*].application.ADVupperBound = ${t1= ${t0}..${t3} step 0.1}s # ADVupperBound == t1; t1 will take values starting from t0 to t3 (0.1 - 0.9) iterating 0.1
scenario.node[*].application.CMtoCHupperBound = ${t2= ${t0}..${t3} step 0.1}s
#
## connect "dependent" parameters to their "copies" -- this part of the snippet is only variable assignment.
scenario.node[*].application.CMtoCHlowerBound = ${t11 = ${t1}}s
scenario.node[*].application.joinToServerLowerBound = ${t12 = ${t1}}s
#
scenario.node[*].application.aggToServerLowerBound = ${t21 = ${t2}}s
scenario.node[*].application.joinToServerUpperBound = ${t22 = ${t2}}s
#
constraint = ($t0) < ($t1) && ($t1) < ($t2) && ($t2) < ($t3)
# END END END #
Приведенный выше код создает все возможные комбинации значений времени для t0
в t3
где они могут принимать значения между 0.1
а также 0.9
,
t0
а также t3
являются начальной и конечной точками соответственно. t1
а также t2
принимать значения на их основе.
t1
будет принимать значения между t0
а также t3
каждый раз увеличивается на 0.1
(см. синтаксис выше). То же самое верно для t2
тоже.
Тем не менее, я хочу t0
всегда быть меньше чем t1
, t1
меньше чем t2
, а также t2
меньше чем t3
, Я указываю эти условия в constraint
раздел.
Я уверен, что внимательно прочитал этот раздел руководства, поможет вам найти решение.
Если вы хотите изменить какое-либо значение во время симуляции, вы можете просто сделать это в своем коде C ++. Что-то вроде:
handleMessage(cMessage *msg){
if(msg->getKind() == yourKind){ // replace yourKind with the one you are using for these messages
transmission_rate = new_value;
}
На что вы ссылаетесь как some_variable = $ {несколько значений} может использоваться для выполнения нескольких прогонов с различными параметрами. Например, один пробег со скоростью 1 с, один с 2 с и один с 10 с. Это было бы тогда:
transsmission_rate = ${1, 2, 10}s
Для получения более подробной информации о том, как использовать такие значения (например, делать циклы), смотрите соответствующий раздел в OMNeT ++ Руководство пользователя