見出し画像

フリーパス考慮運賃対応の道のり

はじめに

こんにちは、ハルです。ナビタイムジャパンでバックエンドの探索エンジンサーバ開発を担当しています。

近年様々な使用期間限定型の特別企画乗車券(以下ではフリーパスと呼称)が公共交通各社から発売されており、弊社の経路探索でも対応を希望する声を多くいただくようになってまいりました。

弊社が提供している『NAVITIME』及び『乗換NAVITIME』では過去に「フリーパスを優先的に通過する経路探索」といった機能をローンチしています。
また発表当時から対応フリーパスも順次増えており、現在延べ100を超えるフリーパスに対応しております。(ただしサービスごとの指定可能なフリーパスは異なりますため、実際に利用する際には個別のサービスで利用可能な物をご確認ください)

そうした背景の中、ユーザからJRグループが発売する青春18きっぷへの対応を望まれる声が多かったこともあり、この度対象のフリーパスに青春18きっぷが加わりました。それと同時に「フリーパス利用を考慮した運賃計算」の対応を行いました。
本稿では後者「フリーパス利用を考慮した運賃計算」実現に至るまでの道のりをわずかですがご紹介します。

解決したかった課題

先のプレスリリース掲載の通り、従来のフリーパス優先探索では「フリーパスを使いやすい経路」を提示することはできましたが、「フリーパスが適用できない区間」に別途発生する運賃は探索結果に出せていませんでした。

この制約はせっかくフリーパスで探索しているのに「結局別途いくらかかるの?」とユーザの皆様にとっても不便且つ混乱を招く結果を提示してしまっていたのではないかと思います。

結局いくら??

これまで実現が難しかったのは各フリーパスに既存の切符にはない独自のルールが存在する物が多く、運賃計算のロジックとの親和性を確保しつつ組み込む形での実現ができなかったのが要因としてありました。

フリーパス考慮運賃実現への障壁

先に挙げたフリーパス独自のルールには例えば下記のようなものがあります。

* 対象路線の特定の駅でのみ乗下車可能
* 特定の期間のみ利用可能
* 特定の区間のみ特急乗車可能
* 乗車は特定の駅の中から選択、下車は区間内どこでも可能

今回対象といたしました青春18きっぷを取り上げますと具体的にJRの路線以外にも下記路線・区間に乗車できる特例が認められています。

* 青い森鉄道線の青森~野辺地~八戸間を通過可能、またその3駅でのみ乗下車可能
* あいの風とやま鉄道線の高岡~富山間を通過可能、またその2駅でのみ乗下車可能
* IRいしかわ鉄道線の金沢~津幡間を通過可能、またその2駅でのみ乗下車可能

ここに挙げた「特定駅でのみ乗降可能」という特例は今回フリーパス運賃考慮を行う際に大きな障壁でした。

青春18きっぷの特例との闘い

先の特例をもう少し詳しくひも解きますと特例区間の許容されていない駅で下車する場合、その路線全区間の運賃が必要となります。
例えば下記のような経路を考えます。この場合、青い森鉄道線内で乗下車可能なのは青森・野辺地・八戸の3駅ですが、それ以外の駅で下車すると乗車駅の青森から三沢までの運賃が発生するということです。この時発生する運賃は野辺地から三沢間の区間分ではないというのがポイントです。

画像4

この問題を解決する為には、

1. 一度探索で決定した経路を再度出発駅から前方に向かって走査していき
2. 特例が適用できない駅での下車を検出した場合…
3. 経路をさかのぼって該当路線のフリーパス適用を除外する

といった処理と、それを表現可能なデータ整備を行う必要がありました。この部分は今回の対応のなかで最も苦労したポイントです。
また、このフリーパス適用除外情報をマークしておくやり方は後述の運賃計算時のフリーパス適用区間抽出に流用できるという、副次的な恩恵もありました。

フリーパス考慮運賃の実現方法

今回のフリーパス考慮運賃の対応に当たってはフリーパスを「定期券と同等のもの」とみなし、既存の定期券運賃のロジックを応用しました。
ただし、この場合フリーパスの区間をそのまま定期券区間と同じように探索前に登録しようとするとフリーパスによっては対象路線が膨大であるために現実的でない懸念がありました。そこで発想を少し転換し、下記のように処理の順番を工夫しました。

1. 先に経路探索を行う
2. 探索された経路の中からフリーパス対象区間を抽出して定期券区間として登録
3. 既存の運賃計算を行う

ロジック概略図

このフリーパス区間登録の処理で、先のセクションの適用可・不可で分類したのちの適用可とマークされた区間を下図のようにあたかも定期券区間であるかのように扱うのです。

フリーパス区間登録

こうすることで運賃計算過程において大枠で既存の仕組みを応用しつつ、比較的少ない工数でフリーパス運賃の計算に対応することができました。
また探索時にはフリーパスの区間を全て列挙する必要がない点に加え、探索に先んじて登録しなくて済むので定期券の情報が探索に影響を及ぼさないことを保証できる点もメリットでした。

おわりに

本稿では『NAVITIME』と『乗換NAVITIME』の「フリーパス利用を考慮した運賃計算」の裏側をほんのわずかですが紹介させていただきました。
今後の展望としましては、現在プレスリリースにも記載の通り運賃対応フリーパスが4種のみとなっていますが、こちら順次拡大して参ります。

今はまだ新型コロナウィルスが蔓延していて、なかなか遠出が難しいご時世ではありますが、一刻も早く新型コロナウィルスの流行が終息し以前と同じように気軽に旅が楽しめるようになり、本機能をユーザの皆様に活用していただける時代がまた戻ってくることを心から願っています。