如何在OMNeT ++中创建随机连接的图?

时间:2019-11-09 13:45:55

标签: omnet++

我正在尝试使用随机连接的节点创建图。 节点应该随机连接,并且如果一个节点已经连接到另一个节点,则不应再使用不同的inout端口将其连接到同一节点。

In the docs,下面是创建随机图的示例:

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

但是这种方法可能使用不同的端口多次连接相同的两个节点,这不是我想要的。

connected nodes

从上面的屏幕快照中可以看到,node1通过两个不同的端口连接到node6

我不希望出现这种情况,因为在我的代码中,我正在使用for循环将消息发送到所有out端口,然后将相同消息两次发送到同一节点。

我可以尝试在initialize()函数中消除到同一个节点的多个连接,我在撰写本文时就想到了这一点。我还没有尝试过,但是我会并且将分享结果。 我也想听听您的解决方案。

1 个答案:

答案 0 :(得分:1)

您使用的示例应在手册中更正。内部for循环必须从外部循环中索引的当前值开始。此外,由于根据OMNeT ++手册,运算符++应该用于门:

  

gatename ++表示法将导致使用第一个未连接的Gate索引。

感谢++,无需维护要连接的门的索引。
最后更改:满足条件时,应同时连接输入和输出门。
您的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++;
        }
}

编辑
有关@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++;
        }
}