做仿真的时候,通常需要表征一个变量对另一个变量的变化,比如不同消息创建周期对投递率的影响,这就要跑多组仿真。本文介绍如何在The ONE上做批量仿真。
首先设置好配置文件。假设想考察不同消息创建周期对不同路由协议的影响,这里有两个变量:
Group.router
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()
可以直接运行./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脚本学习笔记:基本语法、流程控制、自定义函数。