You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

嘿,我来帮你搞定这个节点对重复连接的问题!你遇到的核心问题是原代码会给同一对节点创建多条不同端口的连接,导致发送消息时重复投递。下面是几个实用的解决方案,按推荐程度排序:

方案1:用OMNeT++内置的randomGraph函数(最省心)

OMNeT++本身就提供了生成无重复连接随机图的工具函数,完全不用自己写复杂的循环判断。它会自动确保每对节点最多只有一条连接(支持有向/无向图),还能动态创建需要的端口,代码超简洁:

module RandomGraph {
    parameters:
        int count;
        double connectedness; // 0.0 < x < 1.0
    submodules:
        node[count]: Node {
            gates: in[]; out[]; // 动态端口,不用预先指定数量
        }
    connections allowunconnected:
        // directed=true生成有向图,false生成无向图,按需选择
        randomGraph(node, connectedness, directed=true);
}

这个函数会帮你处理所有细节,绝对不会出现同一节点对的重复连接,强烈推荐用这个!

方案2:修改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 {
            // 先收集所有能连接的目标节点(排除自身)
            int possibleTargets[] = list(j for j in 0..count-1 if j != i);
            // 随机打乱顺序,保证连接的随机性
            shuffle(possibleTargets);
            // 计算要建立的连接数
            int numConnections = min(floor(possibleTargets.size() * connectedness), possibleTargets.size());
            
            // 给每个选中的目标分配唯一的端口
            for k=0..numConnections-1 {
                int targetNode = possibleTargets[k];
                // 用k作为当前节点的输出端口索引,确保每个端口只对应一个目标
                node[i].out[k] --> node[targetNode].in[i];
            }
        }
}

这里的思路是先给每个节点随机挑选不重复的目标节点,再按顺序分配输出端口,这样同一节点对只会被连接一次,不会出现多条端口连接的情况。

方案3:在initialize()中事后清理重复连接

如果上面两种方法都不适用,你也可以在节点的初始化函数里手动清理重复连接。这种方法是“先创建再清理”,适合无法修改NED连接逻辑的场景:

在你的Node.cc文件里添加如下代码:

#include <set>
#include "Node.h"

void Node::initialize() {
    std::set<int> connectedTargets; // 记录已经连接过的目标节点索引

    // 遍历所有输出端口
    for (int portIdx = 0; portIdx < gateSize("out"); portIdx++) {
        cGate* outGate = gate("out", portIdx);
        if (outGate->isConnected()) {
            // 获取目标节点的索引
            cGate* inGate = outGate->getNextGate();
            Node* targetNode = check_and_cast<Node*>(inGate->getOwnerModule());
            int targetIdx = targetNode->getIndex();

            if (connectedTargets.count(targetIdx)) {
                // 已经连接过这个节点,断开当前重复连接
                outGate->disconnect();
            } else {
                connectedTargets.insert(targetIdx);
            }
        }
    }
}

这段代码会在节点初始化时检查所有输出端口,如果发现多个端口连接到同一个目标节点,就断开多余的连接,保证每对节点只有一条连接。


内容的提问来源于stack exchange,提问作者Burak Kaymakci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:10