Nomadic Agentの有効時間(Lifetime)を測定するシミュレーション

屋代がサンプルとして作成したシミュレーションプログラムです.

 ソースファイル

sim1.c シミュレーション本体です.
Makefile メイクファイルです.
header.h 屋代が個人的に良く使用するマクロなどを定義したヘッダファイルです. 今回は内容的には使用していませんが,下記いくつかのプログラムのコンパイルに必要です.
list.h リスト処理のためのヘッダファイル.
list.c リスト処理のためのプログラム.この辺参照.
DEBUG.h 個人的に使用したデバッグのためのヘッダファイル.内容的には未使用ですが, コンパイルのために必要.
rand.c 乱数プログラム.
gw.h デバッグ用にグラフィクス表示するのに使用.
gw.c デバッグ用にグラフィクス表示するのに使用.

 動作イメージ&概要

なお,makeしてできるsimxを実行すると,このような画面が表示されます(動きます!).
(sim1の方は,画面表示せずにシミュレーションを実行します)

 プログラム実行方法

※以下,sim1について説明しますが,simxについてもGWが表示される以外,動きは同一です.
./sim1 -h
と実行すると,以下の説明が表示されます.
  -h                      show this help
  -e endtime(3600.0s)     set endtime
  -m move_int( 0.1s)      set move interval
  -n number(30)           set number of terminals
  -x x_width(15m)         set width of simulation area
  -y y_width(15m)         set width of simulation area
  -a na_area(10.0m)       set NA area width
  -v na_mrea( 5.0m)       set NA move area width
  -r na_rate(20%)         set NA rate
  -R rnd_base(8461)       set seed of rand
  -s na_size(90000byte)   set NA size
ここに表示されているように,コマンドラインでオプションをつけることによって プログラムのパラメータを変更することができます.なお,上記表示の()内はオプションを指定しなかった場合の 値(デフォルト値)です.
例えば,
./sim1 -n 50
と実行すると,端末数を50にして実行します.ただし,この端末数とは,中央部15m×15m(ここではシミュレーション範囲と呼びます) の部分の端末数を指定します.実際のシミュレーション環境上の端末は,このパラメータに見合うように乱数で発生されるので, その何倍か大きな数となります.実際の端末数はシミュレーション結果として,終了時に表示されます.

 コマンドラインオプション一覧

以下,コマンドラインオプションについて説明します.
-h ヘルプを表示して,プログラムを終了します.他のオプションがこれよりも前に指定されている場合, それらのオプションを解釈して()内に表示される値が変化します.
-e endtime シミュレーション終了時刻を設定します.初期値は1時間に相当する3600秒です.浮動少数点で指定可能です.
-m move_int 端末の移動処理の間隔を指定します.初期値では各端末は0.1秒ごとに移動します.
-n number シミュレーション範囲に存在する端末数を指定します.ただし初期配置時のみであり,シミュレーション実行中は ほぼこれに近い端末密度で端末が移動します.初期値は30台です.
-x x_width シミュレーション範囲の幅を指定します.シミュレーション自体はこれよりも広い範囲で実行されますが, NAが発生するのはこの範囲内に限られます.初期値は15mです.
-y y_width シミュレーション範囲の高さを指定します.シミュレーション自体はこれよりも広い範囲で実行されますが, NAが発生するのはこの範囲内に限られます.初期値は15mです.
-a na_area NAの存在範囲を指定します.NAは発生後,発生位置を中心に半径がここで指定された円の内部に居続けようとします. 円から出てしまった場合には,NAは消滅します.初期値は10mです.
-v na_marea NAが移動を開始しようとする領域を指定します.発生位置を中心に半径がここで指定された円の外側に出ると, NAは移動しようとします.移動した結果が,やはり円の外側であった場合には,即座に移動処理を開始します. 初期値は5mです.(ヘルプでna_mreaとなっているのはna_mareaのtype missです.)
-r na_rate 端末にNAが発生する確率です.初期配置時にはここで指定した確率でシミュレーション範囲内の端末にNAが発生します. それ以降は平均10秒に一回,シミュレーション上のNAの数がここで指定した比率より低いかどうかチェックし,低い場合には NAを1つ発生させます.初期値は20%です.
-R rnd_base 乱数の初期値(いわゆるseed)です.同じ数を指定すれば同一のシミュレーションを再現できます.初期値は8461です. ある程度大きな素数を指定することが望ましいようです.
-s na_size 端末上のNAの移動部分の大きさです.byte単位で指定します.初期値は約90KBとなっています.

 実行結果例

[abiko]/home/yashiro/sim 2986 > ./sim1 -e 50
./sim1 -e 50 node = 182 平均時間 測定不能

ほとんどパラメータはデフォルトのままで,終了時間を50秒に設定した結果です. 結果表示のところで,どのようなパラメータで実行したのかわかるように, 最初に起動時のコマンドラインを表示します.(./sim1 -e 50) 続いて,シミュレーション環境上に存在した端末数を表示します.(node = 182) 最後に各NAが存在した平均時間を表示しています.ここで,「測定不能」と表示されていますが, この程度の時間だとシミュレーション上に発生したNAがひとつもその存在範囲内から出なかったため, 発生から消滅までの時間を測定できなかったということを意味しています.
この場合は,シミュレーション終了時刻が早すぎることを意味しています.

次に端末数を5にして3600秒シミュレーションを行った結果を示します.

[abiko]/home/yashiro/sim 2988 > ./sim1 -n 5 
./sim1 -n 5 node = 46 平均時間 98.769736(5926.184161/60)
この場合は,ちゃんと平均時間が表示されています. ここで,98.769736はNAの平均生存時間を表しています.その次の()内の数字は, シミュレーション上で消滅したNAの生存時間の合計と,消滅したNAの数を表しています. 計算すればわかりますが,5926.184161/60 = 98.769736 となっています. ここの後半の数字(この例では60)は比較的重要で,ここの数が十分でない場合 には,誤差が多く含まれている可能性があります.

 実行結果

今のところ,こんな感じの結果です.生存時間は左側Y軸(対数目盛),データ数は消滅したNAの数で右側Y軸です.
人口密度が上がると,NAが消滅しづらくなり,データが取りにくいために誤差が大きくなってしまっています. また,人口密度が上がるとシミュレーション速度が遅くなるために,データが取りづらいことに拍車がかかっています.
Copyright (C) 2003 by Tomoyuki Yashiro