Назначить случайно выбранные, но совпадающие параметры для подключенных вентилей OMNeT ++?

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

В моем определении узла есть следующее определение ворот:

simple GridAgent
{
    /* ... other paramters/definitions omitted ... */
    gates:
        inout agentConnections[];
}

В моей сетевой конфигурации я подключаю узлы, используя простой синтаксис <-->, например:

someSwitchyard.agentConnections++ <--> AgentConnectionChannel <--> someWindfarm.agentConnections++;

Теперь у этого AgentConnectionChannel есть свойство, называемое импеданс, которое я хотел бы назначить случайным образом. Это свойство импеданса должно быть одинаковым для A -> B и B -> A. Я попытался добавить { impedance = default(unitform(1, 10)) } в определение сети, а также поместить **.agentConnections$o[*].channel.impedance = uniform(1, 10) в omnetpp.ini. Однако в обоих случаях A -> B имеет другое значение, чем B -> A.

Как указано в списке рассылки OMNet ++, это происходит из-за того, что синтаксис <--> на самом деле это сокращение для создания двух различных соединений, поэтому происходят два рисунка из распределения случайных чисел.

Как я могу назначить случайный параметр для свойства соединения и иметь одинаковое значение для обоих направлений двух соединенных ворот? Есть ли способ сделать это в файле omnetpp.ini, или мне нужно создать сценарий, например, на Perl, Ruby или Python для генерации omnetpp.ini для моих запусков?


person Technaton    schedule 07.04.2016    source источник


Ответы (1)


У вашей проблемы нет простого решения, и ее нельзя решить, просто манипулируя omnetpp.ini файлом.
Предлагаю вручную переписать значение параметра для второго направления. Это требует подготовки класса C ++ для канала (что вы, вероятно, уже сделали). Предполагая, что определение вашего канала в NED следующее:

channel AgentConnectionChannel extends ned.DatarateChannel {
  @class(AgentConnectionChannel);
  double impedance;
}

а в omnetpp.ini у вас есть:

**.agentConnections$o[*].channel.impedance = uniform(1, 10)

вам следует подготовить C++ класс AgentConnectionChannel:

class AgentConnectionChannel: public cDatarateChannel {
public:
    AgentConnectionChannel() : parAlreadyRewritten(false) {}
    void setParAlreadyRewritten() {parAlreadyRewritten=true;}

protected:
    virtual void initialize();

private:
    bool parAlreadyRewritten;

private:
    double impedance;
};

Define_Channel(AgentConnectionChannel);

void AgentConnectionChannel::initialize() {
    if (parAlreadyRewritten == false) {
        parAlreadyRewritten = true; 
        cGate * srcOut = this->getSourceGate();
        cModule *owner = srcOut->getOwnerModule();
        int index = srcOut->isVector() ? srcOut->getIndex() : -1;
        cGate *srcIn = owner->gateHalf(srcOut->getBaseName(), cGate::INPUT,
                index);
        cChannel * channel = srcIn->findIncomingTransmissionChannel();
        AgentConnectionChannel * reverseChan =
                dynamic_cast<AgentConnectionChannel*>(channel);
        if (reverseChan) {
            reverseChan->setParAlreadyRewritten();
            // assigning a value from forward direction channel
            reverseChan->par("impedance") = this->par("impedance");
        }
    }

    // and now read a parameter as usual
    impedance = par("impedance").doubleValue();
    EV << getFullPath() << ", impedance=" << impedance << endl;
}
person Jerzy D.    schedule 08.04.2016
comment
Я не уверен, что ваше решение работает, если оба канала создаются параллельно (но я также не знаю, оптимизирует ли OMNeT ++ таким образом). Я мог представить (но не тестировал), что более простой обходной путь возможен с использованием именованная итерационная переменная, в основном используя временную настройку: .myParameter=${par=uniform(1,10)}, а затем .impendance=${$par}, или, альтернативно, загружая параметр из другого места, вместо записи в обратный канал из фактического канала. - person Rens van der Heijden; 08.04.2016
comment
@Rens van der Heijden: OMNeT++ использует один поток, поэтому нет возможности параллельного создания двух модулей, каналов и т. Д. Использование временной переменной невозможно из-за текстовой подстановки. Как следствие в вашем примере: **.impedance=${$par} приводит к **.impedance=uniform(1,10), поэтому назначается новое случайное значение. - person Jerzy D.; 08.04.2016
comment
@JerzyD. Большое спасибо! Это именно то, что мне нужно. И спасибо также за объяснение того, почему это невозможно напрямую в omnetpp.ini - я всегда задавался вопросом, не использую ли я просто взлом. - person Technaton; 11.04.2016