JP2011065406A - 運賃表作成システム - Google Patents

運賃表作成システム Download PDF

Info

Publication number
JP2011065406A
JP2011065406A JP2009215333A JP2009215333A JP2011065406A JP 2011065406 A JP2011065406 A JP 2011065406A JP 2009215333 A JP2009215333 A JP 2009215333A JP 2009215333 A JP2009215333 A JP 2009215333A JP 2011065406 A JP2011065406 A JP 2011065406A
Authority
JP
Japan
Prior art keywords
fare
node
edge
route
distance
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2009215333A
Other languages
English (en)
Inventor
Takuya Maekawa
拓也 前川
Takashi Onoyama
隆 小野山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Solutions Ltd
Original Assignee
Hitachi Solutions Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Solutions Ltd filed Critical Hitachi Solutions Ltd
Priority to JP2009215333A priority Critical patent/JP2011065406A/ja
Publication of JP2011065406A publication Critical patent/JP2011065406A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

【課題】複数の運賃区分が設定されている交通網において、全ノード間の最安経路とその運賃を効率よく算出する運賃表作成システムを提供することを目的とする。
【解決手段】同一距離を与えたときに運賃換算情報の運賃の大小関係が確定する区分を合成して1つの区分としてまとめ、特殊ノード間の最短経路を全区分と各区分ごとでそれぞれ算出し、全区分と各区分ごとの一般ノード間の最短経路を、一般ノードとそれに隣接する特殊ノード間の経路と、特殊ノード間で算出した最短経路の組み合わせで構成される経路の中から算出し、最終的に区分間移動の経路を、先に算出した各区分での境界ノード間最短経路の組み合わせで探索する。探索途中の経路が現時点での最安経路の運賃を上回ることが確定した場合には、そこからの延長経路に対する探索を打ち切ることで、最安経路探索にかかる計算量を大幅に削減し運賃を効率よく算出する。
【選択図】 図1

Description

本発明は、交通機関の交通網利用時の運賃算出に関し、特に運賃が最安となる経路を探索して運賃表を作成する運賃表作成システムに関する。
大都市圏内の鉄道網のように、多数の路線によって構成される複雑なネットワークでは、乗客は、乗車駅から降車駅までの経路を複数の候補の中から選択して乗車することができる。またこのとき、切符の発券業務の簡略化や輸送量の振り分けなどを考慮し、どの経路を通っても、最も安い経路を通ったものとして運賃を設定するようになっている。
運賃は基本的に長距離を乗車するほど高くなっていくので、2駅間の最安経路を算出するには、ネットワーク上の最短経路探索手法を利用することが考えられる。この場合、例えば、非特許文献1に記載のダイクストラ法やワーシャルフロイド法といった最短経路探索アルゴリズムを利用することができる。これらのアルゴリズムは、駅をノード、駅間を結ぶ線路をエッジとするグラフとして構築し、そのグラフ上のノード間の最短経路を効率よく探索するものである。ダイクストラ法は、指定した出発ノードと任意ノード間の最短経路を探索するのに対して、ワーシャルフロイド法は、全ノード間の最短経路を探索するアルゴリズムである。また、A*アルゴリズムは、ダイクストラ法を拡張したもので、各ノードから目的ノードまでの最短距離の推定値が分かっている場合に、指定された2ノード間の最短経路探索を効率よく行うアルゴリズムである。
特許文献1に記載の経路探索方法では、指定された出発駅と到着駅間の経路を探索する際に、路線(エッジ)が3本以上接続している駅を交差駅とし、2つの交差駅間に挟まれた駅をグループ化して、2駅間の経路探索を交差駅をたどることで効率化している。
特開平9−161105号公報
A.V,エイホ、J.E.ホップクロフト、J.D.ワルマン著 大野義夫訳「データ構造とアルゴリズム」 培風館、1987年3月
しかしながら、実際の鉄道網においては、特に利用客の多い山手線内区間と地方のように利用客が少ない区間とでは、同一距離を乗車した場合でも同一の運賃が設定されていない。このため、非特許文献1に記載の方法で最短経路を求めても、それが必ずしも最安経路とはならない。また、特許文献1に記載の方法は、指定された2駅間の経路を算出するものであり、首都圏内でも1000以上ある駅の全駅間で運賃が最安となる経路を探索するには膨大な計算量を要する。
駅の自動改札機では、対象となるエリア内の全駅間の運賃をテーブルとして格納しているが、Suica(登録商標)やPASMO(登録商標)といったIC式乗車カードの利用可能エリアは年々増加しており、運賃テーブル作成にかかる計算量もそれに伴って増加している。この運賃テーブルは、最安経路の運賃を示すものであることが必須であり、所定時間内に算出することも必須である。
本発明の目的は、複数の運賃区分が設定されている交通網において、全ノード間の最安経路とその運賃を効率よく算出する運賃表作成システムを提供することにある。
上記目的を達成するため、請求項1に係る発明は、少なくとも入出力装置と処理装置と記憶装置を有し、交通機関の出発点と到達点となる各ノードに対し、全ての2ノード間の最安運賃を表す運賃表を作成する運賃表作成システムであって、前記各ノードを特定するノード情報を格納する手段と、2つのノード間を双方向で移動可能な場合の距離と、その移動にかかる運賃を算出する際の運賃区分を表す区分IDとを含むエッジ情報を記憶する手段と、同一区分内の1つ以上のエッジを通るときの運賃を、通るエッジの距離合計から算出するための、区分毎の運賃換算情報であって、各区分毎に優先度が付けられている運賃換算情報を記憶する手段と、単一区分内のエッジを通る場合はその区分の運賃換算情報を用い、複数の区分にまたがってエッジを通る場合は通過したエッジの区分の中で優先度の最も高い区分の運賃換算情報を用いて、通った全経路の合計距離によって運賃を算出する経路運賃算出手段と、任意の2ノード間の最短経路を、指定されたエッジ集合のエッジ情報から求める最短経路探索手段と、前記最短経路探索手段によって、全エッジ情報のエッジ集合を対象として求めた最短経路を1つのエッジとするエッジ距離最短エッジと各区分のエッジ情報のエッジ集合を対象とした最短経路を1つのエッジとする区分内最短エッジとを用いて、任意の2ノード間の運賃が最安となる、同一ノードを高々1回通る経路を探索する最安経路探索手段と、前記最安経路探索手段により、全ての2ノード間で運賃が最安の経路を探索し、全2ノード間の最安運賃を格納する運賃表を作成する運賃表作成手段とを備えることを特徴とする。請求項1に係る発明は、後述する実施形態の特に図15〜図18の処理でエッジ距離最短エッジと区分内最短エッジを利用して最安経路を求めている処理に基づくものである。
請求項2に係る発明は、請求項1に記載の運賃表作成システムにおいて、前記運賃換算情報は、複数の区分に属するエッジを通る経路の運賃を求めるための複合区分の運賃換算情報を含み、前記経路運賃算出手段は、複数区分を通る経路の運賃算出には、該複合区分の運賃換算情報を参照して運賃を算出することを特徴とする。請求項2に係る発明は、後述する実施形態で、運賃換算情報(112)の区分ID配列(214)の記載などに基づくものである。
請求項3に係る発明は、請求項1に記載の運賃表作成システムにおいて、前記エッジ情報には、運賃算出時に前記運賃換算情報と付き合わせるための運賃距離をエッジ距離とは別に設定することを特徴とする。請求項3に係る発明は、後述する実施形態で、エッジ情報(111)にエッジ距離(212)と運賃距離(213)を有していることなどに基づくものである。
請求項4に係る発明は、請求項3に記載の運賃表作成システムにおいて、前記運賃換算情報と付き合わせる距離として、前記運賃距離の合計を用いるか前記エッジ距離の合計を用いるかを示す運賃距離適用範囲情報を記憶する手段をさらに備え、前記経路運賃算出手段は、運賃算出の際、前記運賃距離適用範囲情報に応じて前記運賃距離の合計または前記エッジ距離の合計を用いて運賃を算出することを特徴とする。請求項4に係る発明は、後述する実施形態の図18のステップ1806,1807で運賃距離適用範囲情報(114)を利用していることに基づくものである。
請求項5に係る発明は、請求項1に記載の運賃表作成システムにおいて、区分内のエッジを通り、始発ノード以外のノードを高々1回通って始発ノードに戻れる閉路を構成するエッジを、異なるサブ区分のエッジにすることで、区分を分割するエッジ区分分割手段をさらに備え、該エッジ区分分割手段により区分を分割することで、前記最短経路探索手段によって作成された区分内最短エッジが、エッジ距離と運賃距離とをそれぞれ用いた場合に同一経路となるようにすることを特徴とする。請求項5に係る発明は、後述する実施形態の図11の区分分割処理の記載などに基づくものである。
請求項6に係る発明は、請求項1に記載の運賃表作成システムにおいて、複数の区分の組み合わせからなる区分集合に対して、その任意の要素が表す区分のエッジのエッジ距離と運賃距離が同一で、該区分集合の任意の部分集合に対する運賃換算情報が、該部分集合内の最高優先度の区分の運賃換算情報と同一で、該部分集合にない任意の区分を通過する経路が該部分集合内の区分をどのように通過しても、運賃算出に利用する運賃換算情報が同一であるとき、該部分集合のそれらの区分を合成区分として扱えるようにする区分合成手段をさらに備えることを特徴とする。請求項6に係る発明は、後述する実施形態の図12の区分合成処理の記載などに基づくものである。特に、「その任意の要素が表す区分のエッジのエッジ距離と運賃距離が同一」はステップ1205などの記載に、「該区分集合の任意の部分集合に対する運賃換算情報が、該部分集合内の最高優先度の区分の運賃換算情報と同一」はステップ1208などの記載に、「該部分集合にない任意の区分を通過する経路が該部分集合内の区分をどのように通過しても、運賃算出に利用する運賃換算情報が同一」はステップ1210〜1220などの記載に、それぞれ基づくものである。
請求項7に係る発明は、請求項1に記載の運賃表作成システムにおいて、前記ノード情報は、ノードから1つのエッジを通って移動可能なノードが1つしかない末端ノードと、3つ以上のノードに移動可能な交差ノードと、異なる区分およびサブ区分のエッジが複数接続している境界ノードと、それら以外の一般ノードとに分類するノード種別情報を有し、末端ノードと交差ノードと境界ノードをあわせた特殊ノードに対して、特殊ノードを出発してエッジを順にたどって次の特殊ノードに到達する経路を1つの連結エッジとし、またそのとき通過した任意の一般ノード間に対する連結エッジを作成する連結エッジ作成手段をさらに備え、該連結エッジ作成手段によって作成された連結エッジ集合を、任意ノード間の最短経路探索手段に適用し、さらにその最短経路探索手段によって得られた最短経路からなる新たな特殊ノード間の最短経路の連結エッジ集合を、エッジ距離最短エッジと区分内最短エッジとして任意2ノード間の最安経路探索手段に利用することを特徴とする。請求項7に係る発明は、後述する実施形態のノード情報(110)のノード種別の記載、図8の連結エッジテーブル作成処理の記載、および、作成した連結エッジテーブルの情報を利用して図7のエッジ距離最短経路探索処理でエッジ距離最短エッジテーブルの情報を作成し図14の区分内最短エッジテーブル作成処理で区分内最短エッジテーブルの情報を作成している記載などに基づくものである。
請求項8に係る発明は、請求項1に記載の運賃表作成システムにおいて、全区分を対象とする最短経路探索の結果を用いて、指定された出発ノードと折り返しノードとの間の最短距離と折り返しノードと到着ノードとの間の最短距離との差の絶対値をエッジ距離と運賃距離でそれぞれ求め、エッジ距離で最短距離の長いほうのノード間が1本のエッジとなっている場合に、そのエッジの出発ノードと到着ノードを、出発ノードと折り返しノードまたは折り返しノードと到着ノードに、修正するエッジ修正手段をさらに備えることを特徴とする。請求項8に係る発明は、後述する実施形態の図9のエッジ修正処理の記載などに基づくものである。
請求項9に係る発明は、請求項1に記載の運賃表作成システムにおいて、特定の始発ノードと終着ノードとの間の運賃を所定の運賃に更新するための特定区間運賃情報を記憶する手段と、前記最安経路探索手段によって作成された運賃表に対して、該特定区間運賃情報にしたがって運賃を更新する特定区間運賃更新手段とをさらに備えることを特徴とする。請求項9に係る発明は、後述する実施形態の特定区間運賃情報(116)や図19の特定区間運賃更新処理の記載などに基づくものである。
請求項10に係る発明は、請求項9に記載の運賃表作成システムにおいて、前記特定区間運賃情報は、前記最安運賃経路探索手段で算出された経路の運賃より安い運賃が指定された場合のみ運賃を更新するか、高くなっても必ず更新するかを指定する更新フラグを有し、前記特定区間運賃更新手段は、該更新フラグにしたがって運賃更新処理を行うことを特徴とする。請求項10に係る発明は、後述する実施形態で、特定区間運賃情報(116)の更新フラグ(229)の強制モードと更新モードの記載などに基づくものである。
請求項11に係る発明は、請求項9に記載の運賃表作成システムにおいて、前記更新フラグは、再帰モードを指定できるフラグであり、前記特定区間運賃更新手段は、前記更新フラグで再帰モードが指定され、前記最安運賃経路探索手段で算出された運賃より安い運賃が指定されていた場合、始発ノードと終着ノードの隣接ノードとの間の最安経路が終着ノードを通過しないとき、前記特定区間運賃情報で指定された運賃を、始発ノードと終着ノードの隣接ノードとの間の運賃の上限として再帰的に特定区間運賃更新手段を適用し、終着ノードと始発ノードの隣接ノードとの間の最安経路が始発ノードを通過しないとき、前記特定区間運賃情報で指定された運賃を、終着ノードと始発ノードの隣接ノードとの間の運賃の上限として再帰的に特定区間運賃更新手段を適用するものであることを特徴とする。請求項11に係る発明は、後述する実施形態で、更新フラグ(229)の再帰モードや図19の特定区間運賃更新処理の記載などに基づくものである。
請求項12に係る発明は、請求項1に記載の運賃表作成システムにおいて、ゾーンの代表となる1つの主ノードを特定する情報と、該主ノードからの適用距離範囲を示す情報と、該主ノードから該適用距離範囲内にあるノードを特定する範囲内ノード情報とを有するゾーン情報を記憶する手段をさらに備え、前記ノード情報は、該ノードが所属するゾーンを1つまたは複数指定する情報を含み、前記最安経路探索手段は、ゾーン内の任意のノードと該ゾーンの範囲内ノード情報で指定されている所定ノードとの間の最安経路およびその運賃を、該ゾーンの主ノードと前記所定ノードとの間の最安経路およびその運賃に置き換えることを特徴とする。請求項12に係る発明は、後述する実施形態のゾーン情報(115)や図15の最安経路探索処理の特にステップ1515〜1521の記載などに基づくものである。
請求項13に係る発明は、請求項1に記載の運賃表作成システムにおいて、前記最安経路探索手段は、最安経路探索途中の経路の部分経路に対して、当該部分経路と始発ノードおよび終着ノードが同一のエッジ距離最短経路のエッジ距離と運賃距離が、共に前記部分経路の距離未満で、かつ、前記部分経路の通過区分が前記エッジ距離最短経路の通過区分と同一の場合、前記最安経路探索途中の経路を延長した経路の探索を行わないようにすることを特徴とする。請求項13に係る発明は、後述する実施形態の図17の枝狩り判定処理のステップ1704〜1708などの記載に基づくものである。特に、「部分経路」は図17の処理中のR2に、「当該部分経路と始発ノードおよび終着ノードが同一のエッジ距離最短経路のエッジ距離と運賃距離が、共に前記部分経路の距離未満」はステップ1705,1706に、「前記部分経路の通過区分が前記エッジ距離最短経路の通過区分と同一」はステップ1707,1708に、「前記最安経路探索途中の経路を延長した経路の探索を行わないようにする」は図16のステップ1616に、それぞれ対応するものである。
請求項14に係る発明は、請求項6に記載の運賃表作成システムにおいて、前記区分合成手段は、合成されていない任意の区分の組み合わせからなる区分集合に対して、前記合成区分と前記区分集合の任意の部分集合とを組み合わせた区分に対する前記運賃換算情報の運賃が、前記合成区分と前記区分集合とを組み合わせた区分における同一距離の前記運賃換算情報の運賃より高くならないとき、枝狩り判定可能を返す運賃換算情報比較手段を備え、前記最安経路探索手段は、枝狩り判定可能の場合、最安経路探索途中の経路と現時点の暫定の最安経路が前記合成区分を通過し、該最安経路が該最安経路探索途中の経路の通過区分のみを通過する場合に、該最安経路探索途中の経路の運賃が該最安経路の運賃を越える場合には、前記最安経路探索途中の経路を延長した経路の探索を行わないようにすることを特徴とする。請求項14に係る発明は、後述する実施形態の図13の運賃換算情報比較処理の記載、および、図17の枝狩り判定処理のステップ1710〜1718の記載などに基づくものである。特に、「運賃換算情報比較手段」は図13の運賃換算情報比較処理に対応し、「枝狩り判定可能の場合、最安経路探索途中の経路と現時点の暫定の最安経路が前記合成区分を通過し、該最安経路が該最安経路探索途中の経路の通過区分のみを通過する場合」は図17のステップ1710〜1712に対応し、「該最安経路探索途中の経路の運賃が該最安経路の運賃を越える場合」はステップ1716に対応し、「前記最安経路探索途中の経路を延長した経路の探索を行わないようにする」は図16のステップ1616に対応するものである。
請求項15に係る発明は、請求項14に記載の運賃表作成システムにおいて、前記最安経路探索手段による最安経路探索の打ち切りを行う条件を、最安経路探索途中の経路と探索対象の終着ノードに向かう各エッジとを合わせた経路の運賃と探索途中時点での最安経路運賃との比較に変更できることを特徴とする。請求項15に係る発明は、後述する実施形態の図16のステップ1606でのEtの構成と、図17の枝狩り判定処理のステップ1713〜1718の記載などに基づくものである。
すなわち、本発明では、エッジをたどって移動可能なノードが3つ以上の交差ノード、移動可能ノードが1つの末端ノードと、異なる運賃区分のエッジが複数接続している境界ノードの3種類のノード種別に該当するノードを特殊ノード、それ以外のノードを一般ノードとし、同一距離を与えたときに運賃換算情報の運賃の大小関係が確定する区分を合成して1つの区分としてまとめ、特殊ノード間の最短経路を、全区分と各区分ごとでそれぞれ算出し、全区分と各区分ごとの一般ノード間の最短経路を、一般ノードとそれに隣接する特殊ノード間の経路と、特殊ノード間で算出した最短経路の組み合わせで構成される高々4種類の経路の中から算出し、最終的に区分間移動の経路を、先に算出した各区分での境界ノード間最短経路の組み合わせで探索し、探索途中の経路が現時点での最安経路の運賃を上回ることが確定した場合に、そこからの延長経路に対する探索を打ち切ることで、最安経路探索にかかる計算量を大幅に削減し、全ノード間の最安経路とその運賃を効率よく算出する。
本発明により、複数の運賃区分が設定された複雑な交通網の正確な最安経路を、従来に比較して大幅に削減された計算量で探索することができ、全ノード間の最安の運賃表を効率よく作成することができる。
本発明の実施形態である運賃表作成システムの全体構成図である。 本実施形態で用いるデータの構造を示す図である。 本実施形態で用いる出力結果のデータ構造を示す図である。 本実施形態の全体的な処理を示すフローチャート図である。 本実施形態の入力処理の詳細を示すフローチャート図である。 本実施形態の運賃表作成処理の詳細を示すフローチャート図である。 本実施形態のエッジ距離最短経路探索処理の詳細を示すフローチャート図である。 本実施形態の連結エッジテーブル作成処理の詳細を示すフローチャート図である。 本実施形態のエッジ修正処理の詳細を示すフローチャート図である。 本実施形態のゾーン情報更新処理の詳細を示すフローチャート図である。 本実施形態の区分分割処理の詳細を示すフローチャート図である。 本実施形態の区分合成処理の詳細を示すフローチャート図である。 本実施形態の運賃換算情報比較処理の詳細を示すフローチャート図である。 本実施形態の区分内最短エッジテーブル作成処理の詳細を示すフローチャート図である。 本実施形態の最安経路探索処理の詳細を示すフローチャート図である。 本実施形態の指定ノード間最安経路探索処理の詳細を示すフローチャート図である。 本実施形態の枝狩り判定処理の詳細を示すフローチャート図である。 本実施形態の経路運賃算出処理の詳細を示すフローチャート図である。 本実施形態の特定区間運賃更新処理の詳細を示すフローチャート図である。 本実施形態の出力処理の詳細を示すフローチャート図である。
以下、図面を用いて、本発明の実施の形態を説明する。
図1は、本実施形態の運賃表作成システムの全体構成図である。本システムは、入力装置(101)、ディスプレイなどの表示装置(102)、プリンタなどの出力装置(103)、処理装置(104)、および記憶装置(109)を備える。出力装置(103)は、プリンタなど以外の外部記憶媒体やネットワークを介するデータ転送であってもよい。
処理装置(104)は、入力処理部(106)、運賃表作成処理部(107)、出力処理部(108)を実現する一連のプログラム(105)を実行する。また、記憶装置(109)には、ノード情報(110)、エッジ情報(111)、運賃換算情報(112)、エッジ修正情報(113)、運賃距離適用範囲情報(114)、ゾーン情報(115)、特定区間運賃情報(116)、連結エッジテーブル(117)、エッジ距離最短エッジテーブル(118)、区分内最短エッジテーブル(119)、運賃表'(120)、および特定区間運賃更新ログ(121)が格納される。
図2は、記憶装置(109)に格納される情報の一例を示したものである。
ノード情報(110)には、鉄道の駅またはその中の改札機などを表すノード情報を格納する。具体的には、ノードを識別するID(201)、ノード名(202)、ノードが属するゾーンを表すゾーンID配列(203)、ノード位置を表す座標(204)、およびノード種別(205)を格納する。
ノードID(201)は、1から始まる連番の番号で設定する。ゾーンID配列(203)は、同一のゾーンIDを持つノードが同一ゾーンに属することを表しており、1つのノードに対して複数のゾーンが指定可能である。また、どのゾーンにも属さない場合には、空の配列を指定することができる。ゾーンを特定するゾーンIDは、1から始まる連番で設定する。なお、ゾーンについては、後に詳しく説明する。ノード種別(205)には、エッジ情報(111)との関連によって、末端ノード、交差ノード、境界ノード、一般ノードの4種類の種別のうちの何れかが設定される。
末端ノードとは、このノードを出発するエッジが1本だけのノードのことである。交差ノードとは、このノードを出発するエッジが3本以上のノードのことである。境界ノードとは、このノードを出発するエッジの区分(区分については後述する)が複数存在するノードのことである。一般ノードとは、上記の末端、交差、および境界のどれにもあてはまらないノードのことである。末端、交差、および境界のノード(すなわち、一般ノード以外のノード)を特殊ノードと呼ぶ。交差ノードかつ境界ノードの場合は、種別を境界ノードとする。ノード種別(205)は、図6の運賃表作成処理のステップ601で設定され、その後、区分分割処理や区分合成処理で更新されるので、ユーザによる入力は不要である。
エッジ情報(111)は、ノード情報(110)にあるノード間のつながり(路線)を表すものである。具体的には、エッジを識別するID(206)、出発ノードID(207)、到着ノードID(208)、経路(209)、区分ID(210)、サブ区分ID(211)、エッジ距離(212)、および運賃距離(213)からなる。
エッジID(206)は、1から始まる連番の番号で設定する。出発ノードID(207)および到着ノードID(208)は、このエッジの発着ノードを表すノードIDである。ユーザ入力時は、出発ノードID<到着ノードID の条件のエッジのみを入力し、その入力と同時に、入力された出発ノードを到着ノードとし、入力された到着ノードを出発ノードとする逆方向のエッジ情報を自動的に追加するものとする。このとき、入力されたエッジのエッジIDは1始まりの奇数を指定し、逆方向エッジIDはそれに1を加えた偶数で自動追加する。逆方向エッジのその他の情報は元のエッジ情報と同じである。
経路(209)には、出発ノード(207)から到着ノード(208)への移動でたどったエッジのID配列を格納する。つまり、経路(209)内の連続するエッジIDの前のエッジの到着ノードと次のエッジの出発ノードが一致するようにして、エッジの並びで移動経路を表現する。本実施形態では、この経路に対する逆方向経路を頻繁に生成するが、これは先に説明したように、入力エッジIDを奇数、その逆方向エッジIDを該入力エッジIDに1を加算した偶数としているので、逆方向経路は、経路を表すエッジID配列を逆順にし、先頭エッジIDから順に、奇数なら1を加え、偶数なら1を引いていくことで、簡単に生成することができる。なお、この経路情報(209)は、ユーザ入力時は不要である。処理が進むなかで、連結エッジテーブル(117)、エッジ距離最短エッジテーブル(118)、および区分内最短エッジテーブル(119)を生成するときに必要となる項目である。なお、これらのテーブルについては、後に詳しく説明する。
区分ID(210)は区分を識別するためのIDであり、サブ区分ID(211)はサブ区分を識別するためのIDである。どちらも1から始まる連番の番号で設定する。区分ID(210)は、このエッジが運賃換算情報(112)で指定されているどの運賃区分に属するかを表している。サブ区分ID(211)は、後述する区分分割処理によって区分をさらに分割した場合に設定されるので、ユーザ入力時は1である。区分ID(210)とサブ区分ID(211)は、経路(209)が設定されているときは、その経路内の全エッジが同一区分かつ同一サブ区分である場合にはそれらのIDを設定する。異なる区分あるいは区分が同一でも異なるサブ区分を通過している場合には、−1などの無効であることを示すIDを設定するものとする。
エッジ距離(212)には、出発ノード(207)から到着ノード(208)までの移動距離(実際の物理的な距離)を設定する。運賃距離(213)には、エッジ距離(212)とは異なり、運賃換算情報(112)を参照してこのエッジを通過する経路の運賃を算出する場合に利用する特別な距離を設定する。運賃距離(213)にはエッジ距離(212)以上の値が設定される。運賃距離(213)は、例えば地方交通線などの採算が良くない路線について実際の距離を割り増しした距離で運賃を計算するために使う距離だからである。エッジ距離(212)および運賃距離(213)は、経路(209)が設定されている場合は、その経路内の全エッジのエッジ情報のエッジ距離の合計値と運賃距離の合計値を設定する。
運賃換算情報(112)には、エッジ情報(111)で設定されている区分ID(210)に対して、経路距離の合計値から運賃を算出するための情報を格納する。具体的には、区分ID配列(214)、同一の運賃となる範囲を表す距離範囲(215)、およびその距離範囲内の距離に対する運賃(216)からなる。
区分ID配列(214)は、運賃換算情報(112)を、距離と運賃との関係を表す表とみたときの、表IDであるといえる。例えば、区分ID配列(214)に「1」と「2」が設定されている運賃換算情報(112)は、区分IDが「1」の区分内のエッジと区分IDが「2」の区分内のエッジを連結した経路の運賃を算出するために利用する。ユーザ入力時は、単一の区分IDの情報は必須である。すなわち、区分ID配列(214)が1つの区分IDからなるような運賃換算情報(112)は、後述する図5のステップ503でユーザ入力により設定される。区分ID配列(214)が複数の区分IDの組み合わせからなるような運賃換算情報(112)の入力は任意である。もし、運賃を算出する際に、求めたい複数の区分IDの組み合わせが区分ID配列(214)に設定されている運賃換算情報(112)が無かった場合には、運賃を求めたい区分ID配列の中の最高優先度の区分ID、つまりその区分ID配列の中の最大値の区分IDが区分ID配列(214)に設定されている運賃換算情報(112)を利用して運賃を算出するものとする。すなわち、運賃換算情報(112)は、区分ID配列(214)に設定されている区分IDの値が大きいものが優先度が高くなるように設定される。同一の区分ID配列(214)に対して、距離範囲(215)は複数指定可能である。ただし、距離を与えたら一意にその距離範囲が確定するようになっているものとする。例えば、同一の区分ID配列(214)で、距離範囲(215)が「3km以下」、「7km以下」、「10km以下」、…のようにそれぞれの距離範囲の運賃換算情報(112)を用意しておき、その区分ID配列で距離6kmが与えられた場合は、距離範囲(215)が「7km以下」の運賃換算情報(112)を参照して運賃(216)を求める。
また、各区分ID配列(214)における距離と運賃との関係では、長距離の運賃は短距離の運賃以上の値が設定されているものとする。なお、距離範囲の意味として、”以下”を”未満”としてもよい。この条件は予め決められているものとする。また、−1を無限大として扱うようにして、一定距離以上に対する運賃を指定することもできる。
つまり、この運賃換算情報(112)は、区分ID配列と距離を与えれば、一意に運賃を特定できるようになっている。また、同一区分ID配列に対して、短距離運賃<=長距離運賃となっているものとする。本実施形態では、ある区分または区分配列に対する運賃換算情報を、運賃換算表または単に換算表と表記することがある。また、区分aに対する換算表をa表、区分配列Kに対する換算表をK表、区分配列Kに区分aを加えた区分配列に対する換算表をK+a表、2つの区分配列K1,K2を合わせた区分配列に対する換算表をK1+K2表と表記することがある。K+a表は区分配列Kの全区分および区分aを通る経路の運賃を求める際に使用する換算表であり、K1+K2表は区分配列K1およびK2の全区分を通る経路の運賃を求める際に使用する換算表である。
エッジ修正情報(113)には、指定された発着ノード間のエッジを、指定された出発ノードと折り返しノード間のエッジ、および当該折り返しノードと到着ノード間のエッジに置き換えるための情報を格納する。具体的には、出発ノードID(217)、到着ノードID(218)、および折り返しノードID(219)からなる。例えば、A駅からB駅へ行くとき、A駅→C駅→B駅と行くしか方法が無く、A駅→C駅の路線が途中でB駅付近を通過しているケースがある。要するに、A駅→C駅の路線中のB駅付近に駅があれば良いが、種々の理由で駅を作ることができないため、C駅経由で折り返すしかないケースである。このようなケースでは、A駅C駅間の距離とC駅B駅間の距離との差をA駅B駅間の距離として運賃を算出するルールがある。エッジ修正情報(113)は、このようなケースを考慮して設けられているものである。
出発(217)、到着(218)、折り返し(219)の全ノードIDは必ず異なるIDを指定する。この発着ノード(217,218)間のエッジがエッジ情報(111)にない場合、出発折り返しノード間最短経路のエッジ距離と、到着折り返しノード間最短経路のエッジ距離との差の絶対値を新たなエッジ距離とし、出発折り返しノード間最短経路のエッジ距離と、到着折り返しノード間最短経路のエッジ距離の長いほうの経路が1つのエッジとなっている場合には、そのエッジに対して、修正エッジ情報で指定された折り返しノードを出発または到着ノードに変更する。また、運賃距離もエッジ距離と同様に差の絶対値を算出して更新する。これらの処理については、図9のエッジ修正処理で詳しく説明する。
運賃距離適用範囲情報(114)には、運賃換算情報(112)で指定された区分ID配列(214)に対して、その運賃換算情報(112)を、運賃距離で参照するか、エッジ距離で参照するかを決定する情報を格納する。具体的には、運賃換算情報(112)を特定する区分ID配列(220)、およびエッジ距離を適用する範囲と運賃距離を適用する範囲を規定する適用範囲(221)からなる。区分ID配列(220)に指定されていない区分に対しては、エッジ距離によって運賃換算情報を参照するものとする。適用範囲(221)は、運賃距離を適用する下限または最小値を指定する。すなわち、エッジ距離が適用範囲(221)で指定された値以上あるいはそれを超える場合は、運賃距離で運賃換算情報(112)を参照し、エッジ距離が適用範囲(221)で指定された値未満あるいは以下の場合は、エッジ距離で運賃換算情報(112)を参照するものとする。”以下””未満”といった範囲に関する条件は、予め決められているものとする。
ゾーン情報(115)には、ゾーン内発着の最安経路を、そのゾーンを代表する主ノード発着の最安経路に置き換えるための情報を格納する。具体的には、ゾーンを識別するゾーンID(222)、ゾーン内代表ノードとなる主ノードID(223)、適用距離範囲(224)、および主ノードとの最短距離が適用距離範囲(224)内のノードを格納する範囲内ノードID配列(225)からなる。例えば、あるゾーン内にあるA駅(主ノードとする)、B駅、C駅の何れかからD駅へ行く場合、主ノードであるA駅から例えば100km〜200kmの適用距離範囲にあるD駅については、ゾーン内のA〜C駅のどこからD駅へ行ったとしても運賃としては当該ゾーンを代表するA駅からD駅までの運賃を適用するという特例がある。ゾーン情報(115)は、そのようなゾーンを定義する情報である。
1つのゾーン(222)に対して、主ノード(223)と適用距離範囲(224)はそれぞれ1つ指定することができる。あるゾーンの主ノード(223)になっているノードは、他ゾーンに所属していても主ノードに指定されていなければならない。また、同一の主ノード(223)を持つ複数のゾーンにおける各適用距離範囲(224)は重複しないものとする。範囲内ノードID配列(225)は、ゾーン情報更新処理(図10)によって設定されるので、ユーザ入力時に入力する必要はない。この配列(225)は、主ノード(223)からの最短距離が適用距離範囲(224)内となるノードIDを格納する。ゾーン内の任意ノード(各ノードがどのゾーンに属しているかは、ノード情報(110)のゾーンID配列(203)を参照することにより分かる)と、範囲内ノードID配列(225)内のノードとの最安経路は、主ノード(223)と範囲内ノードID配列(225)内の当該ノードとの最安経路に置き換わる。
特定区間運賃情報(116)には、特定の発着ノード間の運賃を指定する情報を格納する。具体的には、始発ノードID(226)、終着ノードID(227)、更新する運賃(228)、および更新条件を表す更新フラグ(229)からなる。特定区間とは、予めどこからどこまではいくらというように区間(226,227)と運賃(228)が定められている区間のことである。例えば、A駅とB駅間に他社の路線が存在し、その他社の路線の方が運賃が安価である場合、競争力を付けるために、値下げした運賃とする場合がある。特定区間運賃情報(116)は、そのような区間と運賃を規定する情報である。
始発ノードID(226)と終着ノードID(227)は、始発<終着となる片方向のみで入力するが、その逆方向の運賃も同様に更新する。更新フラグ(229)は、算出された最安運賃に関わらず当該特定区間の運賃を運賃(228)に更新する強制モード0と、算出された最安運賃より運賃(228)の方が安くなるときだけ運賃(228)に更新する更新モード1と、算出された最安運賃より運賃(228)の方が安くなった場合に再帰的に更新する再帰モード11がある。強制モードのときは再帰モードは適用されない。
再帰更新処理は、以下の条件で適用される。指定された発着ノード(226,227)間運賃が運賃(228)で更新(上書き)されたとき、その部分区間(部分区間とは、その発着ノード間の経路に含まれる経路を持つ部分的な区間のことである)の運賃が高くなってしまうことを避ける必要がある。そのため、再帰更新処理により、始発ノード(226)を始発し、終着ノード(227)から1つエッジで移動可能な各ノードに終着する場合の最安経路が、終着ノードを通過しない場合には、指定された運賃を上限とするように運賃を更新し、この条件を再帰的に繰り返す。またこの条件は、始発ノード(226)からエッジ1本で移動可能な各ノード始発に対しても行われる。この再帰更新処理については、図19で説明する。
図3は、出力情報として記憶装置(109)に格納される情報の一例を示している。
運賃表(120)には、任意の発着ノード間の最安経路とその運賃を含む情報を格納する。具体的には、始発ノードID(301)、終着ノードID(302)、運賃(303)、最安経路(304)、エッジ距離(305)、および運賃距離(306)からなる。これらの構成は、エッジ情報(111)の構成とほぼ同一であるが、区分IDなど一部の情報は削除してある。
特定区間運賃更新ログ(121)には、特定区間運賃更新処理(図19)による処理内容を格納する。具体的には、始発ノードID(307)、終着ノードID(308)、最安経路探索処理(図15)によって算出された元の運賃を表す算出運賃(309)、特定区間運賃更新処理(図19)によって更新された更新運賃(310)、および更新フラグ(311)からなる。更新運賃(310)は、特定区間で指定された運賃(228)が実際に適用されなかった場合には、元の算出運賃が格納される。更新フラグ(311)は、更新フラグ(229)と同じ情報である。
図4は、本実施形態のシステムにおける全体処理を表すフローである。まず、入力処理を実行する(ステップ401)。この処理の詳細は図5で説明する。次に、運賃表作成処理を実行する(ステップ402)。この処理の詳細は図6で説明する。次に、出力処理を実行する(ステップ403)。この処理の詳細は図20で説明する。
図5は、図4中の入力処理(ステップ401)の詳細を表すフローである。まず、全てのノードについてノード情報(110)を入力する(ステップ501)。次に、エッジ情報(111)を入力する(ステップ502)。ここでは、隣り合うノードをつなぐエッジを片方向だけ入力し、逆方向の情報を自動的に追加するものとする。このとき、エッジIDは、入力された元のエッジ情報は1から始まる奇数で順番に付けていくものとし、逆方向エッジのIDはそれに1を加えた偶数として追加する。次に、運賃換算情報(112)を入力する(ステップ503)。ここで、特定の運賃換算情報が「長距離運賃 >= 短距離運賃」の条件をみたさない場合、ユーザに警告し、再入力を要求するか、あるいはプログラムを終了してよい。次に、エッジ修正情報(113)を入力する(ステップ504)。次に、運賃距離適用範囲情報(114)を入力する(ステップ505)。次に、ゾーン情報(115)を入力する(ステップ506)。次に、特定区間運賃情報(116)を入力する(ステップ507)。
図6は、図4中の運賃表作成処理(ステップ402)の詳細を表すフローである。まず、ノード情報(110)の各レコードのノード種別(205)を設定する(ステップ601)。この処理は以下の手順で行う。まず、全ノードのノード情報(110)のノード種別(205)を全て一般ノードに初期設定する。次に、各ノード情報(110)について、そのノードから出発するエッジが1本だけなら当該ノードのノード種別(205)を末端ノードとし、そのノードから出発するエッジが3本以上なら当該ノードのノード種別(205)を交差ノードとし、そのノードから出発するエッジの中に複数の区分の接続エッジがあれば当該ノードのノード種別(205)を境界ノードに、それぞれ設定する。
次に、エッジ距離最短経路探索処理を実行する(ステップ602)。この処理の詳細は図7で説明する。次に、エッジ修正情報(113)があるか調べる(ステップ603)。エッジ修正情報(113)がある場合は、エッジ修正処理を実行する(ステップ604)。この処理の詳細は図9で説明する。次に、エッジ修正情報(113)とエッジ距離最短エッジテーブル(118)と連結エッジテーブル(117)を削除する(ステップ605)。ここで、エッジ修正情報(113)を入力情報として残しておきたい場合は、該エッジ修正情報を無効化するようなフラグを用いればよい。そして、ステップ601に戻る。
ステップ603で、エッジ修正情報(113)がない場合(あるいは無効化フラグが立っている場合)には、まず、ゾーン情報更新処理を実行する(ステップ606)。この処理の詳細は図10で説明する。次に、区分分割処理を実行する(ステップ607)。この処理の詳細は図11で説明する。次に、区分合成処理を実行する(ステップ608)。この処理では、以下のステップ609の区分内最短エッジテーブル作成処理とステップ610の最安経路探索処理の内容を切り替えるための情報を作成する。この処理の詳細は図12で説明する。次に、区分内最短エッジテーブル作成処理を実行する(ステップ609)。この処理の詳細は図14で説明する。次に、最安経路探索処理を実行する(ステップ610)。この処理の詳細は図15で説明する。次に、特定区間運賃更新処理を実行する(ステップ611)。この処理の詳細は図19で説明する。
図7は、図6中のエッジ距離最短経路探索処理(ステップ602)の詳細を表すフローである。まず、連結エッジテーブル作成処理を実行する(ステップ701)。この処理の詳細は図8で説明するが、概要を述べると、この処理により、連結エッジテーブル(117)(そのレコードのフォーマットは図2で説明したエッジ情報(111)と同じである)に、全ての特殊ノードと特殊ノードとの間を連結する連結エッジ情報と、それら特殊ノード間の連結エッジの部分区間のエッジ情報が設定される。
次に、配列Espに連結エッジテーブル(117)中の特殊ノード間エッジIDを全て代入する(ステップ702)。次に、配列Nspに、配列Espで示される全てのエッジに関して各エッジの発着ノードとなっている全ての特殊ノードIDを代入する(ステップ703)。これで、ノード集合Nspとエッジ集合Espで表されるグラフG(Nsp,Esp)が確定する。次に、エッジ修正情報(113)の要素があるかチェックする(ステップ704)。エッジ修正情報(113)がある場合は、エッジ修正を行う区間のみ最短経路探索を行う。
まず、エッジ修正情報(113)のインデクスuを用意し、全てのエッジ修正情報のレコードに対するループを実行する(ステップ705)。このループ内では、まず、エッジ修正情報(113)の出発ノードID(217)をfに、到着ノードID(218)をtに、折り返しノードID(219)をvに、それぞれ代入する(ステップ706)。次に、配列Eに配列Espをコピーし、f,v間、f,各特殊ノード間、各特殊ノード,v間の連結エッジIDを全て追加する(ステップ707)。このとき、同一エッジIDが重複しないようにする。次に、f,v間の最短経路探索を実行する(ステップ708)。この処理は、配列Eに現れる発着ノード配列をNとするときのグラフG(N,E)に対する最短経路探索でダイクストラ法を適用することができるので、ここでは説明を省略する。探索結果はエッジ距離最短エッジテーブル(118)に追加する。またこのとき、v,f間の最短経路はf,v間の逆方向経路となるので、その逆方向経路をv,f間の結果としてエッジ距離最短エッジテーブル(118)に追加する。なお、エッジ距離最短エッジテーブル(118)は、ノード間のエッジ距離が最短となる経路を格納するためのテーブルであり、そのレコードフォーマットは図2で説明したエッジ情報(111)と同じである。次のステップ709および710は、ステップ707および708の処理のf,vをv,tに置き換えただけなので、詳細は省略する。ここまでの処理で、各エッジ修正情報の出発ノードfと折り返しノードvとの間の最短経路とその逆方向経路および折り返しノードvと到着ノードtとの間の最短経路とその逆方向経路が、エッジ距離最短エッジテーブル(118)に追加されたことになる。
ステップ704でエッジ修正情報(113)が空の場合は、配列Nspの全特殊ノードの組み合わせに対する最短経路探索を実行する(ステップ711)。この処理は、グラフG(Nsp,Esp)に対する最短経路探索であり、ダイクストラ法またはワーシャルフロイド法が適用できるため、詳細は省略する。探索結果はエッジ距離最短エッジテーブル(118)に追加する。
次の処理では、任意のノード間に対する最短経路探索を行う。まず、配列Nに、ノード情報(110)の全てのノードIDを代入する(ステップ712)。次に、配列NのノードIDの全ての組み合わせについてのループを実行する(ステップ713、714)。ここでは、i<jとなるようにループを回し、N[j],N[i]間の結果はN[i],N[j]間の結果の逆方向経路で追加している。ループ内ではまず、N[i],N[j]間の結果が既にあるかチェックする(715)。もしあるなら、次のノード間探索に進む。N[i],N[j]間の結果がまだない場合には、配列Eに以下の条件のエッジIDを格納する(ステップ716)。まず、N[i]が一般ノードの場合はその隣接特殊ノードをa,bとし、N[i]が特殊ノードの場合はa=b=N[i]とする。次に、N[j]が一般ノードの場合は隣接特殊ノードをp,qとし、N[j]が特殊ノードの場合はp=q=N[j]とする。そして、Eにステップ711で算出した特殊ノード間のエッジ距離最短エッジIDのうち、a,p間、a,q間、b,p間、b,q間のエッジでN[i]またはN[j]を通過しないものを追加し、さらに、N[i],a間、N[i],b間連結エッジのうちN[j]を通過しないものを追加し、p,N[j]間、q,N[j]間連結エッジのうち、N[i]を通過しないものを追加し、最後にN[i],N[j]間連結エッジを追加する。
次に、ステップ716で構成されたエッジ配列Eのエッジを使って、N[i],N[j]間の最短経路を探索する(ステップ717)。この処理は、エッジ配列Eのエッジを使って以下の5種類の経路を作成し、その中からエッジ距離が最短となるものを探せばよい。
(1)N[i],N[j]間連結エッジ
(2)N[i],a間、a,p間、p,N[j]間、のエッジを連結した経路
(3)N[i],a間、a,q間、q,N[j]間、のエッジを連結した経路
(4)N[i],b間、b,p間、p,N[j]間、のエッジを連結した経路
(5)N[i],b間、b,p間、p,N[j]間、のエッジを連結した経路
このとき、連結または最短エッジが存在しない場合は空の配列として扱い、前エッジの到着ノードと次エッジの出発ノードが同一のときを連結可能であるとして、最終的に(1)〜(5)のうちの連結可能な経路に対して最短となる経路を見つける。最短となる経路が見つかったら、エッジ距離最短エッジテーブル(118)に、逆方向経路とともに追加する。ここまでの処理で、全ノード間の最短経路とその逆方向経路が、エッジ距離最短エッジテーブル(118)に追加されたことになる。
図8は、図7中の連結エッジテーブル作成処理(ステップ701)の詳細を表すフローである。連結エッジとは、エッジ情報に含まれるエッジを1つまたは複数連結した経路を1つのエッジとするものである。経路中の前エッジ到着ノードと後エッジ出発ノードが同一の場合に、それらのエッジを連結して1つの連結エッジにすることができる。なお、連結エッジテーブル(117)には、発着ノード以外は特殊ノードを経由しない経路を全て連結エッジとして格納するものとする。
まず、配列Eに、エッジ情報(111)の全てのエッジIDを代入する(ステップ801)。次に、配列Nspに特殊ノードIDを全て代入する(ステップ802)。次に、配列Nspの各要素でループする(ステップ803)。このループ内では、まず、Eの要素があるかチェックする(ステップ804)。Eが空なら、処理を終了する。Eに要素(エッジID)がある場合は、まず、Eから、特殊ノードNsp[i]が出発ノードであるようなエッジIDを探し、変数esに代入する(ステップ805)。esに代入すべきエッジが見つからなかったら(ステップ806)、次のNspの要素にループを進める。エッジesが見つかったら、まず、経路配列Rの要素をesで初期化する(ステップ807)。すなわち、経路配列Rの先頭の要素としてエッジesを登録する。次に、Eからesとその逆方向エッジを削除する(ステップ808)。
次に、Rの終着ノードが特殊ノードでない間、以下の処理を実行する(ステップ809)。ここで、図8のフローでは、ループを抜ける条件として「Rの終着ノードが特殊ノード」を記述している。ループ内では、まず、経路Rとその逆方向経路を連結エッジテーブルに追加する(ステップ810)。次に、Rの終着ノードを出発し、まだRが通過していないノードに到着するエッジIDをEから探し、変数eに代入する(ステップ811)。次に、Rにeを追加する(ステップ812)。次に、Eからeとその逆方向エッジを削除する(ステップ813)。ステップ809からここまでのループで、特殊ノード間を移動するときの全ての一般ノードと出発側特殊ノード間の連結エッジが、連結エッジテーブル上に作成される。ループを抜けたら(すなわちRの終着ノードが特殊ノードになったら)、まず、経路Rとその逆方向経路を連結エッジテーブルに追加する(ステップ814)。
次に、R(この時点では、Rには特殊ノードから特殊ノードに至るエッジの並びが設定されている)の要素数が2以上の間、ループを実行する(ステップ815)。このループ内では、まず、Rから先頭要素を削除する(ステップ816)。ここで、Rの先頭要素を削除したら、それ以降の要素は1つづつ前にシフトするものとする。次に、Rとその逆方向経路を連結エッジテーブルに追加する(ステップ817)。次に、配列R2にRをコピーする(ステップ818)。次に、R2の要素数が2以上の間、以下のループ処理を実行する(ステップ819)。このループ内では、まず、R2から最後の要素を削除する(ステップ820)。次に、R2とその逆方向経路を連結エッジテーブルに追加する(ステップ821)。ループを抜けたら(すなわちR2の要素数が2より小さくなったら)、連結エッジテーブル内に同一発着ノードのエッジがあるか調べる(ステップ822)。なければ次のNsp要素にループを進め、ある場合はステップ823に進む。
以降の処理は、連結エッジテーブル内に、同一発着の特殊ノード間エッジが複数存在しないようにするものである。まず、同一発着エッジから一般ノードを1つ選び変数gに代入する(ステップ823)。エッジ情報では同一発着エッジを禁止しているので、ここでの一般ノードは必ず存在する。次に、gのノード種別を交差ノードに更新する(ステップ824)。次に、gを途中で通過する連結エッジを全て削除する(ステップ825)。ループを抜けたら、処理を終了する。
以上の図8の処理により、連結エッジテーブル(117)に、全ての特殊ノード間を連結する連結エッジ情報、および、特殊ノード間の連結エッジの全ての部分区間のエッジ情報が設定される。
図9は、図6中のエッジ修正処理(ステップ604)の詳細を表すフローである。まず、エッジ修正情報(113)のレコードでループする(ステップ901)。ループ内では、まず、変数fにu件目のエッジ修正情報(113)の出発ノードID(217)を、変数tに到着ノードID(218)を、変数vに折り返しノードID(219)を、それぞれ代入する(ステップ902)。次に、f,t間エッジがエッジ情報(111)にあるか調べる(ステップ903)。f,t間エッジがあれば修正の必要はないので次のエッジ修正情報(113)にループを進め、なければ以下に進む。次に、f,v間とv,t間最短経路があるか調べる(ステップ904)。どちらか片方でも最短経路がエッジ距離最短エッジテーブル(118)にない場合は、次のエッジ修正情報(113)にループを進める。そうでない場合は、以下に進む。
次に、変数fvにf,v間最短経路のエッジ距離を代入し、変数vtにv,t間最短経路のエッジ距離を代入する(ステップ905)。次に、変数cfvにf,v間最短経路の運賃距離を代入し、変数cvtにv,t間最短経路の運賃距離を代入する(ステップ906)。
次に、fv<vtなら(ステップ907)、fとtを入れ替える(ステップ908)。次に、エッジ情報(111)中にf,v間エッジがあるか調べる(ステップ909)。ない場合は次のエッジ修正情報(113)にループを進め、ある場合には以下に進む。次に、エッジ情報(111)中のf,v間エッジの到着ノードをtに修正する(ステップ910)。次に、エッジ情報(111)中のv,f間エッジの出発ノードをtに修正する(ステップ911)。次に、fv−vtの絶対値を、修正したエッジ情報のエッジ距離に代入し、cfv−cvtの絶対値を運賃距離に代入する(ステップ912)。全ての修正エッジに対する処理を終えたら終了する。
再度、図6からの処理の流れの概要を、エッジ修正情報(113)がある場合を想定して、説明する。まず、図6のステップ601→602と進み、図7のエッジ距離最短経路探索処理では、エッジ修正情報(113)があるので、ステップ701〜710が実行される。特に、ステップ705〜710の処理により、エッジ修正情報(113)のエッジ修正を行う区間であるf,v間とv,t間(fは出発ノード、vは折り返しノード、tは到着ノード)の最短経路をエッジ距離最短エッジテーブル(118)に作成しておく。その後、ステップ603→604と進み、図9のエッジ修正処理で、修正後のf,t間とt,f間のエッジ情報をエッジ情報(111)に作成しておく。ステップ604のエッジ修正処理の後、ステップ605→601→602と進み、図7のエッジ距離最短経路探索処理では、エッジ修正情報(113)が無いので、ステップ701〜704,711〜717が実行される。これにより、連結エッジテーブル(117)に、全ての特殊ノード間を連結する連結エッジ情報、および、それらの特殊ノード間の全ての部分区間のエッジ情報が作成され、さらにエッジ距離最短エッジテーブル(118)には、全てのノード間の最短経路のエッジ情報(上述の修正後のf,t間とt,f間のエッジ情報を含む)が作成される。その後、ステップ603→606と進む。
図10は、図6中のゾーン情報更新処理(ステップ606)の詳細を表すフローである。まず、ゾーンIDでループする(ステップ1001)。ループ内では、変数midにzidゾーンの主ノードIDを代入する(ステップ1002)。次に、ノードIDでループする(ステップ1003)。具体的には、変数nidに1からノード数までのノードIDを順に設定しながらループする。このループ内では、まず、nidとmidが同一か調べる(ステップ1004)。同一なら、次のノードにループを進める。nidとmidが同一でないなら、nidがzidゾーン所属かを判別し(ステップ1005)、所属していたら、次のノードにループを進める。nidがzidゾーン所属か否かは、ノードnidのノード情報(110)のゾーンID配列(203)にzidが含まれているか否かで判別できる。nidがzidゾーン所属でないなら、変数dにmid,nid間の最短エッジ距離を代入する(ステップ1006)。これは図7で作成したエッジ距離最短エッジテーブル(118)を参照すればよい。次に、dがzidゾーンの適用距離範囲(224)内の距離か判別する(ステップ1007)。そうであれば、zidのゾーン情報(115)の範囲内ノードID配列(225)にnidを追加する(ステップ1008)。dがzidゾーンの適用距離範囲(224)内でなければ、次のノードにループを進める。全てのループを抜けたら、終了する。以上の処理により、全てのゾーン情報(115)の範囲内ノードID配列(225)が設定される。
図11は、図6中の区分分割処理(ステップ607)の詳細を表すフローである。この処理は、区分内最短経路が、エッジの移動コストとしてエッジ距離と運賃距離のどちらを利用しても、同一の最短経路になるようにするものである。最短経路が一致しない可能性がある場合には、その原因となる区分内の閉路を構成する可能性があるエッジをサブ区分として分割する。
まず、変数kに1から順に区分IDを格納し、該区分IDでループする(ステップ1101)。ループ内では、まず、変数subに2を代入する(ステップ1102)。次に、配列Eにエッジ情報(111)の区分kの全エッジIDを代入する(ステップ1103)。次に、配列Eで末端となるノードがある間、ループを実行する(ステップ1104)。ここでの末端となるノードとは、ノード情報(110)のノード種別(205)で末端となっているノードではなく、配列Eに格納されているエッジ集合において末端ノードとなっているノードのことである。ループ内では、末端ノード接続エッジを配列Eから削除する(ステップ1105)。以上により、配列Eには、環状線を構成するエッジだけが(存在すれば)残ることになる。
ループを抜けたら、まず配列Eに境界ノード接続エッジがあるか調べる(ステップ1106)。ここでの境界ノードは、ノード情報(110)のノード種別(205)で境界ノードとなっているノードである。境界ノード接続エッジがあれば、次に配列Eの全要素について運賃距離がエッジ距離と等しいかチェックする(ステップ1107)。全エッジの運賃距離がエッジ距離と等しいなら、この区分は分割する必要がないので、次の区分にループを進める。
ステップ1106で境界ノード接続エッジがない場合、あるいはステップ1107で運賃距離とエッジ距離が等しくない要素が配列Eに存在する場合は、ステップ1108に進む。配列Eに要素がある間、以下のループを実行する(ステップ1108)。ループ内では、まず、配列Eの要素を1つ削除し、削除したエッジIDを変数eに代入する(ステップ1109)。次に、変数e2にeの逆方向エッジを代入し、配列Eから削除する(ステップ1110)。次に、eの発着ノードのノード情報(110)のノード種別(205)を境界ノードに設定する(ステップ1111)。次に、エッジ情報(111)内にあるエッジeとe2のレコードおよび連結エッジテーブル(117)内にある、eおよびe2と発着ノードが同一のレコードのサブ区分(211)に変数subの値を設定する(ステップ1112)。
次に、連結エッジテーブル(117)内にある、エッジeまたはe2を経路内に含み、その他のエッジと連結しているレコードを削除する(ステップ1113)。つまり、この処理は連結エッジテーブル(117)内の、ステップ1111で新しく境界ノードに変更されたノードを途中で通過する連結エッジを全て削除する。
次に、subに1を加える(ステップ1114)。次に、配列Eで末端となるノードがある間、ループを実行する(ステップ1115)。ループ内では、末端ノード接続エッジを配列Eから削除する(ステップ1116)。全てのループを抜けたら、終了する。
以上の図11の処理により、区分内の閉路を構成するエッジがサブ区分として分割されたことになる。
図12は、図6中の区分合成処理(ステップ608)の詳細を表すフローである。まず、この処理の概要を説明する。
2つの区分1と2に対して、区分1と2のみを通過する経路の運賃が区分2表の運賃換算情報(112)によって算出され、同一距離に対して、1表運賃 ≦ 2表運賃が成り立つとき、区分1+2での最安経路(区分1と2を通過する運賃が最安の経路)は、区分1の最短経路(区分1を通過する最短の経路)と区分1+2内最短経路(区分1のエッジと区分2のエッジをあわせたエッジ集合に対する最短経路)のどちらかになる。なぜなら、区分2表最安経路は必ず区分2を通過する経路の中での最短経路であるが、仮に区分1+2内最短経路が区分1のみを通過する場合、区分2を必ず通過する経路は区分1+2内最短経路距離以上の距離になり、区分1表と区分2表には大小関係があり、かつそれぞれの表には長距離の方が高い運賃がつけられているからである。要するに、例えばA駅からB駅へ行く場合の区分1+2内最安経路(区分1のエッジと区分2のエッジをあわせたエッジ集合に対する最安経路)を算出するときには、(1)まず区分1内だけで最短経路を求め、(2)次に区分2内だけで最短経路を求め、(3)さらに区分1と2の両方を通るケースで最短経路を求める必要がある。その3つの最短経路の中に最安の経路があるはずである。しかし、もし同一距離に対して常に1表運賃 ≦ 2表運賃であるなら、上記(2)と(3)の条件は、(4)区分1と区分2のエッジをあわせたエッジ集合に対する最短経路、と統合することができる。なっぜなら、(2)と(3)はともに2表で運賃算出するが、(4)は1表または2表のどちらかで運賃を算出することになり、(1)(2)(3)のどの経路も(4)より距離が短くなることはないからである。このため、(1)と(4)のどちらかに区分1+2内最安経路が含まれることになる。さらに、(3)は異なる区分をそれぞれ必ず通過するという条件のためダイクストラ法が利用できないのに対して、(1)と(4)はダイクストラ法を用いることで高速に最短経路を算出することができる。
また、区分1と2以外の任意の区分を通過する経路が区分1+2内をどのように通過しても、運賃算出に利用される換算表が同一であるなら、その他の換算情報を使う経路であっても、区分1+2内を通過する部分経路は区分1+2の中で最短経路となるので、区分1と2をまとめて考えることができる。ここでさらに区分3を加えた場合も、上記のように区分3の換算表が区分1,2に比べて高い運賃に設定されていて、その他区分を通過する任意の経路が区分1+2+3内をどのように通過しても同一の換算表を利用するならば、区分1+2+3内の最安経路を区分1、区分1+2、区分1+2+3のそれぞれの最短経路から求めることができる。このようにして、図12の区分合成処理では合成可能な最大の区分の組み合わせを算出する。
図12のフローを説明する。まず、配列KMを空に初期化し、配列KPに全区分の区分IDを代入する(ステップ1201)。KMは、合成する区分を設定するグローバル変数(配列)である。次に、区分IDをセットする変数kに初期値として1を代入する(ステップ1202)。次に、区分kが最大区分ID以下かを調べ(ステップ1203)、区分kの全エッジのサブ区分に2がないかを調べ(ステップ1204)、区分kの全エッジのエッジ距離が運賃距離と等しいかを調べ(ステップ1205)、運賃換算情報で同一距離を与えた場合にKM表運賃がk表運賃以下かを調べる(ステップ1206)。ステップ1203〜1206を全て満たす場合はステップ1207に進み、それ以外はステップ1223に進む。
次に、KMが空かを調べる(ステップ1207)。空でない場合には、次に進む。次に、KM+k表とk表が同一か調べる(ステップ1208)。同一とは、同一距離なら同一運賃を返すということである。次に、KPからkを削除する(ステップ1209)。次に、変数kpcntに、2のKP要素数乗から1を引いた値を代入する(ステップ1210)。kpcntは、KPの部分集合を生成するために用いる。次に、kpcntが0より大きいかを調べる(ステップ1211)。kpcntが0以下である場合、KMにkを追加し(ステップ1222)、kに1を加えて(ステップ1223)、ステップ1203に戻る。またステップ1207でKMが空だった場合は、KPからkを削除し(ステップ1221)、その次にステップ1222に進む。
ステップ1211でkpcnt>0のときは、kpcntのビット列から、KPの部分列KP2を生成する(ステップ1212)。この処理は、kpcntで“1”が立っているビットのビット位置に対応するKPの要素(例えば、kpcntの20ビットをKPの第1番目の要素に対応させ、kpcntの21ビットをKPの第2番目の要素に対応させ、同様にして、kpcntの2nビットをKPの第n+1番目の要素に対応させる)をKP2に格納する処理である。次に、変数kmcntに2のKM要素数乗から1を引いた値を代入する(ステップ1213)。kmcntの意味はkpcntと同じで、KMに対するビット列である。次に、kmcntが0以上か調べる(ステップ1214)。0未満の場合は、kpcntから1を引いて(ステップ1220)、ステップ1211に戻る。次に、kmcntのビット列から、KMの部分列KM2を生成する(ステップ1215)。この処理は、ステップ1212でKPに対して行った処理をKMに対して行うものである。次に、KM2にkを追加する(ステップ1216)。次に、KM2+KP2表とKM+KP2表が同一かを調べる(ステップ1217)。同一でない場合は、KPにkを戻して(ステップ1219)、ステップ1224に進み、同一なら、kmcntから1を引いて(ステップ1218)、ステップ1214に戻る。
ステップ1210〜1220の処理は、要するに、いまKMにkが合成できるかどうかを調べているのであるが、その合成しようとしている区分の組み合わせKM+kが、合成されていない残りの配列KP内の区分のどのような部分集合と結びついたとしても、結局はKM+kの合成されようとしている区分のどこを通っても同じ運賃表を使うことになる、ということを確認しているものである。ステップ1211でNoとなってステップ1222に進むケースが、それが確認されてKMにkの合成が可能であると言うことである。ステップ1217でNoとなりステップ1219に進むケースは、それが確認できず合成ができない場合である。
ステップ1224まで進んだら、合成可能な区分IDがKM内に格納されている。KM要素数が1の場合は(ステップ1224)、合成する区分がなかったということであるから、KMの要素をKPに移動する(ステップ1225)。次に、ノード種別が境界ノードとなっているノードのノード情報(110)のうち、KMにある区分しか接続していないものを交差ノードに変更する(ステップ1226)。次に、運賃換算情報比較処理を実行し(ステップ1227)、処理を終了する。この処理の詳細は図13で説明する。
図12の処理により、KMに、合成可能な最大の区分の組み合わせが設定されたことになる。合成可能な最大の区分の組み合わせを求めておくことにより、後の例えば図16のステップ1605で処理を簡略化することができる。
図13は、図12中の運賃換算情報比較処理(ステップ1227)の詳細を表すフローである。この処理では、図12の処理で合成された区分と合成されなかった任意の区分の組み合わせとを組み合わせた場合に、部分集合となっている組み合わせの運賃換算情報が同一距離で高い運賃にならないことを判定する。判定結果がtrueになった場合、図17での最安経路探索の枝狩り判定処理で、現在の最安経路と探索途中の経路運賃の比較によって、探索の枝を限定することができる。この判定処理も、図12と基本的な意味は同じで、合成区分を必ず通過する経路が、合成されていない区分を新たに通過する場合、その運賃が安くならないことを保証するものである。
まず、配列Kに配列KM以外の全ての区分IDを代入する(ステップ1301)。KMは図12で作成された合成区分である。次に、配列Kを引数に再帰判定ルーチンを呼び出す(ステップ1302)。再帰判定結果がtrueなら(ステップ1303)、枝狩り判定可能を設定し(ステップ1304)、falseなら、枝狩り判定不可能を設定する(ステップ1305)。枝狩り判定可能/不可能の結果は、グローバル変数に格納しておけばよい。この結果は、図17のステップ1710で参照される。
次に、再帰判定ルーチンについて説明する。まず、引数として区分ID配列Kを受け取る(ステップ1306)。次に、変数bretにtrueを代入する(ステップ1307)。変数bretの値は再帰判定ルーチンの判定結果を表し、呼び出し元に通知される。次に、Kの要素が空なら(ステップ1308)、bretを返してリターンする。空でなければ、Kの要素でループする(ステップ1309)。このループ内では、まず、配列K2にKをコピーする(ステップ1310)。次に、K2からK[i]を削除する(ステップ1311)。このとき、K2が空になってもよい。次に、K2内の全エッジ(エッジ情報(111)内のエッジのうち、K2内の区分に属する全エッジ)のエッジ距離と運賃距離が同一かチェックする(ステップ1312)。条件を満たす場合はステップ1313に進む。K2が空のときもステップ1313に進むものとする。次に、2つの運賃換算情報K+KM表とK2+KM表に対して同一距離を与えた場合に「K+KM表運賃≧K2+KM表運賃」が成り立つかチェックする(ステップ1313)。これが成り立つ場合、K2+KMの区分を通過する経路を延長してk[i]を新たに通過する経路は、元の経路より運賃が安くならないことが保証される。もし、条件を満たすなら、K2を引数に指定して再帰判定ルーチンを呼び出す(ステップ1314)。その判定処理結果がfalseなら(ステップ1315)、またはステップ1312、1313が条件を満たさなかったら、bretにfalseを代入し(ステップ1316)、処理を終了する。ループを抜けたら処理を終了する。ステップ1314の判定処理結果がtrueなら、ループを進める。このループを抜けた場合、変数bretにはtrueが格納されている。
なお、ここでの判定処理は、図17で枝狩り判定可能な十分条件の一例を示すものであり、入力データの条件を絞ることで、さらに枝狩り判定条件を拡張することも可能である。
図14は、図6中の区分内最短エッジテーブル作成処理(ステップ609)の詳細を表すフローである。この処理は、区分とサブ区分を限定したエッジ集合に対して図7のステップ711以降の処理を適用し、その結果を区分内最短エッジテーブル(119)に格納するものである。なお、区分内最短エッジテーブル(119)は、区分とサブ区分を限定した範囲内における全ノード間の最短経路探索結果の経路を格納するためのテーブルであり、そのレコードフォーマットは図2で説明したエッジ情報(111)と同じである。
まず、区分とサブ区分でそれぞれループする(ステップ1401、1402)。このループ内では、まず、配列Espに、連結エッジテーブル(117)中の区分kかつサブ区分sの特殊ノード間エッジIDを全て代入する(ステップ1403)。この処理では、図12の区分合成処理によって作成された合成区分配列KMに区分kが含まれている場合、KM内で区分kより優先度の低い区分の特殊ノード間連結エッジもEspに追加する。次に、配列Nspに、Espで発着ノードとなっている全ての特殊ノードIDを代入する(ステップ1404)。これで、ノード集合Nspとエッジ集合Espで表されるグラフG(Nsp,Esp)が確定する。次に、Nspの全特殊ノードの組み合わせに対する最短経路探索を実行する(ステップ1405)。この処理は、グラフG(Nsp,Esp)に対する最短経路探索であり、ダイクストラ法またはワーシャルフロイド法が適用できるため、詳細は省略する。探索結果は、区分内最短エッジテーブル(119)に追加する。
次の処理では、区分内の任意のノード間に対する最短経路探索を行う。まず、配列Nに区分kかつサブ区分sのエッジの全発着ノードIDを代入する(ステップ1406)。この処理では、ステップ1403と同様に、KMにkが含まれていれば、KM中のkより優先度の低い区分のエッジの発着ノードも含める。次に、Nに含まれるノードIDの組み合わせのループを実行する(ステップ1407、1408)。ここでは、i<jとなるようにループを回し、j,i間の結果はi,j間の結果の逆方向経路で追加している。
ループ内では、まず、N[i],N[j]間エッジが区分内最短エッジテーブル(119)内に既にあるかチェックする(ステップ1409)。もしあるなら、次のノード間探索に進む。なければ、配列Eに以下の条件のエッジIDを格納する(ステップ1410)。まず、N[i]が一般ノードの場合はその隣接特殊ノードをa,bとし、N[i]が特殊ノードの場合はa=b=N[i]とする。次に、N[j]が一般ノードの場合は隣接特殊ノードをp,qとし、N[j]が特殊ノードの場合はp=q=N[j]とする。そして、配列Eに、ステップ1405で算出した特殊ノード間の区分内最短エッジIDのうち、a,p間、a,q間、b,p間、b,q間のエッジでノードN[i]またはノードN[j]を通過しないものを追加し、さらに、N[i],a間、N[i],b間連結エッジのうちノードN[j]を通過しないものを追加し、p,N[j]間、q,N[j]間連結エッジのうち、ノードN[i]を通過しないものを追加し、最後にN[i],N[j]間連結エッジを追加する。配列Eのエッジを使って、N[i],N[j]間の最短経路を探索する(ステップ1411)。この処理は、図7のステップ717と同じである。最短となる経路が見つかったら、区分内最短エッジテーブル(119)に、逆方向経路とともに追加する。全てのループを抜けたら、処理を終了する。
以上の図14の処理により、区分とサブ区分を限定した範囲内での全ノード間の最短経路が、区分内最短エッジテーブル(119)に設定された。
図15は、図6中の最安経路探索処理(ステップ610)の詳細を表すフローである。この処理では、まず主ノードとそれ以外のノード間の経路を先に算出しておき、その後、任意ノード間の経路を探索する。このとき、ゾーン内ノードと図11のゾーン情報更新処理によって設定された距離範囲内ノード間の経路は、先に算出しておいた主ノードと距離範囲内ノード間の経路に置き換える。
まず、配列Nmに主ノードとなっている全ノードIDを、配列Nには全エッジの発着ノードIDを代入する(ステップ1501)。次に、配列Nmの要素でループする(ステップ1502)。次に、配列Nの要素でループする(ステップ1503)。ループ内では、まず、Nm[i]とN[j]が同一かチェックし(ステップ1504)、同一なら次のノードにループを進める。同一でなければ、運賃表(120)にNm[i],N[j]間結果があるかチェックし(ステップ1505)、あるなら次のノードにループを進める。なければ、ノードN[j]が所属するゾーンでループする(ステップ1506)。まず、変数mjに現在のループでのゾーンzjの主ノードIDを代入する(ステップ1507)。次に、N[j]とmjが同一かチェックし(ステップ1508)、同一ならゾーンのzjのループを抜ける。同一でなければ、Nm[i]がzjゾーンの範囲内ノードかチェックし(ステップ1509)、範囲内ノードなら次のノードにループを進める。zjループを抜けたら、まず、Nm[i],N[j]間最安経路探索処理を実行する(ステップ1510)。この処理の詳細は図16で説明する。
j、iのループを抜けたら、今度は、i,jそれぞれ配列Nの要素でループする(ステップ1511、1512)。このとき、i<jとなるようにループを回す。ループ内では、まず、運賃表(120)にN[i],N[j]間結果があるか調べ(ステップ1513)、あるなら、次のノードにループを進める。なければ、変数fにN[i]を、変数tにN[j]を代入する(ステップ1514)。次に、N[j]がN[i]所属ゾーン範囲内ノードなら(ステップ1515)、変数fにN[i]所属ゾーンの主ノードIDを代入する(ステップ1516)。次に、N[i]がN[j]所属ゾーン範囲内ノードなら(ステップ1517)、変数tにN[j]所属ゾーンの主ノードIDを代入する(ステップ1518)。
次に、運賃表(120)にf,t間結果があるか調べる(ステップ1519)。もしその結果があるなら、そのf,t間とt,f間の運賃(303)を、N[i],N[j]間とN[j],N[i]間の運賃表(120)のレコードの運賃(303)にコピーし(ステップ1520)、次のノードにループを進める。このコピー処理は、図6の特定区間運賃更新処理の終了後に改めて行っても良い。特定区間運賃とゾーンによる発着ノードの入れ替えはどちらが優先されるかは、予め決められているものとし、ゾーンのほうが優先されるなら、図6で改めてコピー処理を行うものとする。ステップ1519で当該結果がなければ、N[i],N[j]間最安経路探索処理を実行する(ステップ1521)。この処理の詳細は図16で説明する。全てのループを抜けたら、終了する。
上記の図15の処理により、任意の全ノード間の最安経路が運賃表(120)に設定された。
図16は、図15中の指定ノード間最安経路探索処理(ステップ1510,1521)の詳細を表すフローである。まず、指定された探索対象ノード間の始発ノードIDを変数fに、終着ノードIDを変数tに代入する(ステップ1601)。次に、f,t間のエッジ距離最短エッジがエッジ距離最短エッジテーブル(118)内にあるか調べ(ステップ1602)、なければ到達不可能なので処理を終了する。次に、当該f,t間エッジ距離最短経路を初期解として運賃表(120)に追加する(ステップ1603)。ここで、経路に対する運賃(303)は、後述する図18の経路運賃算出処理によって算出する。以下、経路に対する運賃を求めるときは同様である。次に、区分内最短エッジテーブル(119)内にあるf,t間の全ての区分内最短エッジに対して、それぞれ現在の運賃表(120)の最安経路と運賃を比較し、最安の経路で運賃表(120)を更新する(ステップ1604)。
次に、以下の条件で、区分内最短エッジID配列Ebdを構成する(ステップ1605)。まず、fが境界ノードでない場合、全境界ノード配列をAとする。fが境界ノードの場合は、Aの要素はfのみとする。次に、tが境界ノードでない場合、全境界ノード配列をPとする。tが境界ノードの場合は、Pの要素はtのみとする。そして、以下の(1)〜(3)の条件を満たすエッジIDを配列Ebdに追加する。
(1) Aの各要素aに対して、f発a着の区分内最短エッジで、発着含めtを通過しないもの
(2) Pの各要素pに対して、p発t着の区分内最短エッジで、発着含めfを通過しないもの
(3) 任意の境界ノード間区分内最短エッジで、発着含めfとtを通過しないもの
ここで、合成区分配列KMが設定されている場合は、KM内での最高優先度の区分以外の区分内最短エッジは除外する。なぜなら、図14の区分内最短経路探索において、KMの最高優先度区分での最短経路は、KMの全ての区分のエッジを通ることが許されている。すなわち、最高優先度区分の区分内最短経路は合成区分KMにおける最短経路となっているからである。
次に、以下の条件で、t到着の区分内最短エッジID配列Etを構成する(ステップ1606)。まず、Etにはステップ1605での条件(2)のエッジを格納する。もしEtの要素数が、予め定めてある一定数以上になった場合、Etには区分内最短エッジではなく、t到着の全ての連結エッジを格納する。それでも数が多い場合には、Etを空にする。次に、配列Rを空で初期化し(ステップ1607)、再帰探索ルーチンを呼び出す(ステップ1608)。なお、上記配列Ebd、Et、および経路Rは、再帰探索ルーチンから参照可能なグローバル変数とする。探索が終了したら、t,f間の最安経路をf,t間の運賃表(120)の逆方向経路で追加し(ステップ1609)、処理を終了する。
次に、再帰探索ルーチンについて説明する。まず、経路Rがtに到達していたら(ステップ1610)、経路Rの運賃と運賃表(120)の最安運賃とを比較し(ステップ1617)、経路Rの運賃が安くなっていたら、運賃表(120)を経路Rで更新して(ステップ1618)、リターンする。ステップ1610で経路Rがtに到達していないときは、配列Cに、経路Rと連結可能なEbdのエッジIDの候補を全て代入する(ステップ1611)。ここで、連結可能とは、経路Rの現在の終着ノードを出発し、経路Rの最終エッジと異なる区分とサブ区分のエッジで、かつ、経路Rの通過ノードを再度経由しないものを指す(経路Rが空なら、fを出発するEbdの全エッジを候補とする)。次に、配列Cの要素でループする(ステップ1612)。ループ内ではまず、経路RにC[i]を連結する(ステップ1613)。次に、枝狩り可能であるかを判定する(ステップ1614)。この判定は、図17の枝狩り判定処理の結果に従う。枝狩りが不可能な場合は、再帰探索を呼び出す(ステップ1615)。次に、経路Rから最終エッジを削除する(ステップ1616)。ループを抜けたらリターンする。
図17は、図16のステップ1614の枝狩り判定処理を表すフローである。この処理は、現在の経路Rをこれ以上延長しても、探索対象の区間の現在の最安経路より安い経路となり得ないことを判定する。
まず、変数bretにtrueを代入する(ステップ1701)。この変数bretの値は、判定結果として呼び出し元に通知される。次に、配列R2に経路Rをコピーする(ステップ1702)。次に、R2の要素数が1かチェックする(ステップ1703)。もし要素数が1なら、ステップ1710に進み、そうでないなら以下に進む。
次に、配列R2の始発終着ノードと同一始発終着のエッジ距離最短エッジをエッジ距離最短エッジテーブル(118)内から探し、その経路を配列Sに代入する(ステップ1704)。次に、経路R2のエッジ距離がSのエッジ距離を超えていたら(ステップ1705)、以下に進む。次に、経路R2の運賃距離がSの運賃距離を超えていたら(ステップ1706)、以下に進む。次に、配列Krに経路R2の通過区分IDを、配列KsにSの通過区分IDを、それぞれ代入する(ステップ1707)。ここでは、Kr,Ksそれぞれに対して、図12で算出された合成区分配列KMの要素を含んでいる場合には、それら全ての区分をKM通過とみなして、KMに置き換える。次に、KsがKrと同一なら(ステップ1708)、処理を終了する。この場合、bretはtrueなので枝狩り可能が通知される。ステップ1705、1706、1708でそれぞれ条件を満たさなかった場合は、R2から先頭エッジを削除し(ステップ1709)、ステップ1703に戻る。
ステップ1703でR2の要素数が1のときは、図13の運賃換算情報比較処理で枝狩り判定可能が設定されたかを調べ(ステップ1710)、RがKMを通過するかを調べ(ステップ1711)、現在の最安経路がKMを通過しR通過区分のみを通過しているかを調べる(ステップ1712)。この処理でも、合成区分KMは1つの区分として取り扱う。図12の運賃換算情報比較処理によって、枝狩り可能が設定されている場合、KMを通過する任意の区分配列A,Bに対して「A⊆B」が成り立っていれば、「A表≦B表」も成り立つことが保証されているので、Rの運賃が最安運賃を超えた場合は、その後どのような経路をたどっても最安運賃以下になることはない。上記の条件のうち1つでも条件を満たさない場合は、ステップ1720に進み、それ以外の場合は、以下に進む。
次に、配列Etが空かチェックする(ステップ1713)。Etは図16のステップ1606で構成された配列で、経路の終着ノードを到着ノードとする全てのエッジが格納されている。Etに要素がある場合、Etの要素でループする(ステップ1714)。ループ内ではまず、RにEt[i]を追加する(ステップ1715)。次に、Rの運賃と最安運賃を比較し(ステップ1716)、最安運賃がRの運賃以上なら、bretにfalseを代入して(ステップ1718)、終了する。この場合、呼び出し元には枝狩り不可能が通知される。最安運賃よりRの運賃が大きいときは、ステップ1715で追加したRの最終エッジを削除して(ステップ1717)、ループを進める。ループを抜けたら、処理を終了する。この場合、呼び出し元には枝狩り可能が通知される。ステップ1713でEtが空だった場合は、Rの運賃と現在の最安運賃を比較し(ステップ1719)、Rの運賃が最安運賃以下ならbretにfalseを代入し(ステップ1720)、処理を終了する。bretがtrueなら枝狩り可能、falseなら枝狩り不可能が呼び出し元に通知される。
図18は、図16のステップ1603等で利用する経路運賃算出処理を表すフローである。まず、配列Rに運賃を算出する経路を代入する(ステップ1801)。次に、変数costを0で初期化する(ステップ1802)。次に、経路配列Rの要素が空かチェックする(ステップ1803)。経路配列Rが空なら処理を終了する。次に、配列Kに経路配列Rの通過区分IDを代入する(ステップ1804)。ここでもし、経路配列Rが図12の区分合成処理で作成された合成区分配列KM内の区分を通過する場合は、KMの全区分を通過するものとしてKにKMを追加する。次に、変数edistに経路配列Rの総エッジ距離を代入する(ステップ1805)。次に、edistがKの運賃距離適用範囲(運賃距離適用範囲情報(114)を参照する)内なら(ステップ1806)、edistに経路配列Rの総運賃距離を代入する(ステップ1807)。次に、Kの運賃換算情報に距離edistを照らし合わせ、costに運賃を代入し(ステップ1808)、処理を終了する。処理終了時のcostの値が、指定された経路の運賃となる。
図19は、図6中の特定区間運賃更新処理(ステップ611)を表すフローである。まず、特定区間運賃情報(116)を更新フラグ(229)順でソートする(ステップ1901)。これは、後述の再帰処理による更新が、直接指定された運賃に対して優先されるかどうかに関わるもので、その優先順位は予め決められているものとして、降順昇順のどちらでソートするかも決められているものとする。次に、特定区間運賃更新情報でループする(ステップ1902)。ループ内ではまず、変数iに特定区間の始発ノードID(226)を、変数jに終着ノードID(227)を、変数nにi,j間更新運賃(228)を、変数fに更新フラグ(229)を代入する(ステップ1903)。次に、i,j,n,fを引数にして再帰関数を呼び出す(ステップ1904)。ループを抜けたら処理を終了する。
次に、再帰関数ルーチンについて説明する。まず、与えられた引数から、変数iに特定区間の始発ノードIDを、変数jに終着ノードIDを、変数nにi,j間更新運賃を、変数fに更新フラグを代入する(ステップ1905)。次に、変数oにi,j間の運賃表(120)での運賃(303)を代入する(ステップ1906)。次に、oがn未満で(ステップ1907)、更新フラグfで強制更新が指定されていたら(ステップ1908)、i,j間、j,i間運賃を更新運賃nに更新する(ステップ1909)。次に、更新情報をログに出力する(ステップ1910)。ここでは、運賃が更新されていない場合でもログに出力するものとする。ログ出力が終わったら、処理を終了する。
ステップ1907でoがn以上だった場合は、さらにoとnを比較し(ステップ1911)、o=nの場合はステップ1910に進み、ログを出力して、処理を終了する。o>nだった場合は、i,j間、j,i間運賃を更新運賃nに更新する(ステップ1912)。次に、更新フラグfで再帰更新が指定されているかチェックする(ステップ1913)。指定されていなければ、ステップ1910に進み、ログ出力後、処理を終了する。
ステップ1913で再帰更新が指定されている場合は、配列Njに、jとエッジでつながっている全ノードIDを代入する(ステップ1914)。次に、Njの要素でループする(ステップ1915)。ループ内ではまず、i,Nj[p]間の最安経路がノードjを通過するか調べる(ステップ1916)。通過しない場合は、引数にi,Nj[p],n,fを指定して再帰関数を呼び出す(ステップ1917)。ループを抜けたら、配列Niにiの隣接ノードIDを代入する(ステップ1918)。次に、Niの要素でループする(ステップ1919)。ループ内ではまず、Ni[q],j間の最安経路がノードiを通過するか調べる(ステップ1920)。通過しない場合は、引数にNi[q],j,n,fを指定して再帰関数を呼び出す(ステップ1921)。ループを抜けたら、i,j間の更新ログを出力して処理を終了する。
図20は、図4中の出力処理(ステップ403)を表すフローである。まず、運賃表(120)を出力する(ステップ2001)。このときの出力形式では、経路を出力するかどうかは任意である。また、始発と終着の運賃は同一であるため、ノードIDの小さいほうから大きいほうへの区間のみを出力してもよい。次に、指定があれば、i,j間の最安経路を出力する(ステップ2002)。次に、指定があれば、特定区間運賃更新ログを出力し(ステップ2003)、処理を終了する。
101…入力装置、102…表示装置、103…出力装置、104…処理装置、105…プログラム、106…入力処理部、107…運賃表作成処理部、108…出力処理部、109…記憶装置、110…ノード情報、111…エッジ情報、112…運賃換算情報、113…エッジ修正情報、114…運賃距離適用範囲情報、115…ゾーン情報、116…特定区間運賃情報、117…連結エッジテーブル、118…エッジ距離最短エッジテーブル、119…区分内最短エッジテーブル、120…運賃表、121…特定区間運賃更新ログ。

Claims (15)

  1. 少なくとも入出力装置と処理装置と記憶装置を有し、交通機関の出発点と到達点となる各ノードに対し、全ての2ノード間の最安運賃を表す運賃表を作成する運賃表作成システムであって、
    前記各ノードを特定するノード情報を格納する手段と、
    2つのノード間を双方向で移動可能な場合の距離と、その移動にかかる運賃を算出する際の運賃区分を表す区分IDとを含むエッジ情報を記憶する手段と、
    同一区分内の1つ以上のエッジを通るときの運賃を、通るエッジの距離合計から算出するための、区分毎の運賃換算情報であって、各区分毎に優先度が付けられている運賃換算情報を記憶する手段と、
    単一区分内のエッジを通る場合はその区分の運賃換算情報を用い、複数の区分にまたがってエッジを通る場合は通過したエッジの区分の中で優先度の最も高い区分の運賃換算情報を用いて、通った全経路の合計距離によって運賃を算出する経路運賃算出手段と、
    任意の2ノード間の最短経路を、指定されたエッジ集合のエッジ情報から求める最短経路探索手段と、
    前記最短経路探索手段によって、全エッジ情報のエッジ集合を対象として求めた最短経路を1つのエッジとするエッジ距離最短エッジと各区分のエッジ情報のエッジ集合を対象とした最短経路を1つのエッジとする区分内最短エッジとを用いて、任意の2ノード間の運賃が最安となる、同一ノードを高々1回通る経路を探索する最安経路探索手段と、
    前記最安経路探索手段により、全ての2ノード間で運賃が最安の経路を探索し、全2ノード間の最安運賃を格納する運賃表を作成する運賃表作成手段と
    を備えることを特徴とする運賃表作成システム。
  2. 請求項1に記載の運賃表作成システムにおいて、
    前記運賃換算情報は、複数の区分に属するエッジを通る経路の運賃を求めるための複合区分の運賃換算情報を含み、
    前記経路運賃算出手段は、複数区分を通る経路の運賃算出には、該複合区分の運賃換算情報を参照して運賃を算出することを特徴とする運賃表作成システム。
  3. 請求項1に記載の運賃表作成システムにおいて、
    前記エッジ情報には、運賃算出時に前記運賃換算情報と付き合わせるための運賃距離をエッジ距離とは別に設定することを特徴とする運賃表作成システム。
  4. 請求項3に記載の運賃表作成システムにおいて、
    前記運賃換算情報と付き合わせる距離として、前記運賃距離の合計を用いるか前記エッジ距離の合計を用いるかを示す運賃距離適用範囲情報を記憶する手段をさらに備え、
    前記経路運賃算出手段は、運賃算出の際、前記運賃距離適用範囲情報に応じて前記運賃距離の合計または前記エッジ距離の合計を用いて運賃を算出することを特徴とする運賃表作成システム。
  5. 請求項1に記載の運賃表作成システムにおいて、
    区分内のエッジを通り、始発ノード以外のノードを高々1回通って終着ノードに到達可能な経路が複数存在するとき、その複数経路からなる閉路を構成するエッジを、異なるサブ区分のエッジにすることで、区分を分割するエッジ区分分割手段をさらに備え、
    該エッジ区分分割手段により区分を分割することで、前記最短経路探索手段によって作成された区分内最短エッジが、エッジ距離と運賃距離とをそれぞれ用いた場合に同一経路となるようにすることを特徴とする運賃表作成システム。
  6. 請求項1に記載の運賃表作成システムにおいて、
    複数の区分の組み合わせからなる区分集合に対して、その任意の要素が表す区分のエッジのエッジ距離と運賃距離が同一で、該区分集合の任意の部分集合に対する運賃換算情報が、該部分集合内の最高優先度の区分の運賃換算情報と同一で、該部分集合にない任意の区分を通過する経路が該部分集合内の区分をどのように通過しても、運賃算出に利用する運賃換算情報が同一であるとき、該部分集合のそれらの区分を合成区分として扱えるようにする区分合成手段をさらに備えることを特徴とする運賃表作成システム。
  7. 請求項1に記載の運賃表作成システムにおいて、
    前記ノード情報は、ノードから1つのエッジを通って移動可能なノードが1つしかない末端ノードと、3つ以上のノードに移動可能な交差ノードと、異なる区分およびサブ区分のエッジが複数接続している境界ノードと、それら以外の一般ノードとに分類するノード種別情報を有し、
    末端ノードと交差ノードと境界ノードをあわせた特殊ノードに対して、特殊ノードを出発してエッジを順にたどって次の特殊ノードに到達する経路を1つの連結エッジとし、またそのとき通過した任意の一般ノード間に対する連結エッジを作成する連結エッジ作成手段をさらに備え、
    該連結エッジ作成手段によって作成された連結エッジ集合を、任意ノード間の最短経路探索手段に適用し、さらにその最短経路探索手段によって得られた最短経路からなる新たな特殊ノード間の最短経路の連結エッジ集合を、エッジ距離最短エッジと区分内最短エッジとして任意2ノード間の最安経路探索手段に利用することを特徴とする運賃表作成システム。
  8. 請求項1に記載の運賃表作成システムにおいて、
    全区分を対象とする最短経路探索の結果を用いて、指定された出発ノードと折り返しノードとの間の最短距離と折り返しノードと到着ノードとの間の最短距離との差の絶対値をエッジ距離と運賃距離でそれぞれ求め、エッジ距離で最短距離の長いほうのノード間が1本のエッジとなっている場合に、そのエッジの出発ノードと到着ノードを、出発ノードと折り返しノードまたは折り返しノードと到着ノードに、修正するエッジ修正手段をさらに備えることを特徴とする運賃表作成システム。
  9. 請求項1に記載の運賃表作成システムにおいて、
    特定の始発ノードと終着ノードとの間の運賃を所定の運賃に更新するための特定区間運賃情報を記憶する手段と、
    前記最安経路探索手段によって作成された運賃表に対して、該特定区間運賃情報にしたがって運賃を更新する特定区間運賃更新手段と
    をさらに備えることを特徴とする運賃表作成システム。
  10. 請求項9に記載の運賃表作成システムにおいて、
    前記特定区間運賃情報は、前記最安運賃経路探索手段で算出された経路の運賃より安い運賃が指定された場合のみ運賃を更新するか、高くなっても必ず更新するかを指定する更新フラグを有し、
    前記特定区間運賃更新手段は、該更新フラグにしたがって運賃更新処理を行うことを特徴とする運賃表作成システム。
  11. 請求項9に記載の運賃表作成システムにおいて、
    前記更新フラグは、再帰モードを指定できるフラグであり、
    前記特定区間運賃更新手段は、前記更新フラグで再帰モードが指定され、前記最安運賃経路探索手段で算出された運賃より安い運賃が指定されていた場合、始発ノードと終着ノードの隣接ノードとの間の最安経路が終着ノードを通過しないとき、前記特定区間運賃情報で指定された運賃を、始発ノードと終着ノードの隣接ノードとの間の運賃の上限として再帰的に特定区間運賃更新手段を適用し、終着ノードと始発ノードの隣接ノードとの間の最安経路が始発ノードを通過しないとき、前記特定区間運賃情報で指定された運賃を、終着ノードと始発ノードの隣接ノードとの間の運賃の上限として再帰的に特定区間運賃更新手段を適用するものであることを特徴とする運賃表作成システム。
  12. 請求項1に記載の運賃表作成システムにおいて、
    ゾーンの代表となる1つの主ノードを特定する情報と、該主ノードからの適用距離範囲を示す情報と、該主ノードから該適用距離範囲内にあるノードを特定する範囲内ノード情報とを有するゾーン情報を記憶する手段をさらに備え、
    前記ノード情報は、該ノードが所属するゾーンを1つまたは複数指定する情報を含み、
    前記最安経路探索手段は、ゾーン内の任意のノードと該ゾーンの範囲内ノード情報で指定されている所定ノードとの間の最安経路およびその運賃を、該ゾーンの主ノードと前記所定ノードとの間の最安経路およびその運賃に置き換えることを特徴とする運賃表作成システム。
  13. 請求項1に記載の運賃表作成システムにおいて、
    前記最安経路探索手段は、最安経路探索途中の経路の部分経路に対して、当該部分経路と始発ノードおよび終着ノードが同一のエッジ距離最短経路のエッジ距離と運賃距離が、共に前記部分経路の距離未満で、かつ、前記部分経路の通過区分が前記エッジ距離最短経路の通過区分と同一の場合、前記最安経路探索途中の経路を延長した経路の探索を行わないようにすることを特徴とする運賃表作成システム。
  14. 請求項6に記載の運賃表作成システムにおいて、
    前記区分合成手段は、合成されていない任意の区分の組み合わせからなる区分集合に対して、前記合成区分と前記区分集合の任意の部分集合とを組み合わせた区分に対する前記運賃換算情報の運賃が、前記合成区分と前記区分集合とを組み合わせた区分における同一距離の前記運賃換算情報の運賃より高くならないとき、枝狩り判定可能を返す運賃換算情報比較手段を備え、
    前記最安経路探索手段は、枝狩り判定可能の場合、最安経路探索途中の経路と現時点の暫定の最安経路が前記合成区分を通過し、該最安経路が該最安経路探索途中の経路の通過区分のみを通過する場合に、該最安経路探索途中の経路の運賃が該最安経路の運賃を越える場合には、前記最安経路探索途中の経路を延長した経路の探索を行わないようにすることを特徴とする運賃表作成システム。
  15. 請求項14に記載の運賃表作成システムにおいて、
    前記最安経路探索手段による最安経路探索の打ち切りを行う条件を、最安経路探索途中の経路と現時点の暫定の最安経路の運賃の比較から、最安経路探索途中の経路と探索対象の終着ノードに向かう各エッジとを合わせた経路の運賃と探索途中時点での最安経路運賃との比較に変更できることを特徴とする運賃表作成システム。
JP2009215333A 2009-09-17 2009-09-17 運賃表作成システム Pending JP2011065406A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009215333A JP2011065406A (ja) 2009-09-17 2009-09-17 運賃表作成システム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009215333A JP2011065406A (ja) 2009-09-17 2009-09-17 運賃表作成システム

Publications (1)

Publication Number Publication Date
JP2011065406A true JP2011065406A (ja) 2011-03-31

Family

ID=43951583

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009215333A Pending JP2011065406A (ja) 2009-09-17 2009-09-17 運賃表作成システム

Country Status (1)

Country Link
JP (1) JP2011065406A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2012119736A (ja) * 2010-11-29 2012-06-21 Mitsubishi Electric Corp 最短経路演算装置、最短経路演算方法及び検査行列生成方法
CN111383043A (zh) * 2018-12-29 2020-07-07 携程旅游网络技术(上海)有限公司 运价计算方法及系统

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2012119736A (ja) * 2010-11-29 2012-06-21 Mitsubishi Electric Corp 最短経路演算装置、最短経路演算方法及び検査行列生成方法
CN111383043A (zh) * 2018-12-29 2020-07-07 携程旅游网络技术(上海)有限公司 运价计算方法及系统
CN111383043B (zh) * 2018-12-29 2024-03-22 携程旅游网络技术(上海)有限公司 运价计算方法及系统

Similar Documents

Publication Publication Date Title
Morabit et al. Machine-learning–based column selection for column generation
Bouros et al. Dynamic pickup and delivery with transfers
Hamacher et al. Multicriteria network location problems with sum objectives
CN108444486A (zh) 一种导航路线排序方法和装置
Raghunathan et al. Seamless multimodal transportation scheduling
CN113503886A (zh) 一种大规模复杂路网条件下的快速径路搜索优化方法
CN110222890A (zh) 一种车辆与无人机物流配送的双层路径优化方法及系统
Phan et al. Fast public transit routing with unrestricted walking through hub labeling
Wang et al. Constrained route planning over large multi-modal time-dependent networks
Zuo et al. High-capacity ride-sharing via shortest path clustering on large road networks
CN102210128A (zh) 路径计算顺序决定方法、程序以及计算装置
Alaia et al. Optimization of the multi-depot & multi-vehicle pickup and delivery problem with time windows using genetic algorithm
JP2011065406A (ja) 運賃表作成システム
Verbas et al. Finding least cost hyperpaths in multimodal transit networks: Methodology, algorithm, and large-scale application
KR102125472B1 (ko) 공차시간 감소를 위한 추천경로 안내 시스템 및 그 방법
CN113743679B (zh) 基于赋权图和多旅行商的高铁路网维修调度方法及设备
CN112347216B (zh) 一种基于动态路网的初始线路搜索方法
US20150051834A1 (en) Ground-transportation network representation
Lehoux et al. Mode personalization in trip-based transit routing
Tang et al. Dual Bounds from Decision Diagram-Based Route Relaxations: An Application to Truck-Drone Routing
Aissat et al. Meeting locations in real-time ridesharing problem: A buckets approach
KR101699675B1 (ko) 육상 운송 네트워크 표시
Guo et al. Algorithms for online car-sharing problem
Vanhove Alternative routing algorithms for road networks
US20240159546A1 (en) Methods, devices for real-time nearest neighbour search on a road system