为连接的OMNeT ++门分配随机选择但匹配的参数?

时间:2016-04-07 21:15:28

标签: c++ omnet++

我正在OMNeT ++中开发一个网络模型,其中我引入了一个自定义通道类型来表示我网络中的链接。对于此通道类型实例的一个属性,我想分配一个随机参数。但是,连接门的随机数应该相同。

我的节点定义具有以下门定义:

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

在我的网络配置中,我使用简单的<-->语法连接节点,例如:

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

现在,此AgentConnectionChannel有一个名为 impedance 的属性,我想随机分配。对于A - &gt;,阻抗属性应该相同。 B和B - &gt;答:我尝试将{ impedance = default(unitform(1, 10)) }添加到网络定义中,并将**.agentConnections$o[*].channel.impedance = uniform(1, 10)添加到omnetpp.ini中。然而,在这两种情况下,A - > B具有与B - >分配的不同值。 A.

正如OMNet++ mailing list所示,这是因为<-->语法实际上是创建两个不同连接的简写,因此随机数分布中会出现两个绘图。

如何为连接的属性分配随机参数,对两个连接的门的两个方向具有相同的值?有没有办法在omnetpp.ini文件中执行此操作,或者我是否需要在Perl,Ruby或Python中创建脚本以为我的运行生成omnetpp.ini

1 个答案:

答案 0 :(得分:2)

您的问题没有简单的解决方案,仅仅操作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;
}