为连接的 OMNeT++ 门分配随机选择但匹配的参数?
Assign randomly chosen, but matching parameters for connected OMNeT++ gates?
我正在 OMNeT++ 中开发一个网络模型,我在其中引入了一个自定义通道类型来表示我的网络中的链接。对于此通道类型的一个 属性 实例,我想分配一个随机参数。但是,连接门的随机数应该相同。
我的节点定义具有以下门定义:
simple GridAgent
{
/* ... other paramters/definitions omitted ... */
gates:
inout agentConnections[];
}
在我的网络配置中,我使用简单的 <-->
语法连接节点,例如:
someSwitchyard.agentConnections++ <--> AgentConnectionChannel <--> someWindfarm.agentConnections++;
现在,此 AgentConnectionChannel 有一个 属性 称为 impedance,我想随机分配它。 impedance 属性 对于 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 所示,发生这种情况是因为 <-->
语法实际上是 shorthand 用于创建两个不同的连接,因此会发生随机数分布中的两个绘图。
如何将随机参数分配给连接的 属性 和 对于两个连接的门的两个方向具有相同的值?有没有办法在 omnetpp.ini
文件中执行此操作,或者我是否需要在 Perl、Ruby 或 Python 中创建脚本以生成 omnetpp.ini
为了我的跑步?
您的问题没有简单的解决方案,仅靠操作omnetpp.ini
文件是无法解决的。
我建议手动重写第二个方向的参数值。它需要为频道准备 C++ class(您可能已经完成)。
假设您在 NED 中的频道定义如下:
channel AgentConnectionChannel extends ned.DatarateChannel {
@class(AgentConnectionChannel);
double impedance;
}
并且在 omnetpp.ini
你有:
**.agentConnections$o[*].channel.impedance = uniform(1, 10)
你应该准备 C++
class 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;
}
我正在 OMNeT++ 中开发一个网络模型,我在其中引入了一个自定义通道类型来表示我的网络中的链接。对于此通道类型的一个 属性 实例,我想分配一个随机参数。但是,连接门的随机数应该相同。
我的节点定义具有以下门定义:
simple GridAgent
{
/* ... other paramters/definitions omitted ... */
gates:
inout agentConnections[];
}
在我的网络配置中,我使用简单的 <-->
语法连接节点,例如:
someSwitchyard.agentConnections++ <--> AgentConnectionChannel <--> someWindfarm.agentConnections++;
现在,此 AgentConnectionChannel 有一个 属性 称为 impedance,我想随机分配它。 impedance 属性 对于 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 所示,发生这种情况是因为 <-->
语法实际上是 shorthand 用于创建两个不同的连接,因此会发生随机数分布中的两个绘图。
如何将随机参数分配给连接的 属性 和 对于两个连接的门的两个方向具有相同的值?有没有办法在 omnetpp.ini
文件中执行此操作,或者我是否需要在 Perl、Ruby 或 Python 中创建脚本以生成 omnetpp.ini
为了我的跑步?
您的问题没有简单的解决方案,仅靠操作omnetpp.ini
文件是无法解决的。
我建议手动重写第二个方向的参数值。它需要为频道准备 C++ class(您可能已经完成)。
假设您在 NED 中的频道定义如下:
channel AgentConnectionChannel extends ned.DatarateChannel {
@class(AgentConnectionChannel);
double impedance;
}
并且在 omnetpp.ini
你有:
**.agentConnections$o[*].channel.impedance = uniform(1, 10)
你应该准备 C++
class 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;
}