2016-04-07 8 views
1

Ağımdaki bağlantıları temsil etmek için özel bir kanal türü oluşturduğum OMNeT ++ içinde bir ağ modeli geliştiriyorum. Bu kanal türünün örneklerinin bir özelliği için rastgele bir parametre atamak istiyorum. Bununla birlikte, bağlı kapılar için rasgele sayı aynı olmalıdır.Rasgele seçilen, ancak bağlı OMNeT ++ kapıları için eşleşen parametreleri atayın mı?

Benim düğüm tanımı aşağıdaki kapıları tanıma sahip: Benim ağ yapılandırmasında

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

, ben basit <--> sözdizimi kullanarak düğümleri bağlamak, örneğin:

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

Şimdi, bu AgentConnectionChannel bir özelliğe sahiptir rastgele atamak istediğim empedansı olarak adlandırıldı. Bu empedansı özelliği A -> B ve B -> A için aynı olmalıdır. Ağ tanımına { impedance = default(unitform(1, 10)) } eklemeyi ve **.agentConnections$o[*].channel.impedance = uniform(1, 10)'u omnetpp.ini içine eklemeye çalıştım. Her iki durumda, yine de, A -> B B daha atanan farklı bir değere sahiptir -> A

<--> sözdizimi iki farklı bağlantıları bu nedenle iki çizimler oluşturmak için bir kestirme aslında, çünkü OMNet++ mailing list belirtilen Bu olurken

rasgele sayı dağıtımından gerçekleşir.

Bağlantı özelliklerine rastgele bir parametre atayabilirim ve, bağlı iki kapının her iki yönü için aynı değere sahip midir? Bunu, omnetpp.ini dosyasında yapmanın bir yolu var mı, yoksa Çalışmalarım için omnetpp.ini oluşturmak için bir Perde, Ruby veya Python komut dosyası oluşturmam gerekiyor mu?

cevap

2

Sorununuzun basit bir çözümü yoktur ve yalnızca omnetpp.ini dosyasının işlenmesiyle giderilemedi.
El ile ikinci yön için bir parametre değeri yeniden yazmayı öneriyorum. Bir kanal için bir C++ sınıfının hazırlanmasını gerektirir (muhtemelen yapmış olduğunuz).

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

ve omnetpp.ini size sahiptir: varsayarsak NED da kanal tanım ilerlemekte olduğunun

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

Eğer C++ sınıf AgentConnectionChannel hazırlamalısınız:

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

Seninkini emin değilim Her iki kanal da paralel olarak oluşturulduğunda çözüm (ancak OMNeT ++ 'nın bu şekilde optimize edilip edilmediğini de bilmiyorum). Temel olarak kullanarak [adlandırılmış yineleme değişkeni] (https://omnetpp.org/doc/omnetpp/manual/usman.html#sec343) kullanarak daha basit bir çalışma yapmanın mümkün olduğunu hayal edebiliyorum (ancak test etmedik). geçici bir ayar: '.myParameter = $ {par = tekdüze (1,10)}' ve sonra '.impendance = $ {$ par}' ya da alternatif olarak başka bir yerden parametre yüklemek gerçek kanal. –

+1

@Rens van der Heijden: “OMNeT ++”, iki parçanın, kanalların vb. Paralel olarak oluşturulma imkanı olmadığı için tek bir iplik kullanır. Metinsel ikame nedeniyle geçici bir değişkenin kullanılması mümkün değildir. Örneğinizde bir sonuç olarak: '**. Empedans = $ {$ par}', '**. Empedans = uniform (1,10)' ile sonuçlanır, böylece yeni bir rasgele değer atanır. –

+0

@JerzyD. Çok teşekkürler! Bu tam ihtiyacım olan şey. Ayrıca, "omnetpp.ini" nin neden doğrudan mümkün olmadığına ilişkin açıklama için de teşekkürler - her zaman "hack" kullanıp kullanmadığımı merak ederdim. – Technaton

İlgili konular