2016-04-07 28 views
1

我正在開發OMNeT ++中的網絡模型,其中我引入了自定義通道類型來表示網絡中的鏈接。對於這個通道類型實例的一個屬性,我想分配一個隨機參數。但是,對於連接的門,隨機數應該是相同的。爲連接的OMNeT ++門指定隨機選擇,但匹配參數?

我的節點定義具有以下大門定義:

​​

在我的網絡配置,我連接使用簡單<-->語法節點,例如:

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++ mailing list所示,發生這種情況是因爲<-->語法實際上是用於創建兩個不同的連接,因此兩個圖形的速記從隨機數分佈發生。

如何爲連接的屬性分配一個隨機參數對於兩個連接的門的兩個方向具有相同的值?有沒有在omnetpp.ini文件中執行此操作的方法,或者是否需要在例如Perl,Ruby或Python中創建腳本來爲我的運行生成omnetpp.ini

回答

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; 
} 
+0

我不知道你的如果兩個通道是並行創建的(但我也不知道OMNeT ++是否以這種方式進行優化),解決方案將起作用。我可以想象(但沒有測試過),通過使用[命名迭代變量](https://omnetpp.org/doc/omnetpp/manual/usman.html#sec343),基本上可以使用簡單的解決方法一個臨時設置:'.myParameter = $ {par = uniform(1,10)}',然後是'.impendance = $ {$ par}',或者從別處加載參數,而不是寫入反向通道實際頻道。 –

+1

@Rens van der Heijden:'OMNeT ++'使用一個線程,所以不可能並行創建兩個模塊,通道等。由於文本替換,不可能使用臨時變量。因此在你的例子中:'**。impedance = $ {$ par}'產生'**。impedance = uniform(1,10)',所以分配一個新的隨機值。 –

+0

@JerzyD。非常感謝!這正是我需要的。並且也要感謝爲什麼在'omnetpp.ini'中不可能直接解釋這個問題 - 我會一直想知道我是不是隻使用「hack」。 – Technaton