OMNeT++:使用相同种子的模拟重复的不同结果

OMNeT++: Different results for simulation repetition using the same seed

使用的版本:OMNeT++ 5.0 和 iNET 3.4.0


我使用 OMNeT++ 运行 进行大量重复的模拟。 在某些情况下,我不了解我的系统的行为,所以我想使用 Qt 观看该过程。因此我需要重复之前模拟重复的一些特殊情况。

即使我将完全相同的配置文件与相应的种子集结合使用,我也没有得到所需的重复,所以我得到了完全不同的结果。这可能是什么原因?

分析生成的日志文件的文件头,只有以下几行不同:

run General-107342-20170331-15:42:22-5528
attr datetime 20170331-15:42:22
attr processid 5528

所有其他参数完全匹配。我不明白为什么结果不同。 processid 是否与这样的行为相关?

解决问题的一些技巧:

  • 检查差异是否确实是由 Graphical/Non-graphical 差异引起的。 运行 您对两者的模拟:

$ mysim -r 154 -u Cmdenv

$ mysim -r 154 -u Qtenv

$ mysim -r 154 -u Tkenv

检查结果。不同的结果可能是由几个问题引起的:

  • 依赖于 C++ 中的未定义行为,就像您有一个(集合)集合并对其进行迭代。集合的顺序是未定义的,它可以把模拟扔到不同的轨迹
  • 正在访问未初始化的内存
  • 使用仅在图形 运行 时间可用的数据,例如使用由 @displayString 属性 定义的节点位置。节点位置可能会根据布局算法发生变化,并且布局在 Cmdenv
  • 中不可用
  • 更改模型状态,同时测试模型是否 运行ning 在图形 运行 曲线下,即在 if (isGUI()) {} 块内。

首先,我会尝试弄清楚这是否与 GUI 和非 GUI 有关,或者更确切地说是使用未定义的行为。如果 Tkenv 和 Qtenv 给出相同的结果而 Cmdenv 不同,那么这是一个 GUI-nonGUI 问题。如果所有这些都不一样,我会怀疑内存问题或未定义的行为。

如果其他一切都失败了,运行 在 Cmdenv 和 Qtenv 中进行模拟并打开事件记录。比较日志并查看两条轨迹从何处开始发散并围绕该点调试两者 运行 以查看发散的原因。