Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

信号インデックスの自動計算 #5

Closed
magicant opened this issue Feb 15, 2020 · 4 comments · Fixed by #6
Closed

信号インデックスの自動計算 #5

magicant opened this issue Feb 15, 2020 · 4 comments · Fixed by #6
Assignees

Comments

@magicant
Copy link
Owner

magicant commented Feb 15, 2020

ATC に対応するにあたって、「制限速度区間の手前 (別のパートファイル) で ATC の信号を下げることができる」ようにするためにパートファイルを終着駅から始発駅に向かって読み込むようにした (#3)。この副作用として、閉塞を設置する際にその先にある閉塞の位置が分かるようになった。これまではその場その場で固定の信号インデックスの組合せを使用していたが、これからは先にある閉塞の位置に基づいてより適切な信号インデックスを動的に選ぶことができそうである。具体的にどうすればよいか?

課題: 信号インデックスを自動で計算したとして、その閉塞で取りうる信号インデックスの組合せに応じて自動で信号の灯数を選ぶのはとても難しそう。ただし常に五灯式にしておけば大きな問題はない。

@magicant magicant self-assigned this Feb 15, 2020
@magicant magicant added this to To do in bve-random-map via automation Feb 15, 2020
@magicant
Copy link
Owner Author

magicant commented Feb 15, 2020

n 個先の閉塞の開始位置が dn [m] 先であるとする。2.5 [km/h/s] の減速度で減速していって dn - 30 [m] の位置までに停止できれば良いとすると、現在位置を通過できる速度の上限 vn [km/h] は何か? 等加速度運動の公式に従えば、

vn = 3.6 √(2 (2.5 / 3.6) (dn - 30)) = √(18 (dn - 30))

さて、信号インデックス i の制限速度を li [km/h] とする。最終的に求めたいのは、 livn を満たす最大の i である。これを求めるには livn を満たし 0 より大きい i がいくつあるか数えればよい。ここで、 livn の時に 1 となりそれ以外の時に 0 となる式 D(i, n) があれば、それを全ての i について足し合わせることで、求めたかった信号インデックスが求められる。

その D(i, n) であるが、vn ≥ 0, li > 0であるから、 D(i, n) = min(1, floor(vn / li)) とすればよい。さらに、 v は高々数千 [km/h] だから、 D(i, n) = ceil(floor(vn / li) / 65536) とでもしておけば十分である。

@magicant
Copy link
Owner Author

magicant commented Feb 15, 2020

進行信号は二段階あって、見た目は同じだが次が進行か進行以外かで信号インデックスが違う。これに対応するには、ある閉塞を設置したときの信号インデックスを変数に覚えておいて、その一つ手前の閉塞を設置するときにそれを参照するとよい。(ただし、これは ATC では行わなくてよい)

先行列車が n 個先の閉塞にいるときの現在閉塞の信号インデックス (上の D(i, n) の和) を cn とする。そして先行列車の位置が同じ時での一つ先の閉塞の信号インデックスを fn とする。現在閉塞と一つ先の閉塞とで連続した進行信号となるときを考慮した現在閉塞の信号インデックスを hn とすると、これは以下のように求められる。

hn = cn + floor(fn / m)

ただし m は進行信号の信号インデックスである。ここでは m が 2 以上の整数であるという仮定を用いた。

@magicant
Copy link
Owner Author

magicant commented Feb 15, 2020

さらに、進行信号の次にいきなり警戒信号や停止信号が出てきたら面食らうので、隣り合う閉塞の信号インデックスの差は 2 以下に抑えることにする。そのために、ある閉塞を設置したときの信号インデックスを変数に覚えておいて、その一つ手前の閉塞を設置するときに差が大きくなり過ぎないように抑える。 (ただし、これは ATC では行わなくてよい)

信号インデックスの差が大きくなり過ぎないように抑えた信号インデックスを jn とすると、

jn = min(hn, fn + 2)

なお

min(x, y) = (x + y - abs(x - y)) / 2

@magicant
Copy link
Owner Author

CS-ATC の場合は、信号インデックスが一閉塞づつずれる。

例えば、n 番目の閉塞に先行列車がいる場合、n - 1 番目の閉塞の信号インデックスは 10 (= ATC 01 信号) となる。自車が n - 1 番目の閉塞に進入したときに n 番目の閉塞より手前で止まれる上限の速度を v [km/h] とすると、n - 2 番目の閉塞の信号インデックスは対応する速度が v 以下の最も大きな信号インデックスとなる。それは、ATC でない路線において n - 1 番目の閉塞に設定される信号インデックスに等しい。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Development

Successfully merging a pull request may close this issue.

1 participant