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 中进行模拟并打开事件记录。比较日志并查看两条轨迹从何处开始发散并围绕该点调试两者 运行 以查看发散的原因。
使用的版本: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 中进行模拟并打开事件记录。比较日志并查看两条轨迹从何处开始发散并围绕该点调试两者 运行 以查看发散的原因。