IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    The ONE使用笔记:批量仿真

    SparkandShine发表于 2017-02-05 16:37:42
    love 0

    做仿真的时候,通常需要表征一个变量对另一个变量的变化,比如不同消息创建周期对投递率的影响,这就要跑多组仿真。本文介绍如何在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脚本学习笔记:基本语法、流程控制、自定义函数。



沪ICP备19023445号-2号
友情链接