Как изменить конфигурацию сети во время моделирования в OMNeT ++?

Я хочу изменить некоторые параметры файла .ini элемента в OMNeT ++, например скорость передачи узла, во время моделирования, например когда узел получает какое-то управляющее сообщение.

Я нашел информацию о том, что можно каким-то образом зациклить конфигурацию, указанную как: some_variable = $ {несколько значений}, но в .ini <нет условных предложений / em> файлы и нет возможности передать в эти файлы какие-либо данные из функций C ++ (насколько я понимаю).

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


person Paweł J    schedule 13.04.2015    source источник


Ответы (3)


Хотя вы, безусловно, можете вручную изменить изменчивые параметры, OMNeT ++ (насколько мне известно) не предлагает интегрированной поддержки автоматического изменения параметров во время выполнения.

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

person Christoph Sommer    schedule 14.04.2015
comment
Именно то, что мне было нужно, было par("*some_parameter*").setLongValue(*new_value*). Конечно, раньше мне приходилось устанавливать *some_parameter* как изменчивый в файле NED. Спасибо! - person Paweł J; 05.05.2015
comment
@Rudi указывает на хитрый трюк для параметров, которые возвращают разные значения в разное время здесь - person Christoph Sommer; 12.07.2015

Я нашел информацию о том, что можно каким-то образом зациклить конфигурацию, указанную как: 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.

Я уверен, что внимательно прочтите этот раздел руководства. , поможет вам найти решение.

person user4786271    schedule 14.04.2015

Если вы хотите изменить какое-либо значение во время моделирования, вы можете просто сделать это в своем коде 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 ++

person floxyz    schedule 14.04.2015