OMNeT++中.ned文件的循环与赋值问题求助
OMNeT++随机图网络实现问题解决方案
核心思路
OMNeT的NED文件是声明式语法,仅用于定义网络结构模板,无法实现复杂的命令式逻辑(比如变量赋值、条件判断、循环内的变量修改)。你遇到的三个问题本质都是试图在NED中实现它不擅长的逻辑,正确的做法是将随机连接的核心逻辑放到C代码中动态实现。
针对三个问题的具体解决方法
1. 随机目标节点赋值问题
NED不支持在连接块中直接用uniform()给变量赋值,改用OMNeT++ C++ API提供的随机数函数(如intuniform())生成目标节点ID,在网络初始化阶段动态创建连接。
2. 条件判断调整目标节点问题
if dest >= src { dest++; }这类条件逻辑属于命令式操作,NED的连接语法不允许此类嵌套判断。在C++代码中直接对生成的dest变量进行判断和修改即可,完全不受NED语法限制。
3. 循环内连接概率递减问题
NED的for循环仅用于生成重复的结构(如子模块数组),无法实现循环内的变量递减。在C++的初始化循环中,每次迭代后直接修改randConnect变量,还可添加边界检查避免概率为负。
完整实现示例
1. NED网络定义文件(RandomGraphNetwork.ned)
network RandomGraphNetwork { parameters: int nbHost; // 主机数量 double initialRandConnect; // 初始连接概率 submodules: host[nbHost]: SimpleHost; // 自定义主机模块,需提前定义 }
2. C++网络初始化代码(RandomGraphNetwork.cc)
#include <omnetpp.h> using namespace omnetpp; class RandomGraphNetwork : public cSimpleModule { protected: virtual void initialize() override { // 读取NED中定义的参数 int nbHost = par("nbHost"); double randConnect = par("initialRandConnect"); // 遍历每个源节点 for (int src = 0; src < nbHost; src++) { cModule *srcModule = getSubmodule("host", src); if (!srcModule) continue; // 尝试为当前节点创建连接 for (int gateIdx = 0; gateIdx < nbHost - 1; gateIdx++) { // 跳过已连接的端口 cGate *srcGate = srcModule->gate("out", gateIdx); if (srcGate->isConnected()) continue; // 按当前概率决定是否创建连接 if (uniform(0, 1) >= randConnect) continue; // 生成目标节点ID,避免自连接 int dest; do { dest = intuniform(0, nbHost - 1, this); } while (dest == src); // 实现你原逻辑中的dest调整规则 // int dest = intuniform(0, nbHost - 2, this); // if (dest >= src) dest++; cModule *destModule = getSubmodule("host", dest); if (!destModule) continue; cGate *destGate = destModule->gate("in", gateIdx); if (!destGate->isConnected()) { srcGate->connectTo(destGate); } } // 递减连接概率,确保不小于0 randConnect -= 0.05; if (randConnect < 0) randConnect = 0; } } }; Define_Module(RandomGraphNetwork);
内容的提问来源于stack exchange,提问作者Caillou
相关产品推荐
相关产品推荐

