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

wackdone

  • 準急
  • ***
  • 投稿: 126
o_o さん、せっかく御乗船(?)いただいたのに、待ちに入らせてしまいすみませんでした。
また、いろいろなチェックをしてくださりありがとうございます。

ご助言どおり、古いバージョン (安定しなくなってきたあたり) は削除しますね。

時刻表を入れたあたりから、機能拡張の勢いが止まらなくなって、コードの構造に無理が来ておりました。
ソースファイル数と行数は増えてしまったのですが、構造がすっきりはしてきたので問題があっても
対処しやすいようになっています。
またお時間が出来ましたら、お付き合いいただければと思います。

エラーダイアログが出た時に手写しでここに書くのも面倒だと思いますので、
出たログのスクリーンショットを撮影できる機能を作成中です。
ダイアログ画面だけのショットにできれば、こちらにすぐに貼っていただけるかと。
MIPに入れて全部盛りに組み込む予定ですが、完成までいましばらくお待ちください。

yoyo

  • 各駅停車
  • *
  • 投稿: 4
wackdoneさん、こんにちは。
ttt-041で少し遊んでみて気になった事を書いておきます。

当方環境 : VC++2010ee / Win32 Debug / パッチを当ててエラーを潰してコンパイル / pak64 - アドオン無し

[ 重要なもの ]
<1>
 アシスタントでナンバリングした後で一旦セーブしました。
 その後、起動してセーブファイルを読み込んだ後、ttt-040では時刻表を表示した瞬間に、ttt-041では
 時刻表のセルをクリックした後にisdigit()でVCのassertionが失敗しました。
 デバッグしてみると
 int tt_linemanage_assistant_t::compose_convoy_name(uint32 index, char *dest, size_t maxlen)関数の
 中でlabel_numberingに入っている文字列(数字)に終端NULLが無い場合がありました。
 その時の中身は"001ヘヘヘヘヘ" = 0x30 0x30 0x31 0xcd 0xcd 0xcd 0xcd 0xcdになっています。
 ソースを追うとatoiに渡していますのでここでバッファオーバーランが発生する可能性が極めて高いです。
 ちなみに0xcdはVCがデバッグ時にまだ一度も書き込みが行われていない領域を識別しやすいように埋める値です。

<2>
 時刻表のヘッダ部分の表示がおかしくなる。
 時刻表に表示されている路線を消しても(削除ではなくHIDE)行見出しが残る
 ナンバリングしたあと編成を追加したからかも?

<3>
 std::isdigit()などで定義が無いというエラーが出る。#include <cctype>抜け?


[ 今のところ重要では無いもの(将来コミットする時に問題になると思われるところ) ]
<4>
 SCHEDULE_TIMETABLE
 SCHEDULE_TIMETABLE_TTV
 SCHEDULE_TIMETABLE_TIMINGBAR
 SCHEDULE_TIMETABLE_CONVOITIP
 全て指定しないでコンパイルするとエラーが大量に出る。
 過渡期だから#ifdefが不完全?

<5>
 gui_gridlayout.h

 class rational {
 ...
  static const double REAL_TO_RATIONAL_DENOM = 1000.0;
 ...
 クラス定義内でint以外の値を初期化できるのは確かC++11からだった気がします。
 最新のコンパイラでないとダメというのはキツイと思います。

<6>
 fahrplan_gui.ccでVCにsnprintf()は無いというエラー。_snprintf_sならあります。

<7>
 timetable_model.h : warning C4355: 'this' : ベース メンバー初期化子リストで使用されました。
 という警告が大量に出る。
 これは、
 struct A; // 前方宣言
 struct B { B( A* ); };
 struct A
 {
  B b;
  A();
 };
 B::B( A* ) {}
 A::A() : b( this ) {}

 クラスBにAのthisを渡しても、まだAのオブジェクトは構築されてないので、
 BのコンストラクタでAのポインタを使ったら危険です。という意味だと思われます。
 gccだと警告出ませんね。
 Bのコンストラクタでポインタだけ保管して、後で使うなら問題ないのかも知れませんが。

<8>
 simconvoi.ccのvoid convoi_t::_get_timing_stats(struct timing_stats *ts)で
 timing_statsの定義はclassなのにstructキーワードが使われている。というwarningが出る。

<9>
 OVERRIDEがついているメンバ関数で「基本クラスの関数をオーバーライドしませんでした」と言うエラーが出る。
 これはVCだと仮想メンバ関数にのみ使えるようです。つまり基本クラスの同じメンバ関数にvirtualが付いていないといけない。
 付けない方がいいかも。

以上です。

セーブデータと資料っぽいものを添付しておきます。

頑張ってください(^o^)ノ

wackdone

  • 準急
  • ***
  • 投稿: 126
最初に皆様へ:  自動名前付けは一時的にコードが崩壊していますので、今は使わないでください!! 現在準備中のTTT-042で安定します

yoyoさん、詳細なご報告ありがとうございます。
環境や手間的な面で自分で試せていないところを試して頂くのは助かります。
特にVC++でのビルド結果はありがたいです。
とり急ぎ、簡単にリプライを。
(一部勘違いしていたいので訂正しました : 23:49)

[ 重要なもの ]
<1> アシスタントでの自動ナンバリング
simutransのsimstring.hの中にある関数を無理に使うようにした ら、崩壊しだしました。落ち着いてなおします。

<2> 時刻表ヘッダ部分の表示の乱れ
>> 時刻表に表示されている路線を消しても(削除ではなくHIDE)行見出しが残る
念のためCol/Rowの一般的な使い分けでいくと、「行見出し」(駅名)ではなく「列見出し」(列車略称) でいいですか?
Hideは列単位の表示を丸ごと切り替えているだけなので、gui_spreadsheet_tのバグの可能性もあります。現象再現させてみます。

<3> include <cctype>の抜け
リファクタリングの時にファイル分割して失われたのに、他のヘッダから ctype.hがincludeされているのに甘えていましたね。
ところでsimutrans的には ctype.hにしておいて std::つけずに isdigit()の方がいいのでしょうか? ちょっと他のソース見てみます。
# プリプロだった頃は遊べたものだけど今時のC++にはついていけてません、悪いとこあったらがんがん指摘してください。

[ 今のところ重要では無いもの(将来コミットする時に問題になると思われるところ) ]
<4> ifdefでの囲い不足
本家に持っていく時は
  minimum patch:  SCHEDULE_TIMETABLE 以外は全てoff (gui_komponenteの追加も一切なくて済む)
  utilized version:  TTV, TIMINGBAR, CONVOITIP 全部あり (コード量は大きいが便利になる)
の二つのレベルで提案しようと考えています。(minimum patch だけでも採用されれば、セーブデータの互換性問題が解決するので価値あり)
ですので、マクロによる振り分けの整理はこれに合わせる形で少しお待ちください。

<5> クラス定義内での static const (定数クラスメンバー)の値定義
ごめんなさい不精してるだけです。VC++だとだめということであれば、とりあえずdoubleのものだけでも.cc側へ移動します。

<6> snprintfの欠如
あれ? Simutransの他のコードでもsnprintf使っているところあったような 気がしていたのですが。
と思って調べたら、どこも sprintfだけでした。sprintfなら VC++ にもありますよね? (たしかANSIなので)
バッファサイズが充分に確保できておりかつフォーマットが固定なので、sprintf()を使うようにします。

<7> インスタンス初期化完了前のメンバーインスタンスへthisを渡す
今はたしかに「渡された側はポインタを保存するだけ」ですので問題は無いはずです。
ううむ、C++で無理やりinnerclass (例えばJavaのようなもの) を実現しようとしたのですが、
これ封じるとコードが見辛くて仕方なくなるんですよね。
outer class 側にも何かテンプレートでラップ入れてやってthisを胡麻化せれば、警告は消せるのかな?
(gccのようなRTL解析だとすぐにバレそうな気がしますが。VC++の中ってどういう解析やっているのだろう?)
何かinnerclassのスマートな実現方法があったらご教授お願いいたします。
なお、一部は正しい innerclass ではなく、ただの "contains" by link ですので、落ち着いたら潰せる範囲は潰してしまおうと思います。

追記: どうやら gccの RTL は、thisの先に触っていないというところまで解析しているということが判明。
  コード読み不十分ですが、gccの方が一枚上手なようです。

<8> classなのにstructで指示
最初structだった名残りですね。消します。

<9> non-virtual に対する OVERRIDE
開発途中で virtualにするかどうかの迷いが出ているのの表れですね。
どこかでまとめて潰します。ミスはしていない(ただ勘違いしやすいかも)ので、当座の問題は無いと思われます。

いただいた資料の方はこれから読ませて頂きます。
ご指摘ありがとうございました。今後とも宜しくお願いいたします。
# gcc で -wall -werror やってみようかな。オリジナルも含めて warning潰しで一週間くらいかかってしまうかも。

« 最終編集: 2012/07/18 02:05 by wackdone »

wackdone

  • 準急
  • ***
  • 投稿: 126
TTT-042
« 返信 #78 on: 2012/07/18 02:05 »
TTT-042 をアップします。バイナリ(全部盛り)↓です。
  http://ux.getuploader.com/wackdone_simutrans/download/20/simuwin-wackdone-120718.zip

バイナリを落とされる方にお願い
  今回から ja.tab も「バイナリファイルである」とzipファイルの中にマークさせています。
  これで、Windows上の展開でトラブルは無くなったんじゃないかと考えています。
  zipに同梱の ja.tab (TTTの分の追加込み) を使って、表示の日本語化が上手くいったかどうか報告してくださると助かります。
  (詳細はなくても「上手くいってない」という情報だけでも助かるのです。簡単に一言だけでもいいので、どうかお願いします!)

変更の概要
主にyoyoさんから頂いた問題修正と、時刻表の若干の機能追加です。
  - MS VC++ でのビルドでの問題が減っているはずです。(残問題についてご報告いただければ幸いです)
  - 管理アシスタント: 編成の自動名前付けのコードが整いました。手元では上手くいってます。過去の問題のせいでセーブデータが壊れていると辛いかも。
  - 時刻表ウィンドウ: 時刻表更新時の車両の位置を緑の枠で囲って示します (駅間走行中は区間行に、停車中は駅行に)
  - 時刻表ウィンドウ:"Auto Refresh" (自動更新) チェックを入れることで、一定間隔で表の内容を自動更新します。

自動更新の間隔は現在は内部で 256ms (1TTT) に固定です。
重すぎるようだったらコメントください。調整できるようにするか、1024msくらいまで広げるつもりです。
また、これまで同様に路線に新たに編成が追加された場合などには追従できていません。
また編成が路線から抜けた場合や、削除された場合はある程度検出しますが、びっくりするような表示になる場合もあり得ます。
このような操作をする場合は、時刻表を一度閉じて、作業後に再び開くことをお勧めします。

日本人的には縁起の悪いバージョン番号が続きますが、この値の範囲を抜ける頃には安定していることを願いましょう :)
« 最終編集: 2012/07/18 03:59 by wackdone »

wackdone

  • 準急
  • ***
  • 投稿: 126
TTT残課題と機能仕様の再検討
« 返信 #79 on: 2012/07/18 04:38 »
機能的には当初の目的は果たせてきた(ダイヤグラム表示はやめときます)ので、現状を整理します。
当面はバグ修正メインでいきたいと思います。

安定性の向上:
  - バグ出しと修正
  - コンパイル環境依存の問題の解決
  - コード細部の安全化、assertやチェック&fatal の挿入

利用利便性:
  - 各所の色使いは見づらくないか? (特に時刻表表示での実績時間列)
  - スケジュール編集部分と時刻表表示の両方から値を設定できることに混乱はないか?
  - ツールチップも含めた日本語化、ヘルプの導入

機能仕様の修正検討:
  - 「路線編集」ウィンドウでの右側中段をどうするか? (時刻表を開かなくても使いたい機能は何か?)
  - 中継点、および計画時間設定無しの扱い (後述)
  - 駅までの運行時間と駅の停車時間を分離して扱うようにするか? (今は合算)
  - 始点発時刻のチェック点を変更できるようにするか? (最初の駅以外のポイントに)


時間制御の仕様の変更と追加の案
TTTの時間制御の根幹仕様についてですが、現状は以下のようになっています。
  中継点:  計画時間が設定できてしまうが、この値は完全に無視される
  計画時間設定の無い駅: この駅で延発制御など一切行わないが、前駅発車時刻は更新される

これがそれぞれどういう問題を起こし得るかというと:
  中継点の計画時間の完全無視:
    - 値を入れてしまって勘違いする。
    - 駅だったところが駅じゃなくなる(ホームを破壊)と、運行の合計計画時間が変わってくる
  計画時間設定の無い駅があると:
    - 積載が終るとそのまま出発するが、もし次の駅に計画時間が設定されている場合、この時間はこの区間だけを縛ることになる
     (問題というよりは、今はそういう仕様。使い方次第で便・不便がある)

中継点の取り扱い案:
中継点は時間を入れられるようにしたまま、運行でもこの時間を見るようにするべきでしょうね。
   - 中継点を通過する時に、実績区間時間をチェックする
   - 前駅(あるいは中継点)出発時間と現在時間を見て、早着・遅刻があれば積算遅延時間に繰り込む。
   - 前駅出発時間を現在時間に更新する
これで、次の停車駅でこの中継点の区間も含めて早着・遅延制御がされるようになります。

ただし時刻表での表示が五月蝿くなりそうです。どうしたものか。。。
また始点駅が中継点だった場合の取り扱いについては、まだ考えがまとめられていません。

計画時間設定の無い駅の扱い: もう一つの可能性:
計画時間設定の無い駅では、前駅出発時刻の更新も行わなくさせるという手が考えられます。
こうするとどうなるか:
  計画時間の設定のある駅の間で、運行時間の評価が行われる。
  その間の駅は、TTT上は通過したかのように扱われる。
  例えば、A - B - C - D の各駅があり (とりあえず環状運行の前提)
      A  1000
      B   (設定なし)
      C    500
      D   (設定なし)
  という時間スケジュールが組まれているとすると、
   これまで: C 駅では、B発→C発 の時間が 500 になるように運行される
    変更後:   C駅では、A発→(途中Bに停車)→C発 の時間が 500 になるように運行される
  となります。同様に A駅では C→(D停車)→Aの時間が1000になるように調整されます。

長所: スケジュール全体にわたって値を設定しなくても、一部要所駅だけ設定してくだけで安定運行できます。
    (現実のスタフにあるような、一部の駅だけの発時指定みたいな感じです。)
短所: 一部区間はフリー運行(遅れようと早かろうと気にしない)、また別の区間は時間制御運行という
    ハイブリッドなスケジュールが組めなくなります。
    (これのニーズがあるかはわかりませんが。)

このように変更すると、極端な例では:
  最初の駅に 2000 と設定。
  他の駅には指定なし。
  で運行させると、この列車は全区間の運行時間が 2000になるように運行し、最初の駅でだけ停車時間調整をするようになります。
  (「絶対時間型」である運行周期やオフセットなどは全くなしに(絶対時刻指定はできないが) 一周分の時間を決められる)

上の「短所」に示したハイブリッド運行のニーズが特に考えられないようであれば、
このように変更したいと思います。
(みなさん、今は全区間に時間設定して試していますよね? (時間指定をまったくしない編成はそのままでいいとして))

ご意見募集です。

wackdone

  • 準急
  • ***
  • 投稿: 126
時刻表機能の課題
« 返信 #80 on: 2012/07/18 05:21 »
続いて時刻表表示の課題を記しておきます。今の私の頭の中にあるものです。
もちろん、ご提案があればどしどしどうぞ。
一人でアイディア出そうとしていても見方が狭くて限界があります。

駅とスケジュール上の指定点が完全に同じオブジェクトでは無いことに起因する問題:
Simutransの仕組み上、列車(他の乗り物も含む) の停車は、スケジュール上では
マップの中の点 (koord3d) として記憶されます。で、実際にその点が駅かどうかは
その点にホームがあるかどうかで判断されます。(内部では実は頻繁にこの判定をやっている)
またホームがあることによって、駅は三次元上のホームのある点の集合としても定義されます。

駅間距離の計算が完全ではない
今は最初に登録された編成のスケジュール点を使って駅間距離を計測しています。
またこの距離も、その編成が走行したとしてでルート計算しています。
これが問題になる例としては:
  計測に使った編成がディーゼル車で非電化路線を含めて近道で計算したが、後に追加した列車が電車だとこの距離では走れない
  (逆の順番でも同様。この場合、ディーゼル車にとっては実際より長い距離が示されます)

また、列車と自動車を並べて表示させる場合などには、駅の基準点が、線路か道路かどちらかのものになってしまい、
他種別のものの計算では困ったことになります。
(でも、時刻表の上で「このバスは、この列車に接続しているか?」なんて見てみたいですよね:)

アシスタントでの時間見積り
今の計算は   見積時間 =  (駅間距離+若干マージン) / 編成最高速度
  - 上の問題に付随して、距離が正確でないから時間も正確じゃなくなります。
  -また距離は妥当であっても、発進時、停車時、積載量、コーナリングでの減速などが加味されていません。
    いわゆる、最高速度と評定速度の差が出てしまいます。(評定速度の目安を見積りたい)
    今は固定的に若干のマージンを足していますが、固定値ではほとんど意味がない。
というわけで、実際に走行させて計測した方がはるかに信頼できる値が出せます。

通過判定
ある普通列車 L があり、L は駅 A、B、C に停車します。
また急行列車 E があり、E は駅 A と C に停車します。
この時、時刻表上で E x B の欄をどう考えるかという問題です。
選択は二つ、「通過」か「経路外」かです。 (日本の時刻表(冊子) だと 「レ」か「||」 かと言えばいいのかな?)

理想的には以下のように定義して区別したい。
  E が B の構内 (通過線を含む) を通って A から C へ移動するのであれば、この列車はBを「通過」する。
  E が B の構内を通らないのであれば、この列車はB については「経路外」である。

実際には、Eの走行経路は計算で求められますが、その各点が「Bの構内であるか否か」という判定が難しい。
なぜなら、通過線を通る場合はその各点は「駅」の情報の中に入っていないからです。(Simutransのデータ構造の問題)

今は A→B、B→C、A→C の走行経路から求まる距離を三角不等式にあてはめて
   AB + BC  ≦  AC+ε  (εは誤差吸収用の係数)
であれば、B を経由(通過する) と判定しています。
左辺が大きすぎれば「B駅を通ろうとするのは、実際の走行よりも遠回りしすぎだ。通るわけがない」という判定です。
ここで ε (誤差?)が発生する要因は:
  - B駅の認識点が、実際に走行するところより外れている (普通のために退避ホームが指示されているなど)
  - 走行経路がA駅、C駅の指定点の事情で若干変化している (急行は優等ホームから発車、など)
比較的軽めでそこそこ悪くない判定だと思いますが、ここでεというパラメータが必要なのが厄介なところ。
(ちなみに走行経路の計算は、必ず走行方向に合わせて計算する必要があります。信号や一方通行指示で走行方向によって経路が異なるためです。また実際にそこを走行する編成によって経路が異なるのは前述の通りです。その他にも速度制限標識の影響なども)

前項に関係している問題:
編成が表の上のどの駅行に「止まる」と判断するかが難しいために起こる問題です。

途中折り返し路線の表示
(例えば、関東では京浜東北線のような折り返しパターンを考えてみるといいのでしょうか。)
  A - B - C - D - E
とあって、
  A - B - C
        B - C - D
              C - D - E
という折り返し列車を同時に表示して、期待通りに表示できるかという問題です。
さらに快速運転で、
  A ----- D --E なんて加えてみるとどうなるでしょう。
周期400で、脳内ダイヤを組むと以下のような感じです。(快速の特に A-D間が160なのは速すぎな気もするけど)
列1列2列3快9
駅A0350
駅B10020v
駅C20012040v
駅D220140110
駅E240150
駅D340190
駅C32040v
駅B30020v
駅A0350

まず、今のロジックでこのように表示できるかという問題と、
さらに「折り返したところで時間表示が飛ぶのは見づらい」という問題があります。
(後述の「停車と駅間を区別」ができれば少しは解決します。)

その他、情報取り扱いの問題:
着発の分離
実際の時刻表だと、主要駅 (始終点、退避・接続駅) では、着時と発時が分離されて掲示されますね。
今の TTT は 駅間+停車 の合計の区間時間しか設定できないので「着時(予定)」を掲示することができません。
つまり、原始情報が足りていないのです。
データ構造的にこの分離をするのか (下手すると設定の面倒さが増す)、
擬似的に表示させたければ、駅手前に中継点を設定して、ここに時間を割当てるかです。
(後者の場合は特に、前の記事で書いた「中継点での取り扱い」を実現する必要があります。)

実績時間の取り扱い
今だと、その区間が「計測済みか」どうかがわからないし、
できれば(計画が設定されているのであれば) 先行しているか遅れているかを色分けや差分表示で見てみたいですね。
つまり、今の表は縦方向には差分が表示できているが、横方向の値の関係も表示できるといい、ということです。
あんまりやり過ぎると、表計算ソフトを作り出すようなことになりますのでほどほどにしないといけませんが。


他にも気になるところはあったはずなのですが、思い出したら後で追記します。

« 最終編集: 2012/07/18 05:43 by wackdone »

kanedai

  • 各駅停車
  • *
  • 投稿: 22
さっそく使ってもらわせてもらったのだが
列車ウィンドウにあった時間差?何秒とかのぐらふはなくなったの?
詳細を開いたらあったけど。

あと、自分のマップだけなのかもしれないけど
自動設定?回復にあるやつ使ってるからかもだけど。
始発点から次の駅までの時間が最初走らせたときとはまったく変わってしまい120が 1000とかになる
んだが自動設定をやめればいいのかな?
« 最終編集: 2012/07/18 05:52 by kanedai »

wackdone

  • 準急
  • ***
  • 投稿: 126
kendaiさん:

あれ? 私の手元で走っている画面だと表示されているけど。。。
走行している列車をクリックすると出てくる列車情報ウィンドウの中のバー表示のこと を言っていますよね?
自分でバイナリをダウンロードしなおして、VM上の Windowsで走らせてみているから、間違いないと思います。

追記:
  TTTに関する設定を一切していない編成には、バーを表示しないようにしています (オリジナルとの互換性確保のため)
  この判定が間違っているのかな?  対象の列車に駅間計画時間や周期時間、全部あるいは一部、どのように設定していますか?

kendaiさんが試しているのは、バイナリ? それともパッチを落として自分でビルド?
後者だとすると、ビルド時の設定が影響しているかも。(configの中に書く CFLAGS+=-Dなんちゃら)
« 最終編集: 2012/07/18 05:56 by wackdone »

wackdone

  • 準急
  • ***
  • 投稿: 126
kendaiさんからのもう一点:
>> 自動設定?回復にあるやつ使ってるからかもだけど。
>> 始発点から次の駅までの時間が最初走らせたときとはまったく変わってしまい120が 1000とかになる
>> んだが自動設定をやめればいいのかな?

バグかどうかの切り分け方法:
  列車のスケジュール編集画面で (列車の情報ウィンドウの中で「スケジュール」のボタンを押す) 見てみて
  その区間の値が変わってしまっていたらバグです。

  時刻表の上で、区間時間 (下のチェックを入れた時の青字で「+xxx」と表示される値) が変わっていても、
  おそらくバグ。
  時刻表の上の、駅の発車予定時刻 (黒文字で最初に何もつかない) が変わるのは、「自動設定」によって
  始点発時刻が変更されて、それにつられて変わるものなので「正常」です。

上のどれですかね?

kanedai

  • 各駅停車
  • *
  • 投稿: 22
今やってみると表示バーは出ました。

自分のやつではバグぽいものやっぱでました。
一応写真つけときます。

1枚目が一応通常
2枚目が変な奴。
福島駅の数値は時によって駅間時間変わりますが。。

自分で解析できればいいのだが、何分その知識がなくて(汗

gonyo

  • 各駅停車
  • *
  • 投稿: 16
現実の鉄道のダイヤ
« 返信 #85 on: 2012/07/18 21:16 »
simutransでの参考になればよいかとなと思うので紹介します。
現実の鉄道はだいたい始発→朝ラッシュダイヤ→昼のパターンダイヤ→夕方ダイヤ→終電→車庫 となってます。

simutransでは  昼のパターンダイヤを無限に続けるようにするというのはどうでしょうか。 これだとわかりやすい時刻表ができます。
ただし、輸送力が低下するという問題があります。※1

そこで鉄道の昼ダイヤちょっと紹介してみます。 例:大阪環状線外回り天王寺駅
http://www.ekikara.jp/newdata/ekijikoku/2701031/down1_27109011.htm
11~15がパターンダイヤ ※同じ時刻に発車する2つの電車がありますが手前の駅で連結済みの1編成の列車です。

昼ダイヤは1時間という周期で作られているのがわかるでしょうか。 他の路線もだいたい1時間周期です。運行周期にかかわらず1時間周期のダイヤになっているということです。
大阪環状線普通電車の運行見てみましょう。 1時間に4本 15分間隔ですね で時刻クリックすると 大阪環状線普通は昼ダイヤで1週42分でした。 で、天王寺で3分調整して45分間隔運行してるようです。(3分しか余裕ないからよく遅延するのかJRさん・・) すると時刻表見た感じは1時間周期の運行にちゃんとなってるということです。  

ここで解説: このダイヤでは3分調整してる間に快速電車が来ます。 普通電車とまってると邪魔ですね JR天王寺は駅ホームが多いので別のホームに快速を止めてるんでしょう。 同じホーム使うとこの時間調整ができなくなっちゃいます。 困りますねぇ
つまり、simutransでもこういった設備のある駅がないと時間調整できないです。 かといって42分周期のダイヤにすると遅延したときに困りますし・・・ 快速が42分周期じゃなかったらダイヤなんてない現状のsimutransそのものです。
 wackdoneさん ダイヤ作るためにはTTTのプログラム考えるのも重要ですがsimutransで大きい駅作る必要もあるということです。 JR天王寺駅のでかさは無駄ではないということです。 こういった配線も考えていかないとsimutransでダイヤを組むのは大変ですね。

ところでsimutransではこの1時間ってのがないですね。 TTTでこの1時間に相当するものを作ってしまえば楽なんじゃね?って考えもアリかもしれません。
ただし輸送力が多少犠牲になります。 simutransで限界まで本数を増やしたい場合これだとちょっと不都合です。 
混雑解消ゲーになってくるとこれではちょっと・・・

---  ここから下はsimutransで混雑やばくなってきた場合の話 ----

線路がつながっている路線(普通、優等、その他乗り入れしてる路線すべて)の運行周期は同じにしておかないとダイヤ組めません。 線路つながってない別の路線と運行周期がずれても無問題です。 つまり14分周期の路線と 線路がつながってない路線で27分周期ダイヤとかあっても問題ありません。 ですがそのへんの説明をみなさんにするのがとても難しいのです。 それをTTTに判断させようとするとまた面倒になります。
Q:14分周期とかする必要あるの? 15分でよくね?
A:混雑してきた場合14分周期とかする必要あるんです・・・
そこで最大運行密度を考えてみよう
要するに本数どこまで増やせるの?って話です。
普通、急行が2:1の割合で運行させる場合を考えます。 2つの普通列車は退避駅とか変わってくるので普通A、普通Bとしましょう
一番混雑しやすいところ(2面2線の急行停車駅)で 普通A、普通B、急行、普通Aの順に団子状態で運行させてみます
普通Aが出発してから次の普通Aが出発するまでの時間が最大運行密度です。 これが14分とかだと14分周期のほうが本数増やせるんだよね・・・これ以上本数増やせません あきらめましょう。 

で? 最大運行密度ってのTTTで求めるのか・・・  列車を渋滞させ、その渋滞の先頭部分で列車が通過してから次の列車が通過するまでの時間を求めてと・・・・  ここまでやってたらwackdoneさん倒れそうだなorz
最大運行密度は信号の間隔 線路の構造の他 満員時の列車の加速などで決まります。

TTTってプログラム面以外にも難しいところ多いですね。  2つのどちらの場合でも 編成数に関してですがまずダイヤを決めてからそのダイヤで運行するための編成数を決めたほうがいいかなと思います。

フリーズとか文字化けなどは明らかにプログラムの不具合ですが強制段落ちなど難しい 問題もありますね。
デッドロックとか 線路の構造や信号配置のミスが原因となるものもあるのでややこしいです。
例えば退避1つやるだけでも 待避線ないとできませんから・・・

sima0222

  • 各駅停車
  • *
  • 投稿: 23
こちらもkanedaiさんと同様の症状が出ていますので、これはバグだと思います。


また、時刻表表示の課題内の途中折り返し路線の表示に関連して…    
A─B┬C─D…路線1
   └E     …路線2
という路線を組む(A-Bは線路を共有する、要するに路線1が路線2に乗り入れる形)時に路線1と路線2を同じ画面に表示させようとすると
   L1C1 L1C2 L2C1
A駅  0   350
B駅 100  450
C駅 200  550
D駅 300  650
C駅 400  750
B駅 500  850
A駅 600  950
A駅           130
B駅           230
E駅           330
B駅           430
A駅           530

となってしまい全く同じ画面に表示する意味がなくなってしまいます。

これの対策をするには例えば、最初に表示する路線を「基本路線」として、追加する路線は「基本路線」に入っている区間だけ表示するようにすれば線路共有部分のダイヤが組みやすくなるかと思います。(わかりにくかったら言ってください)
こうすれば京浜東北線問題も解決できるかな、と思います。

wackdone

  • 準急
  • ***
  • 投稿: 126
kendaiさんとsima0222さんからご報告いただいている件ですが、
お二人とも Persistent auto-offset 継続的な始点発時刻の再計算
(「回復アシスタント」の中で、「処方3」の「常に再計算」を有効にしている)
状態で起きているということで宜しいでしょうか?
もし、これが有効で無いのに勝手に時刻が変わるようでしたらお伝えください。

(09:20 更新)
事情がわかってきました。
  (1) 「常に再計算」の状態にしておいて
  (2) 「運行アシスタント」の中で「運行周期」や「間隔」を変更して
  (3) 微妙なタイミングで「時刻表を更新」
すると、発生しうるようです。
内部の動きの予想:
  (1) 常に再計算は、時刻表の表示の上でいうと、最初の駅の行の時刻を変更している。
  (2) 時刻表表示は、これに合わせて各駅の出発予定時刻を、各区間の計画時刻を足していって決定している
  (3) 始点発時刻が自動で変更された直後は、時刻表の表示側はこのことを知らない
  (4) 表示の更新などのタイミングと絡んで、あるタイミングで「時刻表を更新」とすると
       時刻表ウィンドウは、「第二駅の発時刻」 - 「始点の発時刻」を、最初の区間の計画時間にしてしまう
という感じではないかと。
「表示の自動更新」「自動調整」「アシスタントでボタンを押した時に、すぐに編成に反映されるかどうか」
など、情報と操作の関係を整理しないと、安全策をとれないでしょう。
修正にはしばらくお待ちを。



これより下は、今後また別のトラブルが起きたときのために残しておきますが、今は無視してくださって結構です。

(05:45 以下、書き直します)

運行密度の高い路線を作って、gonyoさんの鉄道ダイヤ講座を読みながらしばらく走らせてみましたが、(gonyoさん、あとでお返事しますね)
なかなか問題の現象に出会えません。

kendaiさんにスクリーンショットを貼っていただいたのは助かったのですが、もう少し情報が欲しい。
以下、次に同じような現象が再現した場合でいいので、以下の情報を教えていただけませんか?
  * 現象が発生するまでに至った手順 (例えば:「xxアシスタントの何をした後に、yyをやって……」と)
  * その時点で「常に再計算」はオンだったかオフだったか
  * その時点の、再計算のために使われる各パラメータの値
    「運行アシスタント」より: 運行周期、発車間隔、出発ずらし時間
     また、その路線に所属する編成数も参考までに知りたいです。
      (列車を選択して、「運行アシスタント」の画面をそのまま撮影してもらうが簡単かも)
  * 列車の「スケジュール編集」の方で見える、各区間の計画時間 (今回の場合は特に最初の区間。つまり2駅目のところに表示される時間)
  * 最初の運行は正常に見えたか?
  * 全編成が何回りくらいしているうちに、異常が観測されたか?
  * 異常が発生した時の時刻表全体の様子。表示オプションは「周期時間」以外全てオンで
        (「周期時間」は絶対オフにしてください。問題が隠れてしまいます)
     ちなみに、表の左上隅の箱部分を Ctrl+Shift+クリックすれば全部オンになります。
      (二回クリックすると全部オフになるので、もう一回!)

ご面倒をおかけしますが、どうか宜しくお願いいたします。
(こんな路線を組むと一発で再現するよ、という情報があれば勿論ベストです)


以下、脳内切り分け中:
  - kendaiさんからの画像を見る限りは、最も酷い異常は、最初の区間「大阪駅」→「福島駅」の
    計画時間が、「元設定されていた計画時間」+「運行周期」になってしまっているところ。
    (おそらく運行周期は1520にされていると予想)
  - 「自動発時刻調整」機能は、始点駅の時間(オフセット)を変更するだけで、
     原則、どの区間の計画時間を変更してもいない。(ソースコード上も見当らない)
  - しかし変更されてしまっているということは、コード上からは見えてこないメモリ破壊か?
  - しかし「元の値」+「運行周期」という、あまりにキリのいい値にされてしまっている
    (外からのメモリ壊し系のバグは、こんなに都合良くはいかないのが一般的)
  - 一方で、時刻表表示のバグということもあり得る (時刻表は差分時間を集計して各点の時刻に変換しているので)
  - 各パラメータが想定外の値だと、チェックが甘くて (異常設定でもメッセージが表示できていない部分もある)
    予想外の動作になっているだろうな
  - とかいいつつ、単純なコーディングミスだったりするんだよな、こういう時たいていは
« 最終編集: 2012/07/19 09:29 by wackdone »

wackdone

  • 準急
  • ***
  • 投稿: 126
上に書いた「最初の区間の計画時間がおかしくなる」とは別に、
自動調整中に、異常な始点発時刻が設定される問題があることは把握しています。
  運行周期C、運転間隔P、ずらし時間S
の組み合わせによります。

具体的には、始点発時刻 O が、C より大きい値になってしまうという現象です。

現在、デバッグ中です。
  O = P*m + S
  C*n + O >= Now
の条件に合う、nとm (非負整数) を求めなければいけないのですが、
そもそも 2変数なので決定的には求まらないというのが厄介で。
« 最終編集: 2012/07/19 06:47 by wackdone »

yoyo

  • 各駅停車
  • *
  • 投稿: 4
wackdoneさん:
042でVCでのビルドが楽になりました。ありがとうございます。

<行見出し>
自分が言っていたのは駅名の事です。
路線をHIDEしたのに駅名が残ったままなのは変かなぁと。

<インスタンス初期化完了前のメンバーインスタンスへthisを渡す>
コンストラクタでは何もしないで、initメンバ関数で初期化するとか...自分もよく分かりません。

<VCでの残りの問題点>
gui\timetable_model.cc(457): warning C4138: 始まりのデリミターがない閉じのコメントデリミター (*/) が見つかりました。
void timetable_convoiinfo_t::insert_passage_stopinfo(uint32 pos, timetable_haltinfo_t const */*hi*/, koord3d const& refpoint)
"const */*hi*/"のところを"const * /*hi*/"で通りました。

gui\timetable_model.cc(719): error C2065: 'uint8_t' : 定義されていない識別子です。
gui\timetable_model.cc(1028): error C2065: 'uint32_t' : 定義されていない識別子です。
"_t"を削除してOKでした。

---
[絶対時刻の扱いと認識]を読みましたが、
逆の発想でsimutransのbits_per_monthを削除して新たにbi ts_per_dayを作るってのはどうでしょう?
これなら1日の長さは固定になりますし、内部はtickのままでUIだけday等に変換するのも簡単な気がします。
---