**酔っぱらいが語る日常とPASMO料金計算の話**


まず初めに言っておきますが、酔っております。まあそれはいつもの事ってことで。




さて、最近は特に面白いこともないのですが。時々友人と会話をしたり、プログラム作成などに没頭することが楽しみとなっています。っていうかメリハリのある人生を送りたいのね、俺は。ほんと毎日だらだら過ぎていってる感じで、無駄な毎日を送っているような気がするのだけれど、それを何とか打開せねば。




ということで、何科に没頭して楽しみを見いだすために、今日は友人とお茶してきました。そう、今日から友人となった人です。これから関係を改めてまた一人の友人、 one of my frend みたいなノリで let’s GO!!
なんか、ピーチクパーチクって書きてえ!!うぜえよばーか。お前いっぺん死んだ方がいいだろ、俺。ソロモン・グランディー!




そういうわけで、PASMOの料金計算について考えてみる。PASMOの料金計算を行うためには、まず各路線の接続状況を何らかの形で与える必要があるだろう。路線図は、各駅を頂点とし、駅間を結ぶ線路を辺とするグラフとして考えられる。従って、コンピュータでPASMOでの料金計算を考える場合は、これをグラフアルゴリズムに帰着して考えることができると思われる。




単純な例を考えるために、まず1路線内の料金計算方法について考えてみよう。例えば京王線を考える。井の頭線はとりあえず保留しておく。この時、京王線の路線図は一つのグラフとして表すことができるが、京王線内のみの料金計算を考えるならば、次のような2次元配列を用いれば可能である。




  • 京王線に属する駅(新宿、笹塚、明大前など)に0から始まる、自然数として連続な番号を付ける。すなわち、(新宿)=0,(笹塚)=1,(代田橋)=2… のように。

  • (新宿)=0の配列に対して、そこから到達しうる駅に関して、その駅までの料金表をさらに配列として定義する。仮に新宿を0、笹塚を1とするならば、配列要素[0][1]の値、すなわち料金は\120となる。つまり、2次元配列を作れば良い。ただし、任意の駅 i について、[i][i]は普通考えないので、未定義もしくは特別な値を設定しておき、存在しない組み合わせであることを示さなければならない。




こうして2次元配列として表の形で料金表を定めておけば、次のように考えることで料金計算は可能になる。




(新宿)=0で入場して、(笹塚)=1で出場したとすると、2次元配列の[0][1]の値を参照することで、新宿から笹塚までの料金を計算できる。一般に、駅 i で入場して、駅 j で出場した場合、 i から j までの料金は、2次元配列 [i][j] の値として定まる。




これは一つの路線、すなわち京王線の場合は井の頭線まで含めた料金表を作成する場合でも適用できる。同じ鉄道会社の場合、料金だけに着目すればそれは統一的に扱えるからである。




次に、2路線にまたがる料金計算について考えてみよう。




分かりやすいところでいうと、都営新宿線と京王線の2路線を利用した場合が考えられる。具体例として、市ヶ谷から笹塚まで乗車することを考えよう。すると、市ヶ谷から新宿までは都営新宿線で、新宿から笹塚までは京王線という扱いになるだろう。この場合、まずは2路線が接続する駅をみつけ、そこを起点として料金計算をおこなう方法が一つ考えられる。もう一つは、そのように明らかに接続している路線については、各連絡料金というものを定めた表を作っておく方法がある。ただし、3路線、4路線を乗り継ぐことを考えると降車の方法は空間量的に最適ではないだろう。




そして、2路線以上がからんでくる場合、乗り継ぎ改札を経由する場合と、改札を経由せず直接的に乗車できる場合の2通りを考えなければならない。上記の例では、市ヶ谷から新宿までは都営、新宿から笹塚までは京王線という事になるが、相互乗り入れをしている関係で新宿で改札を経由することはない。もちろん、わざわざ1回降りて改札を通れば別だが。それに対して、別の具体例として、地下鉄有楽町線の千川から市ヶ谷を経由して新宿へいく場合、有楽町線から都営線に乗り換える際に必ず乗り換え改札を通ることになる。ただし1回有楽町線を出場して都営線に新たに入場する場合は今は置いておく。乗り換え改札を利用する場合、出場駅と入場駅が同時に記録でき、初めに入場したところから次に出場したところまでの料金をその時点で計算することが可能である。




故に市ヶ谷・笹塚間のように改札を経由せずとも乗車できる区間についての料金計算方法を考えないといけない。すると、とりあえず二つの路線で共通の駅を探し、そこを起点として料金計算をすることになるだろう。




これを行うためには、とりあえず都営新宿線に属する駅の集合と、京王線に属する駅の集合の共通部分、すなわちインターセクションお考えなければならない。この場合は新宿駅が唯一の共通部分であるから、それを基点とすれば料金計算は正常に行われると考えられる。




だんだん考えるのが面倒になってきたのでもうやめる。ああめんどくせえ!どっか行けよ、ばーか。
最後にこれだけは言っておく。「すもももももももううれた」をきちんと形態素解析できるエンジンはどれだ〜!!