This page contains the usage of Simple Train Schedule Evaluator.
Recently I have made a change, and updated to version 4.0 alpha; it can now run on Cygwin environment. Last modified: 27 April 2001
|
ソースを久しぶりにいじくり、Ver. 4.0 alpha ということにしました。 こういうのを Windows で動くようになった、とはいわないかも知れませんが、 取り敢えず Cygwin 環境の中でなら動いています。
このプログラム「すうじっく」C++版は、 列車ダイヤおよびOD需要データが与えられたとき、 極めて簡単な仮定のもとにそれぞれの列車に乗客を割り付け、 列車ダイヤに関する種々の評価量を計算するものです。 アルゴリズム上その先人のツール (古い PC-9801 の MS-DOS 上で走るもの。 Turbo Pascal で記述されていた) を参考にはしたものの、 コードは完全な高木のオリジナルとなりました。 すべて C++ で書かれております。
なお、 一般に「交通不効用」というばあい、 列車内の混雑状況などを加味しなければなりませんが、 このプログラムでは列車の混雑に関係する要素 (例えば、 300%以上は物理的に乗ることが不可能、 とか、 150%以上の混雑率となると乗客が混雑回避行動を始める、 など) は一切考慮せず、 乗客がこの行動仮説に基づいて 「乗りたいように乗る」場合の行動を計算します。
このため、 このプログラムは混雑率400%といった 非現実的な値も平然と出力しますが、 これは「乗りたいように乗ったらこうなる」 ということを意味しています。 このようなダイヤは、 逆にいうなら混雑していて 「乗りたいように乗る」ことが結果的にできないダイヤであり、 よくない評価が与えられる、 ということでもあります。
このプログラムでは、 行動仮説 F1 に従う客 (以下では頻繁に「乗客 F1」と記述します) のパスを検索する動作を「前方検索」、 行動仮説 F2 に従う客 (同様に「乗客 F2」) のパスを検索する動作を「後方検索」と称します。
このようにしますと、 各発車列車について可能性のあるパスが 「すべて」検索されることでしょう (これを全パス検索と呼ぶことにします)。 次いで、 各発車列車について、 この全パス検索されたものの中から選択可能なものを 選び出す作業をします。 それは次の順序で行います。
このようにして、 各出発列車ごとにパスが決まりますが、 これらのうち捨てるべきパスが存在する場合があります。 それは、 出発列車が後であるにもかかわらず 着駅での到着時刻がより早くなる場合 (具体的にいうなら「通過追い抜き」される場合) です。 この場合は、 追い抜かれるほうのパスをリジェクトします。
こうしてパスがすべて決まりますが、 決まったパスに割り付ける乗客数は次の式で与えられます。
各発車列車について、 この全パス検索されたものの中から選択可能なものを 選び出す作業の優先順位は次のようになります。
各出発列車ごとにパスが決まったのち、 捨てるべきパスを選ぶ基準も同様で、 到着時刻が前であるにもかかわらず発駅での発車時刻が遅くなる場合、 追い抜かれるほうのパスをリジェクトします。
決まったパスに割り付ける乗客数は次の式で与えられます。
時隔の計算は、 今回の場合一つ後のパスとの時隔となることに注意してください。
プログラムは UNIX のいわゆる tar 形式のアーカイブとして、 圧縮をかけた状態で曽根・古関研の高木のホームディレクトリの下に 置いてあります。 アーカイブの中にはサンプルデータファイルもあります。 以下の操作は、 すべて端末エミュレータ (kterm など) をひらいて、 その中で行うものです。
Linux については、 ディストリビューションを買ってきて、 パソコンにインストールしてください。 インストールに成功すれば、 あとはすぐにコンパイルに進めると思います。
Windows については、
Cygwin 環境をインストールしてください。
インターネットに接続できる環境であれば、
http://www.cygwin.com/
から、
setup.exe
という名前のプログラムをダウンロードしてきて実行すれば、
ほぼ完全自動でセットアップが完了するはずです。
以下のソフトをインストールしてあることを前提に話を進めます。
libg++ が不要になったので、 GCC のインストールの方法については解説を省略しました。
Cygwin の場合、 デスクトップ上にある Cygwin のアイコンをダブルクリックすると、 Cygwin のコンソールウィンドウ (実はただの DOS 窓) が開きます。
Linux の場合は、 何らかの手段で端末エミュレータ (kterm とか rxvt とか) を開いてください。
そのコンソールの中で、
$ gzip -dc Diagram-4.0-alpha.tar.gz | tar xvf -とすると、 Diagram-4.0-alpha というディレクトリの下にファイルが開かれます。そこで、
$ cd Diagram-4.0-alphaとして、 このディレクトリに降りてください。
Makefile
というファイルをみてください。
Cygwin 環境では、
LIBS = -lm # -lregexとなっているところを、
LIBS = -lm -lregexのように直し、 regex ライブラリ (POSIX互換正規表現ライブラリ) をリンクする必要があります。 この修正を必要とする商用タイプの UNIX が他にいくつかあるようです。
この修正をしたら、
$ makeとすると、コンパイルされます。出来上がるプログラムは:
schedeval
ijsearch
jisearch
これらは、サーチパスの通った適当なディレクトリに置くこともできますが、 このディレクトリにこのまま置いているものとして説明を続けます。
注……現時点ではプログラムが国際化対応していないため、 Cygwin 環境では日本語のコメントを挿入するのは避けてください。 サンプルは sampledata-e ディレクトリです。
その前に、
$ cp -pr sampledata dataなどとして、専用のデータディレクトリ data をつくってその中で作 業されるとよいかも知れません。
用意するデータファイルにおいて、 # から行末まではコメントとして扱われます。 なお、 # の手前には必ず空白を入れて下さい (行頭にある場合は、構いません)。
ファイルの中のデータが必要数に比べ足りなかった場合や、多すぎる場合、 あるいは不正な値を記入した場合には、 なるべく安全にプログラムが停止するようチェックを行っています。 しかし、 プログラムがうまく動かない場合、 名前が表示されたファイルについて書き方に誤りがないかチェックしてみてください。
必要なファイルはここにある7つのファイルです。
エディタなどで書いていただきます。
このうち6つのファイルの名称は
eval.dat
ファイルの中で自由に設定できますし、
eval.dat
ファイルについても
schedeval
プログラムの起動時に与える引数で変更できます。
しかし、
とりあえずここにあるファイル名で説明します。
eval.dat
eval.dat
です。
ファイル名の設定に関しては、詳しくはこのファイルの中身を見て下さい。
このファイルを除いた残りの設定・出力ファイルの名称は、
すべてこのeval.dat
の中で変更することができます。
なお、駅での乗換の際に滞留する乗客の数を計算する機能については、 「駅乗換滞留乗客数を算出する駅番号」を負 (例えば -1) にすることでこの機能を殺して使用することができます。 その場合は、 この「駅番号」の次にあるファイル名も記述しないで (# 記号でコメントアウトするだけで大丈夫です) プログラムを走らせてください。
また、このファイルには評価に使用する重要なパラメータである 損失を金額換算する係数を記入する場所があります。
line.dat
まず最初に路線数を入力します。 ついで、 各路線ごとに 実効混雑度の出力ファイル名・ 駅数 および駅番号(最初がゼロで始まることに注意)を、 起点から順に記入していただきます。 駅数とその後に記述される駅番号の数があうように、 また、 駅番号は後で記述する駅データと整合するように作成してください。
このファイルは、 1路線しかない場合でも記述しなければなりません。 路線の方向と列車の走行方向の関係は自由に選べます。
diagram.dat
まず最初にダイヤの周期(秒)、 列車数を入力します。 次いで、 列車の数だけ以下のデータを書き込みます。
第 N 列車について、 「セル数」 (要するに start-to-stop の回数のこと) をまず入力します。 プログラムはこの「セル数」データに頼って ファイルを読んでいきます。 各セルについて、 発駅・発時間、着駅・着時間、定員、座席定員、編成両数、 路線番号を入力して行きます。
時刻や時間は、秒単位の整数だけでなく「分:秒」もしくは「時:分:秒」の 形式で記述できるようにしてあります。 秒単位整数の形式で記述することもできますが、 このやり方では記述しにくいと思います。 時刻・時間を (時:)分:秒 で記述する場合、 コロンの前後にスペースを入れないようにしてください。 1:300:4 など、どのような記述も大丈夫です。 負の値の記述はしない方が安全です。 小数点以下を記述した場合も、 動作を保証できません。
時間は実時間で入れても、 いわゆる損失時分で入れても結構です。 ただし、 実時間で入れる場合 「基準時間ファイル」はオールゼロで設定することになります。
駅は番号(最初がゼロで始まることに注意)で入力して下さい。 路線も同様に番号で入力していただきますが、 隣接停車駅間走行中にある路線から別な路線に移ることがある場合、 特殊な書き方をします。
例えば、
0 0:0 2 0:0 1000 360 8 0と書けば、 この列車は0駅を時刻 0:0 に出て2駅に時刻 0:0 に到着し、 この間列車の定員は1000名(座席360)、 8両編成で、 0線上を走行することを表します。 また、
0 0:0 6 0:0 1000 360 8 until 4 0 1と書けば、 この列車は0駅を時刻 0:0 に出て6駅に時刻 0:0 に到着し、 この間列車の定員は1000名(座席360)、 8両編成で、 途中4駅まで0線上、 その後6駅までは1線上を走行することを表します。 until は大文字でも記述できます。 また、 until 4 0 until 5 1 2 のように入れ子にもできます。
station.dat
駅名はローマ字、カタカナ、漢字の順に入力して下さい。 漢字・カタカナは半角を用いず、 漢字コードは EUC 漢字コードとして下さい。 漢字コードの設定方法は使用するエディタに依存しますが、 Mule を使う場合なら、ファイルの編集中に
M-x set-file-coding-systemとし、 ミニバッファにプロンプトが出たら *euc-japan*unix と答え、 その後でセーブすればそうなります。 ちなみに、 実際はこのファイルはグラフ書きなどの場面ではほとんど役に立っていません。 あえていえば、 最後の出力データファイルに漢字駅名が入るのがうれしいくらいです。 カタカナデータはどこでも使っていないと思います。 これは単に高木が面倒くさがったためです。 今後改良したいと思います。すみません。
trftime.dat
はじめにデータ数を入力します。 データ数はゼロでも大丈夫ですが、 この場合「データ数ゼロ」ときちんとファイルに記述して下さい。 なお、ここに指定しない乗換については、乗換時間をゼロとして計算します。
1つのデータは4つの整数からなります。例えば、
10 0 1 300は、第10駅で、0列車から1列車への乗換に、300秒かかることを表します。
このプログラムでは、複雑なパスでも可能なようにプログラムしたつもりでは ありますが、基準時間データファイルにおいては設定したすべての駅が少なく とも1本の線上にあるつもりで記述します(つまりこのあたりの思想が一貫し ていないということ)。
損失時間表示で評価する場合、各駅における実際の時刻は損失時間表示の時刻 にこのデータで与えられる時間を足したものになります。基準駅番号なるデー タがありますが、このデータは非負値を与えてある限り実質的にほとんど意味 を持たないはずです。
損失時間表示は、上り・下りの列車を同時評価する場合、あるいは複数路線が あるネットワークにおいて任意の2路線が2駅以上で交わっている場合などに問 題が生じる可能性があります。この場合はこのファイルを設定せず(最初の 「基準駅番号」を負値にする)、ダイヤデータファイルを実時間で与えればよ いことになります。パス検索は時間表示に依存しないはずです。
od1.dat, od2.dat
diagram.dat
ファイルで指定したダイヤ周期あたりの人数を指定します。
全体の需要は
od1.dat
と
od2.dat
の和であることに注意してください。
行列形式で入力していただきます。 当たり前ですが対角成分はゼロにしてください (データの数さえ合っていれば多分数値自体は無視しますから、 実害はないだろうとは思いますが)。 ゼロ成分も含め、正方形に記述して下さい。
整数でなくても記述できます。
schedeval
プログラムを走らせるschedeval
の名称は Schedule Evaluator の略のつもりです。
これを走らせれば、
ダイヤの評価ができる「はず」です。
データのあるディレクトリに降りてください。
$ cd /home/foo/dataそして、
$ ../schedeval eval.datとすることで、評価ができます。
評価出力は、
eval.dat
の冒頭で指定するファイル名のファイルに出力されます。
サンプルでは
output.dat
になっていると思いますので、適宜ご変更をお願いいたします。
eval.dat
の中身を変えたものをいくつか用意してある場合には、
起動時に
eval.dat
とある部分を別なファイル名に変更すればOKです。
ijsearch, jisearch
プログラムを走らせるschedeval
プログラムの一部分をなすパス検索部分だけを取り出したものです。
ijsearch
が前方検索、
jisearch
が後方検索用です。
データのあるディレクトリに降りて行き、
そこにおいて
schedeval
と同様に
$ ijsearchなどとすることで、走らせることができます。
基本的にデバッグ用プログラムだったので、 ファイル名などは手入力です。 パス検索がうまくいっているか、 あるいはデータファイルがうまく書けているか のチェックにお使いいただけるのではないかと思います。
データファイルを使っていろいろに動作させ、 念入りなチェックをしてみて下さい。
stntime.dat
に記述されます。
例えば、
付属のデータを用いて計算させますと、
2駅の出発時刻表は次のように記述されています:
0: 60( 0) [接続: 1(-420/-2)] 1: 120(-1) [接続: 0(-360/-1)] 2: 240( 0) [接続: 0(0/0), 1(-60/-1)]最初の 0: 〜 2: は、 出発する列車の番号です。
次の 60( 0) などという数字の左側(括弧外)は、 時刻を表します。 到着時刻表の場合は到着、 出発時刻表の場合は出発です。
60( 0) の括弧内の数字は 「周期遅れ倍数」 と呼んでいるものです。 列車の時間は発駅から着駅に向かって積算されてゆきますから、 各駅での発車時刻を周期内 (0〜周期値) におさめるためには周期を適切に選ばなければなりません。 しかし、 これをすれば、 列車番号が同じでも実態としての列車はいくつも存在することになってしまいます。 そこで、ダイヤデータにおいて列車の発駅での周期遅れを0とし、 それより発駅を1本前に出る同一種別列車なら -1、 2本前なら -2、……、 あるいは1本後なら1、2本後なら2、……、 といった倍数を持たせておきます。 つまり、 列車番号と周期遅れ倍数を指定することで、 列車を特定することができます。
[接続: ……] とブラケット内に記述されている値は接続列車の関係を表します。 出発時刻表においてはその列車に乗り継げる到着列車を、 到着時刻表においてはその列車から乗り継げる出発列車を、 それぞれ示します。 1(-420/-2) などと表現されていますが、 この場合括弧外の1が列車番号、 括弧内の斜線の左側が時刻、 右側が周期遅れ倍数です。
path.dat
に記述されます。
パスの選択過程において候補がいくつか出てきますが、
すべての候補が pathsrch.log
に書き出されています。
パスデータは前方パス、 後方パスで読み方が異なります。 前方パスにおいては例えば
0駅 0> 0レ> 0: 2駅 0/ 240> 2レ> 240: 3駅 乗換1回 0秒 待ち240秒/ 時隔120秒 (同一パス1列車)のように記述されます。 これは、頭から順に
「0駅・時刻0発・0列車、時刻0に2駅着、乗換所要時間0秒、時刻240発の2列車 に乗り継ぎ、時刻240、3駅到着」と読みます。 下には評価量関係のデータが記されます。
一方、後方パスにおいては例えば
1駅 -60> 1レ> 120/ 0: 4駅 240> 2レ> 240: 5駅 乗換1回 0秒 待ち120秒/ 時隔360秒 (同一パス1列車)のように記述されます。 これは、頭から順に
「1駅・時刻-60発・1列車、時刻120、乗換所要時間0秒、4駅で時刻240発の2 列車に乗り継ぎ、時刻240、5駅到着」と読みます。 つまり、 前方と後方とで「乗換所要時間」の記される位置が少々異なることになります。
なお、
pathsrch.log
というファイルに、
全パス探索の結果も含めて記述がなされます。
この場合、
全パス探索結果には時隔が表示されません。
これはパス相互間の時隔は当該ODペアについて最終的に選択されるパスが確定しないと、
時隔の計算もできないためです。
output.dat
に書き出されます。
output.dat
に書いてありますが、
列車混雑率グラフを作るためのデータファイルが
trconges.dat
および conges.dat
です。
gnuplot をグラフ書きに使う場合、プログラムが終了後
$ gnuplot ... gnuplot> load 'trconges.dat'とすると、 列車混雑率グラフが画面に現れるはずです。 路線ごとに1つずつ出力される実効混雑率グラフ
conges00.dat
, conges01.dat
なども同様です。
実効混雑率については、 各路線の当該区間を走行する列車ごとに計算しています。
同様に、
駅構内滞留乗換客数のグラフも stnconges.dat
ファイルで
同様にグラフ化できます。
この他にもまだ隠されたバグがあるかも知れません。