投稿者 トピック: tiny timetable patch / 簡易タイムテーブルパッチ  (参照数 107124 回)

wackdone

  • 準急
  • ***
  • 投稿: 126
全部盛りバイナリ (TTT-039ベース)
« 返信 #45 on: 2012/07/13 21:02 »
Windows用バイナリです。
http://ux.getuploader.com/wackdone_simutrans/download/14/simuwin-wackdone-120713.zip
今回の中身は EXE と ja.tab だけです。差し替えて使ってください。
試しに Windowsのzipで固めてみました。これであれば、ja.tabも問題ないと思われますが、いかがでしょうか?

ドキュメント類は、パッチファイルの方をご参照ください。
(DOS改行(CR+LF)の、UTF-8で書いた README_TTT_ja.txt が入っています。)

o_o

  • ゲスト
120713.zip バイナリ起動しました。ja.tabも問題ないようです :)

◆ 3点バグ報告です(すでに確認済でしたら、ご容赦下さい)
 ・交差点信号のバグ修整後、普通の信号機情報にも3つ入力窓が表示されてます
 ・新編成購入→新規路線→路線適用の状態で、空路線の時刻表を開くとクラッシュする
  これは 本家の設計 使い方の問題だと思うんですけど、車庫画面の新規路線
  ボタン押すとスケジュール編集が開くんですが、閉じても列車には適用されない
 ・スケジュール移動ツールを早送り中や変なタイミングで使うと、列車の経路探索が
  終了しないことがある、又は、反映してない(多分、本家のバグ)
  スケジュール移動ツールとTTTって相性悪いと思うんですけど、大丈夫ですか^^;
« 最終編集: 2012/07/13 23:04 by o_o »

wackdone

  • 準急
  • ***
  • 投稿: 126
早速の動作確認とバグ出し、ありがとうございます。

・信号機での3つ窓、現象を確認しました。すぐに致命傷にはならないと思われますので落ち着いて整理させてください。
・新規路線の件、「内容が空で、*かつ*、列車に適用されている」路線を時刻表表示させようとするとクラッシュ、ということでいいですか?
・(その項目後半の「車庫で路線を作って、閉じても車両に適用されない」というのは上の件とは別の事と考えていいですか?)
   (「路線を適用」ボタンの操作の有無は?)

・スケジュール移動の動作については慎重にチェックさせてください。
  TTTが悪いのかRRCが悪いのかもまだ見当がついていません。(はたまた本家か)
« 最終編集: 2012/07/13 23:16 by wackdone »

gonyo

  • 各駅停車
  • *
  • 投稿: 16
とりあえず動作確認 日本語で導入成功しました。 いろいろ難しい点あるので 使用例とか紹介してもらえるとありがたいです。
私があげたセーブデータは車両や建物などのアドオン一切追加してないのでみなさんも 読み込めるかと思うのでよければ検証用として使ってください。

wackdone

  • 準急
  • ***
  • 投稿: 126
gonyoさん、ここまでいろいろお手数をおかけしました。
今のドキュメントはとくかく情報を全部詰めこんだだけで、読む気にもならない人も多いでしょうから、
導入部分だけでもなにかガイダンス的ページが欲しいですね。

...gonyoさん、書きません? とか無茶ぶりしつつ。。。
正直、私より説明の上手い人、書いてくださーいと叫びたいところですが、
実装が落ち着いたところで自分のプレイ日記がてら考えてみます。
日本語Wikiに書いてもいいのかな?

o_o

  • ゲスト
早々の反応ありがとうございます。
自分せっかちで、たまにおかしな事書いて、数分後に改竄するので、お気をつけ下さい :'(

>新規路線の件、「内容が空で、*かつ*、列車に適用されている」路線を時刻表表示させようとするとクラッシュ、ということでいいですか?
 空路線で所属編成がないまま時刻表を開いてもクラッシュすることはありません。
 所属編成がある空路線を選んで時刻表を開くとクラッシュします。(時刻表側で路線を追加する場合も落ちる)

 運行経路がないのに距離を測定する処理が挟まれているか、停車駅がないのに駅ソートをかけようとするかの
 どちらかだと思われます。とすると、同様のクラッシュは、線路がつながっていなかった場合にも生じる可能性が
 ありそうです

>・スケジュール移動の動作については慎重にチェックさせてください。
>TTTが悪いのかRRCが悪いのかもまだ見当がついていません。(はたまた本家か)
 スケジュール移動の動作については、111.3本家のバグで、その暫定措置として反映させないような
 造りにしてあるのではないでしょうか。
 反映されない方は、かなり頻度が高いので、こちらの環境に問題があるのでなければ、
 同様の問題が生じている方を見つけたほうが、切り分けは速いかもしれません。

こちらは、バグ出しに協力しているというより、わがままを言って混乱させているだけですので、
こちらのペースにはまらないように、警戒心を持って接して下さいませ  8)
« 最終編集: 2012/07/13 23:50 by o_o »

wackdone

  • 準急
  • ***
  • 投稿: 126
いえいえ私もせっかちなもので、以下同文です:-)

所属列車ありの空路線の件、手元ではとりあえず対処できました。
ちょいと技術的なことを書くと(というか最終的には恥をさらすだけなのですが)
o_oさんの想像された場所へ達するはるか前、1駅目を見にいってコケてました。
出てくるメッセージを見ればわかるように、配列のサイズ以上の添字でのアクセスです。
通常は以下のような慣用句をあたり前のように皆使うので、こんなことが起こるなど想像つかないのですが (以下、C言語)
     for (i = 0;  i <  size_of_array;  i++) { ...}
今回落ちたところだけは「始発駅から始まって始発駅で終るリスト」(一周して、最初の項目だけ重複して参照する)という
操作をしたいがために、
     for (i = 0; i <= size_of_array; i++) { ....   配列には i % size_of_array で触る (当然、値はキャッシュする)  }
なんて書いてしまったものだから、あら大変、本当に恥ずかしいバグです。

閑話休題。
この、「表示しても意味がない」列車、路線、どう弾くべきでしょうか?
(時刻表表示はスケジュール上の停車点の変更や追加はできないので、空を相手にしても本当に意味がない)
  (1) 何もない (列車がリストに追加されもしない)
  (2) 列車リストには列車はいるけど時刻表は空っぽ
  (3) ちゃんとエラーを言う
私は 0 も自然数であると考えてしまう種類の人間なので、(1) や (2) でも気にならないのですが、
やはり不親切ですかね?
« 最終編集: 2012/07/14 00:04 by wackdone »

wackdone

  • 準急
  • ***
  • 投稿: 126
全部盛りやたまにTTTのみなど単機能に絞ってバイナリを作成し試験公開しておりま すが、
現在は、r5788 をベースに各パッチをあててバイナリにしています。
リリースである 111.3 は r5772 であり、それほどリビジョンの開きはありません。
一方で、現在Nightlyビルドされているheadは、r5821に達っしています。

これらのバージョンの並びのうち (どれも開発版ではありますが) 一般的に評価していただくのに
より適しているのはどれでしょうか。
どなたか「どっちにした方がいいよ」という情報をお持ちの方がいらっしゃいましたらご教授いただけますと助かります。
「自分のPCだと、rxxxxは普通のNightlyビルドのバイナリでもよく落ちたから避けて欲しい」なんていうローカルな情報でもかまいません。

なおパッチからビルドする場合は、r5821でも問題ないことは確認しています。
(2点rejectされますが、この二つはいずれも私が本家にバグ報告し修正してもらったものですので、rejectは無視して結構です)
手元ではr5821ベースのものも(NetBSD上と MacOSX上ではありますが)だいたい動作しています。

本スレの方でも何名かの方がバイナリで問題が発生した旨、書き込みされていましたので、
大変気になっております。

ご情報やアドバイスをお待ちしております。

o_o

  • ゲスト
>正直、私より説明の上手い人、書いてくださーいと叫びたいところ

勘違いがあれば指摘してもらいたいので、お言葉に甘えて、説明のヘタな人が書いてみます ;D

◆運行周期、車両間隔、始点出発時刻3つはオフセット型(周期に乗っかって始発駅を発車)
 運行周期は、時間(TT)が この周期の倍数になったときにしか発車できない設定
 車両間隔+始発出発時刻は、オマケ。周期を車両間隔+始発出発時刻の分だけ過ぎたら発車する
 (↑見当違い、後に誤りを指摘される)

 車両間隔*n+始点出発時刻は、設定箇所は違いますが、それぞれ個別の編成に適用されるものです
 自動オフセットは、車両間隔を見直しなさいという機能です(次の始発駅で適用)
 (↑見当違い、これも後に誤りを指摘される)

◆駅間計画は、早く到着しすぎたら、のんびりしてくださいというもので、オフセット型ではありません。
 明らかに無理な計画を立てた場合には、何も設定していないのと同じように走ります。
 しかし、駅間計画が守られている限りは、周期に乗っかった発車をします。

 遅延リセットは、周期から外れてきたから、0からやり直しなさいという機能です(その場で適用)
« 最終編集: 2012/07/15 00:11 by o_o »

wackdone

  • 準急
  • ***
  • 投稿: 126
整理ありがとうございます。
私の説明が上手くないせいですが、正確では無い部分がありますので一端、容赦なくつっこみ訂正入れさせて頂きます。
(私が何かを書くとすぐに枝が広がるので、枝おろしをお願いすることになってしまうかも)
全体的に用語の再整理、再選択 (より感覚的に理解しやすいもの)が必要な感じですが、
なるべく今使っている言葉を使うようにしつつ。
なお、「自動設定」というのは「自動等間隔設定」と呼び直した方がいいかもしれません。


引用
◆運行周期、車両間隔、始点出発時刻3つはオフセット型(周期に乗っかって始発駅を発車)
大分類で「オフセット型」というのはOkです。「絶対時間基準型」とも言えるかも。
ですが、パラメータの小分類をするなら、

  運行周期と始点出発時刻:  前者が路線、後者が車両に設定され、先々の運行までずっと使われるもの

  車両間隔とずらし分: 出発時間の自動設定時に一時的に使われるもの (一度自動設定したらあとはいらない)

というように使われかたが違います。

引用
 運行周期は、時間(TT)が この周期の倍数になったときにしか発車できない設定
 車両間隔+始発出発時刻は、オマケ。周期を車両間隔+始発出発時刻の分だけ過ぎたら発車する
上の記述は正確ではありません。おそらく二種類の「ずらし時間」が出てくるのが紛らわしいのかと。
(英語では、始点発時刻を "オフセット(offset)"、自動設定の時のずらし時間を"シフト(shift)" と呼んでいます。)

時間の関係について、誤解のないよう式風で書いてしまえば、
いつもの運行: 路線に運行周期 C、列車個々に始点発時刻 O が設定されていて、それぞれの列車が始点を出発するのは
   ゲーム時間が、 Cの倍数 + O
になった時です。
このように始点発時刻はけしてオマケではなく、運行周期と同じくらい重要です。
これが無いと路線に所属する全ての列車が同じ時刻に同じ場所(始点)を出発しようとします。
つまり定常運行時に列車の運行に間隔を開けさせる役割を担っているのが、この始点発時刻 Oです。

そして自動設定というのは、列車ごとに異なるOを設定する(のを自動でやってくれる)機能です。

自動設定中: 自動設定をしてくれる小人さんがSimutransの中にいて、彼は運行間隔 P と、ずらし分(シフト) S を覚えています。
列車が始点に到着すると、小人さんは現在から最も近い時間
  Cの倍数 + S + P×N
を決めます。この中のNが列車ごとに異なる値になります。(簡単に言えば、到着する列車ごとに1ずつ増えていく)
つまりこの列車は路線の中のN番目の列車ということです。
小人さんは、この列車が1周期後(運行周期時間C後)も同じ時間に発車してもらうよう、
列車の始点発時刻 Oを次のように上書き設定します。
  O =  S + P × N
このように列車にOが設定されれば、最初の式の通りいつも Cの倍数+O に始点を発車するようになります。

引用
 車両間隔*n+始点出発時刻は、設定箇所は違いますが、それぞれ個別の編成に適用されるものです
上の説明の通り、ここに書くべきは始点発時刻ではなくシフトです。
つまり、間隔、ずらし分(シフト)、どちらも「運行アシスタント」の中で設定する値です。

引用
 自動オフセットは、車両間隔を見直しなさいという機能です(次の始発駅で適用)
これはその通りです。より正確に言えば、「車両間隔を見直した結果を、各列車は新しい
始点発時刻として記憶しなおしなさい」という機能です。


応用1:  等間隔でない車両間隔 (手動で設定する)
  始点発時刻を各列車に手動で設定すれば (時刻表の始点駅の行で設定可能)
同じ路線に所属していても例えば:
    0     10  15   25     45
というように間隔のばらつきのある運行にできます。
じゃあこれ何に使うの? といえば、
この開いている部分に、本数の少い優等や別方面行きを挟むのです。
駅の時刻表板で見ると
    0  7  10   15   18 25  37  45
みたいな感じに。


応用2: 行き先や種別の異なる路線同士を組み合わせてパターンダイヤを組む
一つの路線の中の列車は等間隔で良いのであれば、これは自動設定でできます。
全ての路線で運行周期と、自動設定のための間隔を揃えておいて、シフトだけを
路線ごとに異なる値を使用します。
例えば全ての路線で周期400、列車本数は4本ずつで間隔は100として、始点駅からの個々の列車の発車時刻が
  路線A   0   100   200   300
  路線B  30   130  230   330
  路線C  75   175  275   375
のようになって欲しいのであれば、
  A のシフトを 0 にして自動設定
  B のシフトを 30にして自動設定
  C のシフトを 75にして自動設定
この3つの設定をまとめてやれば、最終的にこれに落着きます。
(一時的に駅が詰まるなどして乱れ、自動設定を何度も指示する必要があるかもしれませんが。)


続きへの返答は次の投稿に書きます。

« 最終編集: 2012/07/14 05:39 by wackdone »

wackdone

  • 準急
  • ***
  • 投稿: 126
続きです。こちらはおおむねその通りです。

引用
◆駅間計画は、早く到着しすぎたら、のんびりしてくださいというもので、オフセット型ではありません。
 明らかに無理な計画を立てた場合には、何も設定していないのと同じように走ります。
 しかし、駅間計画が守られている限りは、周期に乗っかった発車をします。

 遅延リセットは、周期から外れてきたから、0からやり直しなさいという機能です(その場で適用)

ちなみにこの運行を行う場合は、TTTの中の「運行周期」というパラメータは設定する必要がありません。
全ての駅間の時間を合計した値が暗黙の周期になります。

また、TTTのミソは (o_oさんの文章の中でも暗黙の前提となってますが)

    列車はこれまでの遅れを覚えておく

ということです。
前駅から今駅の移動は計画よりも早かったとしても、それより前に遅れたまま運行していたら、
遅れを解消するよう早めに出発します。
過去の遅れを取り返すまでは、のんびりなんかさせません。


この「以前の遅延の回復」を体感するには以下のような方法もいいでしょう。
まず、だいたい計画時間通りに走行できている路線を作っておいて、
時刻表に表示させます。(表示オプションで、実績時間もオンにしてください。)

【あとで画像を貼ります】

どの駅でも実績時刻が、計画時刻から大幅にずれていなければ、時刻表的にうまくいってる路線です。

さてここで、とある中間駅 A駅の予定時刻だけ無茶に早めてみてください。(値を入れて時刻表を改定)
しばらく走らせると、次の一周での実績時刻が記録されますから、更新ボタンを押して最新の記録を見てみましょう。
A駅を出発した実績時刻が、無茶ぶり設定した予定時刻より遅れていると思います。
では次のB駅ではどうかというと、B駅の時刻は変えていないので、A駅では遅れてもB駅で取り返せているはずです。
駅間の走行時間に違いはないはずなので、これはB駅の停車時間を短くして遅れを取り戻したということになります。
B駅の停車時間が足りなかった場合は、その先のC駅で……というように回復運転は積算遅延が0になるまで続きます。

でも、途中の想定外の列車割込みや踏切閉鎖、スケジュール設定ミスなどで無理が溜まってきたら……
もう回復は無理!  遅延時間が10000とかなってたら現実世界で言えば、翌日までかけて回復するかの状態です。
他の列車にも影響を与えたりこの先いいことないのでしょうがない、
  「遅延リセット」=ダイヤの回復をあきらめる となります。



。。。やっぱり図が必要ですね。後で画像を貼ってみます。

(o_oさんはすでに充分理解されていると思いますが、今後の広い説明のための元ネタとしてくどく書いてみました。あしからず)
« 最終編集: 2012/07/14 06:06 by wackdone »

o_o

  • ゲスト
んーと、長くて読み込めてないですが、、運行周期がちょっと違ってて、

 運行周期は、時間(TT)が この周期の倍数になったときにしか発車できない設定
 始発出発時刻は、車両間隔とずらし分によって決まり、周期を始発出発時刻の分だけ過ぎたら発車します。

 始発出発時刻(O)は、車両間隔(P) × 到着順(N)+ずらし分(S)
 (周期=(仮想の)1日、車両間隔*n=1時間、ずらし分=分とイメージするとわかりやすい)

 自動等間隔設定は、始発出発時刻を見直しなさいという機能です(次の始発駅で適用)

...で、どうでしょうか?

>始点発時刻を各列車に手動で設定すれば (時刻表の始点駅の行で設定可能)
 これ隠し機能です、、知らなかった。

◆ 10%許容法は、周期落ちさせないかわりに、行列発車させてしまうという事ですか?
  これって、放置すると行列が成長してデットロックかかる可能性が高くなるような。。
  やるのならば、±5%を交互にかけておいたほうが良くないです?
« 最終編集: 2012/07/14 09:02 by o_o »

wackdone

  • 準急
  • ***
  • 投稿: 126
長くてごめんなさい、いつも盛り込みすぎなんだよな私 orz

o_oさんの再整理でOkですが、自動等間隔設定の方が実はオプションなことを考えると、どうするべきか。。。
ちなみに"TT"は、単位なので、ゲーム内世界時間はWとかにしませんか?
引用
 運行周期(C)は、時間(W)が この周期の倍数になったときにしか発車できない設定
 始発出発時刻(O)は、車両間隔とずらし分によって決まり、周期を始発出発時刻の分だけ過ぎたら発車します。

 始発出発時刻(O)は、車両間隔(P) × 到着順(N)+ずらし分(S)
 (周期=(仮想の)1日、車両間隔*n=1時間、ずらし分=分とイメージするとわかりやすい)

 自動等間隔設定は、始発出発時刻を見直しなさいという機能です(次の始発駅で適用)

以下はオマケの話。
引用
>始点発時刻を各列車に手動で設定すれば (時刻表の始点駅の行で設定可能)
 これ隠し機能です、、知らなかった。
なんと、開発の進展とともに事態が逆転してしまったことに私はびっくりしております^^;
各列車の始点発時刻は列車ごとのスケジュール編集の画面でも設定できます。
もともとは、運行周期と始点発時刻を手動で設定することしかできませんでした。
自動間隔設定(車両間隔、ずらし分による)が後づけオマケ機能というか、オプション機能です。

開発の順序:
  (1) TTTの誕生: 駅間の計画時間を指定できるようにした
                    → 1つの列車の運行時間が安定になる
  (2) TTTの成長: 運行周期Cと始点発時刻Oを指定できるようにした
                    → 列車同士の発車時間差を固定できる (優等退避なんかも組めるようになった)
  (3) もっと便利に:  オプションで(使っても使わなくてもいい) 自動等間隔設定をできるようになった
                    → 大量の列車のある路線の設定が楽になる

この順番に沿った設定をしていった方が理解しやすいかも。
ただ(2)のところで各列車にOを設定してまわるのが疲れそうですが。

(10%の話は次に)
« 最終編集: 2012/07/14 19:33 by wackdone »

wackdone

  • 準急
  • ***
  • 投稿: 126
10%許容法についてです。(あくまで実験中機能)
また長くなります。(下手に丁寧にしようとして言葉が多すぎるのかな?)

列車は始点に到着した時、到着時刻Aと、運行周期Cと始点発時刻Oから
「自分の次の始発時刻はDだ」という判断をして、時刻Dまで駅で待機しますが
10%許容法は、このDの求め方を少し修正します。

まず、許容がいくつであろうと、前に定義した式
    D = Cの倍数 + O
であることは違いありません。
違いは、この中で Cを何倍するかです。

元の方法 (0%許容):
    D  >  A
この条件に合う最小の Cの倍数を選びます。必ず出発予定時刻は到着時刻より後になります。

10%許容法:
    D  >  A - (C x 0.1)
この条件に合う最小のCの倍数を選ぶのですが、右辺の値が小さくなっているので
選択されるCの倍数がひとまわり小さくなる(1周期前になる)可能性が生まれます。
これによって、一定範囲内(Cの10%未満)で到着している場合の段落ちを防げます。

具体例を以下に示します。
路線の C を2400とし、列車のOは800とします。
言葉を簡単にするため、Cを仮想1日とし、列車は 8時の列車ということにします。
運行開始から 4日目、ゲームの絶対世界時刻 W は9600 を過ぎています。
この日の列車の出発予定時刻は
  D = 2400 x 4 + 800 = 10400
です。
列車が出発予定時刻より前に駅に到着した場合は、予定通り 10400 に出発します。

列車が遅れて 10450 に駅に到着したとしましょう。
元 (0%許容)だと:
    D = 2400 x 5 + 800 = 12800  >  W
つまり「この日は運休」してしまいます。(当然、後続の列車はつまります。)
10%許容だと:
    D = 2400 x 4 + 800 = 10400  >   W - Cx0.1 = 10450 - 2400 x 0.1 = 10210
このように遅れてはいても、この日の8時に出発するもりでしたので直ちに出発します。
(この時、積載時間なども加わり実際の出発時刻が 10750 になったとすると、
  実績出発 10750 - 予定出発 10400 = 350 が、現在のこの列車の遅延時間として記憶されます。
 これは先の運行で取り返そうとします。)

このように、ちょっとの遅れのせいで、まるまる1周期飛ばされてしまうのを防ぎます。
(大幅な遅れは無理ですが。)
大雑把に 50% 許容までは意味を持つと思われますが、いろいろ問題もありそうなので、今は 10%で試しています。


引用
◆ 10%許容法は、周期落ちさせないかわりに、行列発車させてしまうという事ですか?
「行列発車」という意味がとりきれていませんが、「予定出発時間を無視して」という意味で言っているのなら、
正確にはそうではありません。たしかにすぐに出発はしますが、予定時刻 D を求めて参考にします。
実績出発時刻 - 予定出発時刻  が遅れとして記憶されていますので、
先の運行でこれが 0 になるよう (元のダイヤに戻るよう) 調整されていきます。
(これは、駅間指定だけの運行と一緒)

違う意味でおっしゃっていたら、ご指摘ください。

引用
  これって、放置すると行列が成長してデットロックかかる可能性が高くなるような。。
ダイヤ全体を見て無理が無いのなら、(どこか無理な区間があっても、他で余裕があるなら)
(ある程度長く見て) 行列が成長していくということは無いはずです。
行列が成長してしまうようなら、根本的にダイヤが無理なはず。
これは10%許容法の有無に関係ありません。

また、この調整法単体は列車間の関係などを見たり影響を与えたりするアルゴリズムじゃないので、
理論的にデッドロックを生むような性質のものではありません。
(単調増加する「ゲーム内の絶対時間」しか使っていないので、「ロック」が無いのです。)

起こるとすると、「デッドロック」というよりは「ポジティヴフィードバック」ですかね?
しかしこれも10%許容法の有無には関係ないはずです。
なぜなら、列車全てについて D の判断に使う世界時刻の目盛が、一様に (C*0.1) だけ前にずれるわけで、
この中に他の状態変数が入っていないので「フィードバック」はかかり得ないからです。
(Cは係数ですので運行状態によって変化はしない。)
また、実際の列車の運行可能周期よりCが極端に短いと、「駅に到着する度に遅延していると判断してしまう」ように見えますが、
  調整分が C に対する割合いで決まっていること
  出発時刻 D が C の整数倍 (+ O) から算出されること
の二点により、やはりフィードバックにはなりません。

証明(?)に間違いがあったらご指摘ください。

(なんとなく、o_oさんの言っている「何かしら詰まりが増長する問題」がどこかにありそうな気がすんだよなあ。。。)

« 最終編集: 2012/07/24 01:57 by wackdone »

kanedai

  • 各駅停車
  • *
  • 投稿: 22
無知ですまん。
なぜ時間通り発車できるのに20も延発がおこるのかがわからないんだが。