我正在尝试创建一个具有随机连接节点的图。
节点应该随机连接,如果一个节点已经连接到另一个节点,则不应使用不同的连接再次连接到同一节点inout
port.
在文档中 https://doc.omnetpp.org/omnetpp/manual/#sec:ned-lang:random-graph-example有一个创建随机图的示例:
module RandomGraph {
parameters:
int count;
double connectedness; // 0.0<x<1.0
submodules:
node[count]: Node {
gates:
in[count];
out[count];
}
connections allowunconnected:
for i=0..count-1, for j=0..count-1 {
node[i].out[j] --> node[j].in[i]
if i!=j && uniform(0,1)<connectedness;
}
}
但这种方法可能会使用不同的端口多次连接相同的两个节点,这不是我想要的。
从上面的截图可以看出node1
连接到node6
通过两个不同的端口。
我不希望出现这种行为,因为在我的代码中,我使用 for 循环向所有输出端口发送消息,然后将相同的消息发送到同一节点两次。
我可以尝试消除到同一节点的多个连接initialize()
我想,我只是在创建这篇文章时想到了它。我还没有尝试过,但我会并且会分享结果。
我也想听听您的解决方案。
您使用的示例应该在手册中进行更正。内部 for 循环必须从外部循环中索引的当前值开始。此外,运营商++
应该用于门,因为根据 OMNeT++ 手册:
gatewayname++ 表示法导致使用第一个未连接的门索引。
谢谢++
无需维护要连接的门的索引。
最后的改变:当条件满足时,输入门和输出门都应该连接。
您的 NED 的更正代码可能如下所示:
module RandomGraph
{
parameters:
int count;
double connectedness; // 0.0<x<1.0
submodules:
node[count]: Node {
gates:
in[count];
out[count];
}
connections allowunconnected:
for i=0..count-1, for j=i..count-1, if i!=j && uniform(0,1)<connectedness {
node[i].out++ --> node[j].in++;
node[i].in++ <-- node[j].out++;
}
}
EDIT
有关@Rudi建议的简化代码:
module RandomGraph
{
parameters:
int count;
double connectedness; // 0.0<x<1.0
submodules:
node[count]: Node {
gates:
in[]; // removed the size of gate
out[];
}
connections allowunconnected:
for i=0..count-2, for j=i+1..count-1, if uniform(0,1)<connectedness {
node[i].out++ --> node[j].in++;
node[i].in++ <-- node[j].out++;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)