The ONE使用笔记:批量仿真

做仿真的时候,通常需要表征一个变量对另一个变量的变化,比如不同消息创建周期对投递率的影响,这就要跑多组仿真。本文介绍如何在The ONE上做批量仿真。

1. 设置文件

首先设置好配置文件。假设想考察不同消息创建周期对不同路由协议的影响,这里有两个变量:

  • 路由协议,对应于ONE的Group.router
  • 消息创建周期,对应于MessageEventGenerator的Events1.interval

批量仿真,将每一次仿真结果存储到不同的文件。ONE仿真结果的文件名形如{Scenario.name}_报告名称.txt(报告名称,比如MessageStatsReport),在设置文件的Scenario.name加入变量,变量放在%%...%%间。如下所示:

Scenario.name = %%Group.router%%-%%Events1.interval%%

Group.router = [WithoutXORRouter; WithXORRouter]

Events1.class = MessageEventGenerator
Events1.interval = [1; 1; 2; 2; 3; 3; 4; 4; 5; 5; 6; 6; 7; 7; 8; 8; 9; 9; 10; 10; 11; 11; 12; 12; 13; 13]

重复一些变量(比如1; 1; 2; 2;),可以写个简单脚本生成,举例如下:

#!/usr/bin/env python

def main():
    l = range(1, 14)
    nrof_runs = 2           # nrof runs for each

    list_repeat  = list()

    for item in l:
        for i in range(nrof_runs):
            list_repeat.append(str(item))

    s = '[' + '; '.join(list_repeat) + ']'

    print(s)

if __name__ == '__main__':
    main()

2. 批量运行

可以直接运行./one.sh -b 1:26 my_settings.txt,但这可能会导致仿真结果受到上一次仿真的影响,取决于对仿真器做了哪些修改(比如全局读入一个文件)。为了避免仿真间的影响,我建议写个shell脚本,让每一次仿真独立运行,举例如下:

#!/usr/bin/env bash

file_settings='nc/reports/7_XOR_gtfs/paris_settings.txt'
for ((i=1; i<=26; i++))
do
    ./one.sh -b $i:$i $file_settings &
done

可以在./one.sh后面加一个&,让程序进入后台运行,多进程同时运行,提高效率。ONE仿真器效率低下,如果要运行很久的话,我的做法是,晚上睡前挂机运行,第二天起来再看运行结果(PS:我通常不加&)。

另,可以用shell脚本连接字符串构建更加一般化的配置文件路径,举例如下:

# 连接字符串
dir="/home/qiankun/NetworkSimulator/one_1.5.1-RC2-modified/nc/settings/"
sub_dir="RandomWaypoint/"
item="msgIntervalExMsg"

for ((i=1; i<=18; i++))
do
    ./one.sh -b $i:$i ${dir}${sub_dir}${item}_settings.txt &
done

# 批量注释
:<<BLOCK
...
BLOCK

关于shell脚本的使用,可参见我之前的博文:shell脚本学习笔记:基本语法、流程控制、自定义函数

发表评论

电子邮件地址不会被公开。 必填项已用*标注