(57)【要約】【課題】複数の運賃区分が設定されている交通網において、全ノード間の最安経路とその運賃を効率よく算出する運賃表作成システムを提供することを目的とする。【解決手段】同一距離を与えたときに運賃換算情報の運賃の大小関係が確定する区分を合成して１つの区分としてまとめ、特殊ノード間の最短経路を全区分と各区分ごとでそれぞれ算出し、全区分と各区分ごとの一般ノード間の最短経路を、一般ノードとそれに隣接する特殊ノード間の経路と、特殊ノード間で算出した最短経路の組み合わせで構成される経路の中から算出し、最終的に区分間移動の経路を、先に算出した各区分での境界ノード間最短経路の組み合わせで探索する。探索途中の経路が現時点での最安経路の運賃を上回ることが確定した場合には、そこからの延長経路に対する探索を打ち切ることで、最安経路探索にかかる計算量を大幅に削減し運賃を効率よく算出する。【選択図】  図１
2011065406.tif 000002
【特許請求の範囲】
【請求項１】
少なくとも入出力装置と処理装置と記憶装置を有し、交通機関の出発点と到達点となる各ノードに対し、全ての２ノード間の最安運賃を表す運賃表を作成する運賃表作成システムであって、
前記各ノードを特定するノード情報を格納する手段と、
２つのノード間を双方向で移動可能な場合の距離と、その移動にかかる運賃を算出する際の運賃区分を表す区分IDとを含むエッジ情報を記憶する手段と、
同一区分内の１つ以上のエッジを通るときの運賃を、通るエッジの距離合計から算出するための、区分毎の運賃換算情報であって、各区分毎に優先度が付けられている運賃換算情報を記憶する手段と、
単一区分内のエッジを通る場合はその区分の運賃換算情報を用い、複数の区分にまたがってエッジを通る場合は通過したエッジの区分の中で優先度の最も高い区分の運賃換算情報を用いて、通った全経路の合計距離によって運賃を算出する経路運賃算出手段と、
任意の２ノード間の最短経路を、指定されたエッジ集合のエッジ情報から求める最短経路探索手段と、
前記最短経路探索手段によって、全エッジ情報のエッジ集合を対象として求めた最短経路を１つのエッジとするエッジ距離最短エッジと各区分のエッジ情報のエッジ集合を対象とした最短経路を１つのエッジとする区分内最短エッジとを用いて、任意の２ノード間の運賃が最安となる、同一ノードを高々１回通る経路を探索する最安経路探索手段と、
前記最安経路探索手段により、全ての２ノード間で運賃が最安の経路を探索し、全２ノード間の最安運賃を格納する運賃表を作成する運賃表作成手段と
を備えることを特徴とする運賃表作成システム。
【請求項２】
請求項１に記載の運賃表作成システムにおいて、
前記運賃換算情報は、複数の区分に属するエッジを通る経路の運賃を求めるための複合区分の運賃換算情報を含み、
前記経路運賃算出手段は、複数区分を通る経路の運賃算出には、該複合区分の運賃換算情報を参照して運賃を算出することを特徴とする運賃表作成システム。
【請求項３】
請求項１に記載の運賃表作成システムにおいて、
前記エッジ情報には、運賃算出時に前記運賃換算情報と付き合わせるための運賃距離をエッジ距離とは別に設定することを特徴とする運賃表作成システム。
【請求項４】
請求項３に記載の運賃表作成システムにおいて、
前記運賃換算情報と付き合わせる距離として、前記運賃距離の合計を用いるか前記エッジ距離の合計を用いるかを示す運賃距離適用範囲情報を記憶する手段をさらに備え、
前記経路運賃算出手段は、運賃算出の際、前記運賃距離適用範囲情報に応じて前記運賃距離の合計または前記エッジ距離の合計を用いて運賃を算出することを特徴とする運賃表作成システム。
【請求項５】
請求項１に記載の運賃表作成システムにおいて、
区分内のエッジを通り、始発ノード以外のノードを高々１回通って終着ノードに到達可能な経路が複数存在するとき、その複数経路からなる閉路を構成するエッジを、異なるサブ区分のエッジにすることで、区分を分割するエッジ区分分割手段をさらに備え、
該エッジ区分分割手段により区分を分割することで、前記最短経路探索手段によって作成された区分内最短エッジが、エッジ距離と運賃距離とをそれぞれ用いた場合に同一経路となるようにすることを特徴とする運賃表作成システム。
【請求項６】
請求項１に記載の運賃表作成システムにおいて、
複数の区分の組み合わせからなる区分集合に対して、その任意の要素が表す区分のエッジのエッジ距離と運賃距離が同一で、該区分集合の任意の部分集合に対する運賃換算情報が、該部分集合内の最高優先度の区分の運賃換算情報と同一で、該部分集合にない任意の区分を通過する経路が該部分集合内の区分をどのように通過しても、運賃算出に利用する運賃換算情報が同一であるとき、該部分集合のそれらの区分を合成区分として扱えるようにする区分合成手段をさらに備えることを特徴とする運賃表作成システム。
【請求項７】
請求項１に記載の運賃表作成システムにおいて、
前記ノード情報は、ノードから１つのエッジを通って移動可能なノードが１つしかない末端ノードと、３つ以上のノードに移動可能な交差ノードと、異なる区分およびサブ区分のエッジが複数接続している境界ノードと、それら以外の一般ノードとに分類するノード種別情報を有し、
末端ノードと交差ノードと境界ノードをあわせた特殊ノードに対して、特殊ノードを出発してエッジを順にたどって次の特殊ノードに到達する経路を１つの連結エッジとし、またそのとき通過した任意の一般ノード間に対する連結エッジを作成する連結エッジ作成手段をさらに備え、
該連結エッジ作成手段によって作成された連結エッジ集合を、任意ノード間の最短経路探索手段に適用し、さらにその最短経路探索手段によって得られた最短経路からなる新たな特殊ノード間の最短経路の連結エッジ集合を、エッジ距離最短エッジと区分内最短エッジとして任意２ノード間の最安経路探索手段に利用することを特徴とする運賃表作成システム。
【請求項８】
請求項１に記載の運賃表作成システムにおいて、
全区分を対象とする最短経路探索の結果を用いて、指定された出発ノードと折り返しノードとの間の最短距離と折り返しノードと到着ノードとの間の最短距離との差の絶対値をエッジ距離と運賃距離でそれぞれ求め、エッジ距離で最短距離の長いほうのノード間が１本のエッジとなっている場合に、そのエッジの出発ノードと到着ノードを、出発ノードと折り返しノードまたは折り返しノードと到着ノードに、修正するエッジ修正手段をさらに備えることを特徴とする運賃表作成システム。
【請求項９】
請求項１に記載の運賃表作成システムにおいて、
特定の始発ノードと終着ノードとの間の運賃を所定の運賃に更新するための特定区間運賃情報を記憶する手段と、
前記最安経路探索手段によって作成された運賃表に対して、該特定区間運賃情報にしたがって運賃を更新する特定区間運賃更新手段と
をさらに備えることを特徴とする運賃表作成システム。
【請求項１０】
請求項９に記載の運賃表作成システムにおいて、
前記特定区間運賃情報は、前記最安運賃経路探索手段で算出された経路の運賃より安い運賃が指定された場合のみ運賃を更新するか、高くなっても必ず更新するかを指定する更新フラグを有し、
前記特定区間運賃更新手段は、該更新フラグにしたがって運賃更新処理を行うことを特徴とする運賃表作成システム。
【請求項１１】
請求項９に記載の運賃表作成システムにおいて、
前記更新フラグは、再帰モードを指定できるフラグであり、
前記特定区間運賃更新手段は、前記更新フラグで再帰モードが指定され、前記最安運賃経路探索手段で算出された運賃より安い運賃が指定されていた場合、始発ノードと終着ノードの隣接ノードとの間の最安経路が終着ノードを通過しないとき、前記特定区間運賃情報で指定された運賃を、始発ノードと終着ノードの隣接ノードとの間の運賃の上限として再帰的に特定区間運賃更新手段を適用し、終着ノードと始発ノードの隣接ノードとの間の最安経路が始発ノードを通過しないとき、前記特定区間運賃情報で指定された運賃を、終着ノードと始発ノードの隣接ノードとの間の運賃の上限として再帰的に特定区間運賃更新手段を適用するものであることを特徴とする運賃表作成システム。
【請求項１２】
請求項１に記載の運賃表作成システムにおいて、
ゾーンの代表となる１つの主ノードを特定する情報と、該主ノードからの適用距離範囲を示す情報と、該主ノードから該適用距離範囲内にあるノードを特定する範囲内ノード情報とを有するゾーン情報を記憶する手段をさらに備え、
前記ノード情報は、該ノードが所属するゾーンを１つまたは複数指定する情報を含み、
前記最安経路探索手段は、ゾーン内の任意のノードと該ゾーンの範囲内ノード情報で指定されている所定ノードとの間の最安経路およびその運賃を、該ゾーンの主ノードと前記所定ノードとの間の最安経路およびその運賃に置き換えることを特徴とする運賃表作成システム。
【請求項１３】
請求項１に記載の運賃表作成システムにおいて、
前記最安経路探索手段は、最安経路探索途中の経路の部分経路に対して、当該部分経路と始発ノードおよび終着ノードが同一のエッジ距離最短経路のエッジ距離と運賃距離が、共に前記部分経路の距離未満で、かつ、前記部分経路の通過区分が前記エッジ距離最短経路の通過区分と同一の場合、前記最安経路探索途中の経路を延長した経路の探索を行わないようにすることを特徴とする運賃表作成システム。
【請求項１４】
請求項６に記載の運賃表作成システムにおいて、
前記区分合成手段は、合成されていない任意の区分の組み合わせからなる区分集合に対して、前記合成区分と前記区分集合の任意の部分集合とを組み合わせた区分に対する前記運賃換算情報の運賃が、前記合成区分と前記区分集合とを組み合わせた区分における同一距離の前記運賃換算情報の運賃より高くならないとき、枝狩り判定可能を返す運賃換算情報比較手段を備え、
前記最安経路探索手段は、枝狩り判定可能の場合、最安経路探索途中の経路と現時点の暫定の最安経路が前記合成区分を通過し、該最安経路が該最安経路探索途中の経路の通過区分のみを通過する場合に、該最安経路探索途中の経路の運賃が該最安経路の運賃を越える場合には、前記最安経路探索途中の経路を延長した経路の探索を行わないようにすることを特徴とする運賃表作成システム。
【請求項１５】
請求項１４に記載の運賃表作成システムにおいて、
前記最安経路探索手段による最安経路探索の打ち切りを行う条件を、最安経路探索途中の経路と現時点の暫定の最安経路の運賃の比較から、最安経路探索途中の経路と探索対象の終着ノードに向かう各エッジとを合わせた経路の運賃と探索途中時点での最安経路運賃との比較に変更できることを特徴とする運賃表作成システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、交通機関の交通網利用時の運賃算出に関し、特に運賃が最安となる経路を探索して運賃表を作成する運賃表作成システムに関する。
【背景技術】
【０００２】
大都市圏内の鉄道網のように、多数の路線によって構成される複雑なネットワークでは、乗客は、乗車駅から降車駅までの経路を複数の候補の中から選択して乗車することができる。またこのとき、切符の発券業務の簡略化や輸送量の振り分けなどを考慮し、どの経路を通っても、最も安い経路を通ったものとして運賃を設定するようになっている。
【０００３】
運賃は基本的に長距離を乗車するほど高くなっていくので、２駅間の最安経路を算出するには、ネットワーク上の最短経路探索手法を利用することが考えられる。この場合、例えば、非特許文献１に記載のダイクストラ法やワーシャルフロイド法といった最短経路探索アルゴリズムを利用することができる。これらのアルゴリズムは、駅をノード、駅間を結ぶ線路をエッジとするグラフとして構築し、そのグラフ上のノード間の最短経路を効率よく探索するものである。ダイクストラ法は、指定した出発ノードと任意ノード間の最短経路を探索するのに対して、ワーシャルフロイド法は、全ノード間の最短経路を探索するアルゴリズムである。また、A*アルゴリズムは、ダイクストラ法を拡張したもので、各ノードから目的ノードまでの最短距離の推定値が分かっている場合に、指定された２ノード間の最短経路探索を効率よく行うアルゴリズムである。
【０００４】
特許文献１に記載の経路探索方法では、指定された出発駅と到着駅間の経路を探索する際に、路線（エッジ）が３本以上接続している駅を交差駅とし、２つの交差駅間に挟まれた駅をグループ化して、２駅間の経路探索を交差駅をたどることで効率化している。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平９−１６１１０５号公報
【非特許文献】
【０００６】
【非特許文献１】A.V,エイホ、J.E.ホップクロフト、J.D.ワルマン著 大野義夫訳「データ構造とアルゴリズム」 培風館、１９８７年３月
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、実際の鉄道網においては、特に利用客の多い山手線内区間と地方のように利用客が少ない区間とでは、同一距離を乗車した場合でも同一の運賃が設定されていない。このため、非特許文献１に記載の方法で最短経路を求めても、それが必ずしも最安経路とはならない。また、特許文献１に記載の方法は、指定された２駅間の経路を算出するものであり、首都圏内でも1000以上ある駅の全駅間で運賃が最安となる経路を探索するには膨大な計算量を要する。
【０００８】
駅の自動改札機では、対象となるエリア内の全駅間の運賃をテーブルとして格納しているが、Suica（登録商標）やPASMO（登録商標）といったIC式乗車カードの利用可能エリアは年々増加しており、運賃テーブル作成にかかる計算量もそれに伴って増加している。この運賃テーブルは、最安経路の運賃を示すものであることが必須であり、所定時間内に算出することも必須である。
【０００９】
本発明の目的は、複数の運賃区分が設定されている交通網において、全ノード間の最安経路とその運賃を効率よく算出する運賃表作成システムを提供することにある。
【課題を解決するための手段】
【００１０】
上記目的を達成するため、請求項１に係る発明は、少なくとも入出力装置と処理装置と記憶装置を有し、交通機関の出発点と到達点となる各ノードに対し、全ての２ノード間の最安運賃を表す運賃表を作成する運賃表作成システムであって、前記各ノードを特定するノード情報を格納する手段と、２つのノード間を双方向で移動可能な場合の距離と、その移動にかかる運賃を算出する際の運賃区分を表す区分IDとを含むエッジ情報を記憶する手段と、同一区分内の１つ以上のエッジを通るときの運賃を、通るエッジの距離合計から算出するための、区分毎の運賃換算情報であって、各区分毎に優先度が付けられている運賃換算情報を記憶する手段と、単一区分内のエッジを通る場合はその区分の運賃換算情報を用い、複数の区分にまたがってエッジを通る場合は通過したエッジの区分の中で優先度の最も高い区分の運賃換算情報を用いて、通った全経路の合計距離によって運賃を算出する経路運賃算出手段と、任意の２ノード間の最短経路を、指定されたエッジ集合のエッジ情報から求める最短経路探索手段と、前記最短経路探索手段によって、全エッジ情報のエッジ集合を対象として求めた最短経路を１つのエッジとするエッジ距離最短エッジと各区分のエッジ情報のエッジ集合を対象とした最短経路を１つのエッジとする区分内最短エッジとを用いて、任意の２ノード間の運賃が最安となる、同一ノードを高々１回通る経路を探索する最安経路探索手段と、前記最安経路探索手段により、全ての２ノード間で運賃が最安の経路を探索し、全２ノード間の最安運賃を格納する運賃表を作成する運賃表作成手段とを備えることを特徴とする。請求項１に係る発明は、後述する実施形態の特に図１５〜図１８の処理でエッジ距離最短エッジと区分内最短エッジを利用して最安経路を求めている処理に基づくものである。
【００１１】
請求項２に係る発明は、請求項１に記載の運賃表作成システムにおいて、前記運賃換算情報は、複数の区分に属するエッジを通る経路の運賃を求めるための複合区分の運賃換算情報を含み、前記経路運賃算出手段は、複数区分を通る経路の運賃算出には、該複合区分の運賃換算情報を参照して運賃を算出することを特徴とする。請求項２に係る発明は、後述する実施形態で、運賃換算情報（１１２）の区分ID配列（２１４）の記載などに基づくものである。
【００１２】
請求項３に係る発明は、請求項１に記載の運賃表作成システムにおいて、前記エッジ情報には、運賃算出時に前記運賃換算情報と付き合わせるための運賃距離をエッジ距離とは別に設定することを特徴とする。請求項３に係る発明は、後述する実施形態で、エッジ情報（１１１）にエッジ距離（２１２）と運賃距離（２１３）を有していることなどに基づくものである。
【００１３】
請求項４に係る発明は、請求項３に記載の運賃表作成システムにおいて、前記運賃換算情報と付き合わせる距離として、前記運賃距離の合計を用いるか前記エッジ距離の合計を用いるかを示す運賃距離適用範囲情報を記憶する手段をさらに備え、前記経路運賃算出手段は、運賃算出の際、前記運賃距離適用範囲情報に応じて前記運賃距離の合計または前記エッジ距離の合計を用いて運賃を算出することを特徴とする。請求項４に係る発明は、後述する実施形態の図１８のステップ１８０６，１８０７で運賃距離適用範囲情報（１１４）を利用していることに基づくものである。
【００１４】
請求項５に係る発明は、請求項１に記載の運賃表作成システムにおいて、区分内のエッジを通り、始発ノード以外のノードを高々１回通って始発ノードに戻れる閉路を構成するエッジを、異なるサブ区分のエッジにすることで、区分を分割するエッジ区分分割手段をさらに備え、該エッジ区分分割手段により区分を分割することで、前記最短経路探索手段によって作成された区分内最短エッジが、エッジ距離と運賃距離とをそれぞれ用いた場合に同一経路となるようにすることを特徴とする。請求項５に係る発明は、後述する実施形態の図１１の区分分割処理の記載などに基づくものである。
【００１５】
請求項６に係る発明は、請求項１に記載の運賃表作成システムにおいて、複数の区分の組み合わせからなる区分集合に対して、その任意の要素が表す区分のエッジのエッジ距離と運賃距離が同一で、該区分集合の任意の部分集合に対する運賃換算情報が、該部分集合内の最高優先度の区分の運賃換算情報と同一で、該部分集合にない任意の区分を通過する経路が該部分集合内の区分をどのように通過しても、運賃算出に利用する運賃換算情報が同一であるとき、該部分集合のそれらの区分を合成区分として扱えるようにする区分合成手段をさらに備えることを特徴とする。請求項６に係る発明は、後述する実施形態の図１２の区分合成処理の記載などに基づくものである。特に、「その任意の要素が表す区分のエッジのエッジ距離と運賃距離が同一」はステップ１２０５などの記載に、「該区分集合の任意の部分集合に対する運賃換算情報が、該部分集合内の最高優先度の区分の運賃換算情報と同一」はステップ１２０８などの記載に、「該部分集合にない任意の区分を通過する経路が該部分集合内の区分をどのように通過しても、運賃算出に利用する運賃換算情報が同一」はステップ１２１０〜１２２０などの記載に、それぞれ基づくものである。
【００１６】
請求項７に係る発明は、請求項１に記載の運賃表作成システムにおいて、前記ノード情報は、ノードから１つのエッジを通って移動可能なノードが１つしかない末端ノードと、３つ以上のノードに移動可能な交差ノードと、異なる区分およびサブ区分のエッジが複数接続している境界ノードと、それら以外の一般ノードとに分類するノード種別情報を有し、末端ノードと交差ノードと境界ノードをあわせた特殊ノードに対して、特殊ノードを出発してエッジを順にたどって次の特殊ノードに到達する経路を１つの連結エッジとし、またそのとき通過した任意の一般ノード間に対する連結エッジを作成する連結エッジ作成手段をさらに備え、該連結エッジ作成手段によって作成された連結エッジ集合を、任意ノード間の最短経路探索手段に適用し、さらにその最短経路探索手段によって得られた最短経路からなる新たな特殊ノード間の最短経路の連結エッジ集合を、エッジ距離最短エッジと区分内最短エッジとして任意２ノード間の最安経路探索手段に利用することを特徴とする。請求項７に係る発明は、後述する実施形態のノード情報（１１０）のノード種別の記載、図８の連結エッジテーブル作成処理の記載、および、作成した連結エッジテーブルの情報を利用して図７のエッジ距離最短経路探索処理でエッジ距離最短エッジテーブルの情報を作成し図１４の区分内最短エッジテーブル作成処理で区分内最短エッジテーブルの情報を作成している記載などに基づくものである。
【００１７】
請求項８に係る発明は、請求項１に記載の運賃表作成システムにおいて、全区分を対象とする最短経路探索の結果を用いて、指定された出発ノードと折り返しノードとの間の最短距離と折り返しノードと到着ノードとの間の最短距離との差の絶対値をエッジ距離と運賃距離でそれぞれ求め、エッジ距離で最短距離の長いほうのノード間が１本のエッジとなっている場合に、そのエッジの出発ノードと到着ノードを、出発ノードと折り返しノードまたは折り返しノードと到着ノードに、修正するエッジ修正手段をさらに備えることを特徴とする。請求項８に係る発明は、後述する実施形態の図９のエッジ修正処理の記載などに基づくものである。
【００１８】
請求項９に係る発明は、請求項１に記載の運賃表作成システムにおいて、特定の始発ノードと終着ノードとの間の運賃を所定の運賃に更新するための特定区間運賃情報を記憶する手段と、前記最安経路探索手段によって作成された運賃表に対して、該特定区間運賃情報にしたがって運賃を更新する特定区間運賃更新手段とをさらに備えることを特徴とする。請求項９に係る発明は、後述する実施形態の特定区間運賃情報（１１６）や図１９の特定区間運賃更新処理の記載などに基づくものである。
【００１９】
請求項１０に係る発明は、請求項９に記載の運賃表作成システムにおいて、前記特定区間運賃情報は、前記最安運賃経路探索手段で算出された経路の運賃より安い運賃が指定された場合のみ運賃を更新するか、高くなっても必ず更新するかを指定する更新フラグを有し、前記特定区間運賃更新手段は、該更新フラグにしたがって運賃更新処理を行うことを特徴とする。請求項１０に係る発明は、後述する実施形態で、特定区間運賃情報（１１６）の更新フラグ（２２９）の強制モードと更新モードの記載などに基づくものである。
【００２０】
請求項１１に係る発明は、請求項９に記載の運賃表作成システムにおいて、前記更新フラグは、再帰モードを指定できるフラグであり、前記特定区間運賃更新手段は、前記更新フラグで再帰モードが指定され、前記最安運賃経路探索手段で算出された運賃より安い運賃が指定されていた場合、始発ノードと終着ノードの隣接ノードとの間の最安経路が終着ノードを通過しないとき、前記特定区間運賃情報で指定された運賃を、始発ノードと終着ノードの隣接ノードとの間の運賃の上限として再帰的に特定区間運賃更新手段を適用し、終着ノードと始発ノードの隣接ノードとの間の最安経路が始発ノードを通過しないとき、前記特定区間運賃情報で指定された運賃を、終着ノードと始発ノードの隣接ノードとの間の運賃の上限として再帰的に特定区間運賃更新手段を適用するものであることを特徴とする。請求項１１に係る発明は、後述する実施形態で、更新フラグ（２２９）の再帰モードや図１９の特定区間運賃更新処理の記載などに基づくものである。
【００２１】
請求項１２に係る発明は、請求項１に記載の運賃表作成システムにおいて、ゾーンの代表となる１つの主ノードを特定する情報と、該主ノードからの適用距離範囲を示す情報と、該主ノードから該適用距離範囲内にあるノードを特定する範囲内ノード情報とを有するゾーン情報を記憶する手段をさらに備え、前記ノード情報は、該ノードが所属するゾーンを１つまたは複数指定する情報を含み、前記最安経路探索手段は、ゾーン内の任意のノードと該ゾーンの範囲内ノード情報で指定されている所定ノードとの間の最安経路およびその運賃を、該ゾーンの主ノードと前記所定ノードとの間の最安経路およびその運賃に置き換えることを特徴とする。請求項１２に係る発明は、後述する実施形態のゾーン情報（１１５）や図１５の最安経路探索処理の特にステップ１５１５〜１５２１の記載などに基づくものである。
【００２２】
請求項１３に係る発明は、請求項１に記載の運賃表作成システムにおいて、前記最安経路探索手段は、最安経路探索途中の経路の部分経路に対して、当該部分経路と始発ノードおよび終着ノードが同一のエッジ距離最短経路のエッジ距離と運賃距離が、共に前記部分経路の距離未満で、かつ、前記部分経路の通過区分が前記エッジ距離最短経路の通過区分と同一の場合、前記最安経路探索途中の経路を延長した経路の探索を行わないようにすることを特徴とする。請求項１３に係る発明は、後述する実施形態の図１７の枝狩り判定処理のステップ１７０４〜１７０８などの記載に基づくものである。特に、「部分経路」は図１７の処理中のR2に、「当該部分経路と始発ノードおよび終着ノードが同一のエッジ距離最短経路のエッジ距離と運賃距離が、共に前記部分経路の距離未満」はステップ１７０５，１７０６に、「前記部分経路の通過区分が前記エッジ距離最短経路の通過区分と同一」はステップ１７０７，１７０８に、「前記最安経路探索途中の経路を延長した経路の探索を行わないようにする」は図１６のステップ１６１６に、それぞれ対応するものである。
【００２３】
請求項１４に係る発明は、請求項６に記載の運賃表作成システムにおいて、前記区分合成手段は、合成されていない任意の区分の組み合わせからなる区分集合に対して、前記合成区分と前記区分集合の任意の部分集合とを組み合わせた区分に対する前記運賃換算情報の運賃が、前記合成区分と前記区分集合とを組み合わせた区分における同一距離の前記運賃換算情報の運賃より高くならないとき、枝狩り判定可能を返す運賃換算情報比較手段を備え、前記最安経路探索手段は、枝狩り判定可能の場合、最安経路探索途中の経路と現時点の暫定の最安経路が前記合成区分を通過し、該最安経路が該最安経路探索途中の経路の通過区分のみを通過する場合に、該最安経路探索途中の経路の運賃が該最安経路の運賃を越える場合には、前記最安経路探索途中の経路を延長した経路の探索を行わないようにすることを特徴とする。請求項１４に係る発明は、後述する実施形態の図１３の運賃換算情報比較処理の記載、および、図１７の枝狩り判定処理のステップ１７１０〜１７１８の記載などに基づくものである。特に、「運賃換算情報比較手段」は図１３の運賃換算情報比較処理に対応し、「枝狩り判定可能の場合、最安経路探索途中の経路と現時点の暫定の最安経路が前記合成区分を通過し、該最安経路が該最安経路探索途中の経路の通過区分のみを通過する場合」は図１７のステップ１７１０〜１７１２に対応し、「該最安経路探索途中の経路の運賃が該最安経路の運賃を越える場合」はステップ１７１６に対応し、「前記最安経路探索途中の経路を延長した経路の探索を行わないようにする」は図１６のステップ１６１６に対応するものである。
【００２４】
請求項１５に係る発明は、請求項１４に記載の運賃表作成システムにおいて、前記最安経路探索手段による最安経路探索の打ち切りを行う条件を、最安経路探索途中の経路と探索対象の終着ノードに向かう各エッジとを合わせた経路の運賃と探索途中時点での最安経路運賃との比較に変更できることを特徴とする。請求項１５に係る発明は、後述する実施形態の図１６のステップ１６０６でのEtの構成と、図１７の枝狩り判定処理のステップ１７１３〜１７１８の記載などに基づくものである。
【００２５】
すなわち、本発明では、エッジをたどって移動可能なノードが３つ以上の交差ノード、移動可能ノードが１つの末端ノードと、異なる運賃区分のエッジが複数接続している境界ノードの３種類のノード種別に該当するノードを特殊ノード、それ以外のノードを一般ノードとし、同一距離を与えたときに運賃換算情報の運賃の大小関係が確定する区分を合成して１つの区分としてまとめ、特殊ノード間の最短経路を、全区分と各区分ごとでそれぞれ算出し、全区分と各区分ごとの一般ノード間の最短経路を、一般ノードとそれに隣接する特殊ノード間の経路と、特殊ノード間で算出した最短経路の組み合わせで構成される高々４種類の経路の中から算出し、最終的に区分間移動の経路を、先に算出した各区分での境界ノード間最短経路の組み合わせで探索し、探索途中の経路が現時点での最安経路の運賃を上回ることが確定した場合に、そこからの延長経路に対する探索を打ち切ることで、最安経路探索にかかる計算量を大幅に削減し、全ノード間の最安経路とその運賃を効率よく算出する。
【発明の効果】
【００２６】
本発明により、複数の運賃区分が設定された複雑な交通網の正確な最安経路を、従来に比較して大幅に削減された計算量で探索することができ、全ノード間の最安の運賃表を効率よく作成することができる。
【図面の簡単な説明】
【００２７】
【図１】本発明の実施形態である運賃表作成システムの全体構成図である。
【図２】本実施形態で用いるデータの構造を示す図である。
【図３】本実施形態で用いる出力結果のデータ構造を示す図である。
【図４】本実施形態の全体的な処理を示すフローチャート図である。
【図５】本実施形態の入力処理の詳細を示すフローチャート図である。
【図６】本実施形態の運賃表作成処理の詳細を示すフローチャート図である。
【図７】本実施形態のエッジ距離最短経路探索処理の詳細を示すフローチャート図である。
【図８】本実施形態の連結エッジテーブル作成処理の詳細を示すフローチャート図である。
【図９】本実施形態のエッジ修正処理の詳細を示すフローチャート図である。
【図１０】本実施形態のゾーン情報更新処理の詳細を示すフローチャート図である。
【図１１】本実施形態の区分分割処理の詳細を示すフローチャート図である。
【図１２】本実施形態の区分合成処理の詳細を示すフローチャート図である。
【図１３】本実施形態の運賃換算情報比較処理の詳細を示すフローチャート図である。
【図１４】本実施形態の区分内最短エッジテーブル作成処理の詳細を示すフローチャート図である。
【図１５】本実施形態の最安経路探索処理の詳細を示すフローチャート図である。
【図１６】本実施形態の指定ノード間最安経路探索処理の詳細を示すフローチャート図である。
【図１７】本実施形態の枝狩り判定処理の詳細を示すフローチャート図である。
【図１８】本実施形態の経路運賃算出処理の詳細を示すフローチャート図である。
【図１９】本実施形態の特定区間運賃更新処理の詳細を示すフローチャート図である。
【図２０】本実施形態の出力処理の詳細を示すフローチャート図である。
【発明を実施するための形態】
【００２８】
以下、図面を用いて、本発明の実施の形態を説明する。
【００２９】
図１は、本実施形態の運賃表作成システムの全体構成図である。本システムは、入力装置(１０１)、ディスプレイなどの表示装置(１０２)、プリンタなどの出力装置(１０３)、処理装置(１０４)、および記憶装置(１０９)を備える。出力装置(１０３)は、プリンタなど以外の外部記憶媒体やネットワークを介するデータ転送であってもよい。
【００３０】
処理装置(１０４)は、入力処理部(１０６)、運賃表作成処理部(１０７)、出力処理部(１０８)を実現する一連のプログラム(１０５)を実行する。また、記憶装置(１０９)には、ノード情報(１１０)、エッジ情報(１１１)、運賃換算情報(１１２)、エッジ修正情報(１１３)、運賃距離適用範囲情報(１１４)、ゾーン情報(１１５)、特定区間運賃情報(１１６)、連結エッジテーブル(１１７)、エッジ距離最短エッジテーブル(１１８)、区分内最短エッジテーブル(１１９)、運賃表'(１２０)、および特定区間運賃更新ログ(１２１)が格納される。
【００３１】
図２は、記憶装置(１０９)に格納される情報の一例を示したものである。
【００３２】
ノード情報(１１０)には、鉄道の駅またはその中の改札機などを表すノード情報を格納する。具体的には、ノードを識別するID（２０１）、ノード名（２０２）、ノードが属するゾーンを表すゾーンID配列（２０３）、ノード位置を表す座標（２０４）、およびノード種別（２０５）を格納する。
【００３３】
ノードID（２０１）は、１から始まる連番の番号で設定する。ゾーンID配列（２０３）は、同一のゾーンIDを持つノードが同一ゾーンに属することを表しており、１つのノードに対して複数のゾーンが指定可能である。また、どのゾーンにも属さない場合には、空の配列を指定することができる。ゾーンを特定するゾーンIDは、１から始まる連番で設定する。なお、ゾーンについては、後に詳しく説明する。ノード種別（２０５）には、エッジ情報（１１１）との関連によって、末端ノード、交差ノード、境界ノード、一般ノードの４種類の種別のうちの何れかが設定される。
【００３４】
末端ノードとは、このノードを出発するエッジが１本だけのノードのことである。交差ノードとは、このノードを出発するエッジが３本以上のノードのことである。境界ノードとは、このノードを出発するエッジの区分（区分については後述する）が複数存在するノードのことである。一般ノードとは、上記の末端、交差、および境界のどれにもあてはまらないノードのことである。末端、交差、および境界のノード（すなわち、一般ノード以外のノード）を特殊ノードと呼ぶ。交差ノードかつ境界ノードの場合は、種別を境界ノードとする。ノード種別（２０５）は、図６の運賃表作成処理のステップ６０１で設定され、その後、区分分割処理や区分合成処理で更新されるので、ユーザによる入力は不要である。
【００３５】
エッジ情報（１１１）は、ノード情報（１１０）にあるノード間のつながり（路線）を表すものである。具体的には、エッジを識別するID（２０６）、出発ノードID（２０７）、到着ノードID（２０８）、経路（２０９）、区分ID（２１０）、サブ区分ID（２１１）、エッジ距離（２１２）、および運賃距離（２１３）からなる。
【００３６】
エッジID（２０６）は、１から始まる連番の番号で設定する。出発ノードID（２０７）および到着ノードID（２０８）は、このエッジの発着ノードを表すノードIDである。ユーザ入力時は、出発ノードID＜到着ノードID の条件のエッジのみを入力し、その入力と同時に、入力された出発ノードを到着ノードとし、入力された到着ノードを出発ノードとする逆方向のエッジ情報を自動的に追加するものとする。このとき、入力されたエッジのエッジIDは１始まりの奇数を指定し、逆方向エッジIDはそれに１を加えた偶数で自動追加する。逆方向エッジのその他の情報は元のエッジ情報と同じである。
【００３７】
経路（２０９）には、出発ノード（２０７）から到着ノード（２０８）への移動でたどったエッジのID配列を格納する。つまり、経路（２０９）内の連続するエッジIDの前のエッジの到着ノードと次のエッジの出発ノードが一致するようにして、エッジの並びで移動経路を表現する。本実施形態では、この経路に対する逆方向経路を頻繁に生成するが、これは先に説明したように、入力エッジIDを奇数、その逆方向エッジIDを該入力エッジIDに１を加算した偶数としているので、逆方向経路は、経路を表すエッジID配列を逆順にし、先頭エッジIDから順に、奇数なら１を加え、偶数なら１を引いていくことで、簡単に生成することができる。なお、この経路情報（２０９）は、ユーザ入力時は不要である。処理が進むなかで、連結エッジテーブル（１１７）、エッジ距離最短エッジテーブル（１１８）、および区分内最短エッジテーブル（１１９）を生成するときに必要となる項目である。なお、これらのテーブルについては、後に詳しく説明する。
【００３８】
区分ID（２１０）は区分を識別するためのIDであり、サブ区分ID（２１１）はサブ区分を識別するためのIDである。どちらも１から始まる連番の番号で設定する。区分ID（２１０）は、このエッジが運賃換算情報（１１２）で指定されているどの運賃区分に属するかを表している。サブ区分ID（２１１）は、後述する区分分割処理によって区分をさらに分割した場合に設定されるので、ユーザ入力時は１である。区分ID（２１０）とサブ区分ID（２１１）は、経路（２０９）が設定されているときは、その経路内の全エッジが同一区分かつ同一サブ区分である場合にはそれらのIDを設定する。異なる区分あるいは区分が同一でも異なるサブ区分を通過している場合には、−１などの無効であることを示すIDを設定するものとする。
【００３９】
エッジ距離（２１２）には、出発ノード（２０７）から到着ノード（２０８）までの移動距離（実際の物理的な距離）を設定する。運賃距離（２１３）には、エッジ距離（２１２）とは異なり、運賃換算情報（１１２）を参照してこのエッジを通過する経路の運賃を算出する場合に利用する特別な距離を設定する。運賃距離（２１３）にはエッジ距離（２１２）以上の値が設定される。運賃距離（２１３）は、例えば地方交通線などの採算が良くない路線について実際の距離を割り増しした距離で運賃を計算するために使う距離だからである。エッジ距離（２１２）および運賃距離（２１３）は、経路（２０９）が設定されている場合は、その経路内の全エッジのエッジ情報のエッジ距離の合計値と運賃距離の合計値を設定する。
【００４０】
運賃換算情報（１１２）には、エッジ情報（１１１）で設定されている区分ID（２１０）に対して、経路距離の合計値から運賃を算出するための情報を格納する。具体的には、区分ID配列（２１４）、同一の運賃となる範囲を表す距離範囲（２１５）、およびその距離範囲内の距離に対する運賃（２１６）からなる。
【００４１】
区分ID配列（２１４）は、運賃換算情報（１１２）を、距離と運賃との関係を表す表とみたときの、表IDであるといえる。例えば、区分ID配列（２１４）に「１」と「２」が設定されている運賃換算情報（１１２）は、区分IDが「１」の区分内のエッジと区分IDが「２」の区分内のエッジを連結した経路の運賃を算出するために利用する。ユーザ入力時は、単一の区分IDの情報は必須である。すなわち、区分ID配列（２１４）が１つの区分IDからなるような運賃換算情報（１１２）は、後述する図５のステップ５０３でユーザ入力により設定される。区分ID配列（２１４）が複数の区分IDの組み合わせからなるような運賃換算情報（１１２）の入力は任意である。もし、運賃を算出する際に、求めたい複数の区分IDの組み合わせが区分ID配列（２１４）に設定されている運賃換算情報（１１２）が無かった場合には、運賃を求めたい区分ID配列の中の最高優先度の区分ID、つまりその区分ID配列の中の最大値の区分IDが区分ID配列（２１４）に設定されている運賃換算情報（１１２）を利用して運賃を算出するものとする。すなわち、運賃換算情報（１１２）は、区分ID配列（２１４）に設定されている区分IDの値が大きいものが優先度が高くなるように設定される。同一の区分ID配列（２１４）に対して、距離範囲（２１５）は複数指定可能である。ただし、距離を与えたら一意にその距離範囲が確定するようになっているものとする。例えば、同一の区分ID配列（２１４）で、距離範囲（２１５）が「3km以下」、「7km以下」、「10km以下」、…のようにそれぞれの距離範囲の運賃換算情報（１１２）を用意しておき、その区分ID配列で距離6kmが与えられた場合は、距離範囲（２１５）が「7km以下」の運賃換算情報（１１２）を参照して運賃（２１６）を求める。
【００４２】
また、各区分ID配列（２１４）における距離と運賃との関係では、長距離の運賃は短距離の運賃以上の値が設定されているものとする。なお、距離範囲の意味として、”以下”を”未満”としてもよい。この条件は予め決められているものとする。また、−１を無限大として扱うようにして、一定距離以上に対する運賃を指定することもできる。
【００４３】
つまり、この運賃換算情報（１１２）は、区分ID配列と距離を与えれば、一意に運賃を特定できるようになっている。また、同一区分ID配列に対して、短距離運賃＜＝長距離運賃となっているものとする。本実施形態では、ある区分または区分配列に対する運賃換算情報を、運賃換算表または単に換算表と表記することがある。また、区分aに対する換算表をa表、区分配列Kに対する換算表をK表、区分配列Kに区分aを加えた区分配列に対する換算表をK+a表、２つの区分配列K1,K2を合わせた区分配列に対する換算表をK1+K2表と表記することがある。K+a表は区分配列Kの全区分および区分aを通る経路の運賃を求める際に使用する換算表であり、K1+K2表は区分配列K1およびK2の全区分を通る経路の運賃を求める際に使用する換算表である。
【００４４】
エッジ修正情報（１１３）には、指定された発着ノード間のエッジを、指定された出発ノードと折り返しノード間のエッジ、および当該折り返しノードと到着ノード間のエッジに置き換えるための情報を格納する。具体的には、出発ノードID（２１７）、到着ノードID（２１８）、および折り返しノードID（２１９）からなる。例えば、A駅からB駅へ行くとき、A駅→C駅→B駅と行くしか方法が無く、A駅→C駅の路線が途中でB駅付近を通過しているケースがある。要するに、A駅→C駅の路線中のB駅付近に駅があれば良いが、種々の理由で駅を作ることができないため、C駅経由で折り返すしかないケースである。このようなケースでは、A駅C駅間の距離とC駅B駅間の距離との差をA駅B駅間の距離として運賃を算出するルールがある。エッジ修正情報（１１３）は、このようなケースを考慮して設けられているものである。
【００４５】
出発（２１７）、到着（２１８）、折り返し（２１９）の全ノードIDは必ず異なるIDを指定する。この発着ノード（２１７，２１８）間のエッジがエッジ情報（１１１）にない場合、出発折り返しノード間最短経路のエッジ距離と、到着折り返しノード間最短経路のエッジ距離との差の絶対値を新たなエッジ距離とし、出発折り返しノード間最短経路のエッジ距離と、到着折り返しノード間最短経路のエッジ距離の長いほうの経路が１つのエッジとなっている場合には、そのエッジに対して、修正エッジ情報で指定された折り返しノードを出発または到着ノードに変更する。また、運賃距離もエッジ距離と同様に差の絶対値を算出して更新する。これらの処理については、図９のエッジ修正処理で詳しく説明する。
【００４６】
運賃距離適用範囲情報（１１４）には、運賃換算情報（１１２）で指定された区分ID配列（２１４）に対して、その運賃換算情報（１１２）を、運賃距離で参照するか、エッジ距離で参照するかを決定する情報を格納する。具体的には、運賃換算情報（１１２）を特定する区分ID配列（２２０）、およびエッジ距離を適用する範囲と運賃距離を適用する範囲を規定する適用範囲（２２１）からなる。区分ID配列（２２０）に指定されていない区分に対しては、エッジ距離によって運賃換算情報を参照するものとする。適用範囲（２２１）は、運賃距離を適用する下限または最小値を指定する。すなわち、エッジ距離が適用範囲（２２１）で指定された値以上あるいはそれを超える場合は、運賃距離で運賃換算情報（１１２）を参照し、エッジ距離が適用範囲（２２１）で指定された値未満あるいは以下の場合は、エッジ距離で運賃換算情報（１１２）を参照するものとする。”以下””未満”といった範囲に関する条件は、予め決められているものとする。
【００４７】
ゾーン情報（１１５）には、ゾーン内発着の最安経路を、そのゾーンを代表する主ノード発着の最安経路に置き換えるための情報を格納する。具体的には、ゾーンを識別するゾーンID（２２２）、ゾーン内代表ノードとなる主ノードID（２２３）、適用距離範囲（２２４）、および主ノードとの最短距離が適用距離範囲（２２４）内のノードを格納する範囲内ノードID配列（２２５）からなる。例えば、あるゾーン内にあるA駅（主ノードとする）、B駅、C駅の何れかからD駅へ行く場合、主ノードであるA駅から例えば100km〜200kmの適用距離範囲にあるD駅については、ゾーン内のA〜C駅のどこからD駅へ行ったとしても運賃としては当該ゾーンを代表するA駅からD駅までの運賃を適用するという特例がある。ゾーン情報（１１５）は、そのようなゾーンを定義する情報である。
【００４８】
１つのゾーン（２２２）に対して、主ノード（２２３）と適用距離範囲（２２４）はそれぞれ１つ指定することができる。あるゾーンの主ノード（２２３）になっているノードは、他ゾーンに所属していても主ノードに指定されていなければならない。また、同一の主ノード（２２３）を持つ複数のゾーンにおける各適用距離範囲（２２４）は重複しないものとする。範囲内ノードID配列（２２５）は、ゾーン情報更新処理（図１０）によって設定されるので、ユーザ入力時に入力する必要はない。この配列（２２５）は、主ノード（２２３）からの最短距離が適用距離範囲（２２４）内となるノードIDを格納する。ゾーン内の任意ノード（各ノードがどのゾーンに属しているかは、ノード情報（１１０）のゾーンID配列（２０３）を参照することにより分かる）と、範囲内ノードID配列（２２５）内のノードとの最安経路は、主ノード（２２３）と範囲内ノードID配列（２２５）内の当該ノードとの最安経路に置き換わる。
【００４９】
特定区間運賃情報（１１６）には、特定の発着ノード間の運賃を指定する情報を格納する。具体的には、始発ノードID（２２６）、終着ノードID（２２７）、更新する運賃（２２８）、および更新条件を表す更新フラグ（２２９）からなる。特定区間とは、予めどこからどこまではいくらというように区間（２２６，２２７）と運賃（２２８）が定められている区間のことである。例えば、A駅とB駅間に他社の路線が存在し、その他社の路線の方が運賃が安価である場合、競争力を付けるために、値下げした運賃とする場合がある。特定区間運賃情報（１１６）は、そのような区間と運賃を規定する情報である。
【００５０】
始発ノードID（２２６）と終着ノードID（２２７）は、始発＜終着となる片方向のみで入力するが、その逆方向の運賃も同様に更新する。更新フラグ（２２９）は、算出された最安運賃に関わらず当該特定区間の運賃を運賃（２２８）に更新する強制モード０と、算出された最安運賃より運賃（２２８）の方が安くなるときだけ運賃（２２８）に更新する更新モード１と、算出された最安運賃より運賃（２２８）の方が安くなった場合に再帰的に更新する再帰モード１１がある。強制モードのときは再帰モードは適用されない。
【００５１】
再帰更新処理は、以下の条件で適用される。指定された発着ノード（２２６，２２７）間運賃が運賃（２２８）で更新（上書き）されたとき、その部分区間（部分区間とは、その発着ノード間の経路に含まれる経路を持つ部分的な区間のことである）の運賃が高くなってしまうことを避ける必要がある。そのため、再帰更新処理により、始発ノード（２２６）を始発し、終着ノード（２２７）から１つエッジで移動可能な各ノードに終着する場合の最安経路が、終着ノードを通過しない場合には、指定された運賃を上限とするように運賃を更新し、この条件を再帰的に繰り返す。またこの条件は、始発ノード（２２６）からエッジ１本で移動可能な各ノード始発に対しても行われる。この再帰更新処理については、図１９で説明する。
【００５２】
図３は、出力情報として記憶装置（１０９）に格納される情報の一例を示している。
【００５３】
運賃表（１２０）には、任意の発着ノード間の最安経路とその運賃を含む情報を格納する。具体的には、始発ノードID（３０１）、終着ノードID（３０２）、運賃（３０３）、最安経路（３０４）、エッジ距離（３０５）、および運賃距離（３０６）からなる。これらの構成は、エッジ情報（１１１）の構成とほぼ同一であるが、区分IDなど一部の情報は削除してある。
【００５４】
特定区間運賃更新ログ（１２１）には、特定区間運賃更新処理（図１９）による処理内容を格納する。具体的には、始発ノードID（３０７）、終着ノードID（３０８）、最安経路探索処理（図１５）によって算出された元の運賃を表す算出運賃（３０９）、特定区間運賃更新処理（図１９）によって更新された更新運賃（３１０）、および更新フラグ（３１１）からなる。更新運賃（３１０）は、特定区間で指定された運賃（２２８）が実際に適用されなかった場合には、元の算出運賃が格納される。更新フラグ（３１１）は、更新フラグ（２２９）と同じ情報である。
【００５５】
図４は、本実施形態のシステムにおける全体処理を表すフローである。まず、入力処理を実行する（ステップ４０１）。この処理の詳細は図５で説明する。次に、運賃表作成処理を実行する（ステップ４０２）。この処理の詳細は図６で説明する。次に、出力処理を実行する（ステップ４０３）。この処理の詳細は図２０で説明する。
【００５６】
図５は、図４中の入力処理（ステップ４０１）の詳細を表すフローである。まず、全てのノードについてノード情報（１１０）を入力する（ステップ５０１）。次に、エッジ情報（１１１）を入力する（ステップ５０２）。ここでは、隣り合うノードをつなぐエッジを片方向だけ入力し、逆方向の情報を自動的に追加するものとする。このとき、エッジIDは、入力された元のエッジ情報は１から始まる奇数で順番に付けていくものとし、逆方向エッジのIDはそれに１を加えた偶数として追加する。次に、運賃換算情報（１１２）を入力する（ステップ５０３）。ここで、特定の運賃換算情報が「長距離運賃 ＞＝ 短距離運賃」の条件をみたさない場合、ユーザに警告し、再入力を要求するか、あるいはプログラムを終了してよい。次に、エッジ修正情報（１１３）を入力する（ステップ５０４）。次に、運賃距離適用範囲情報（１１４）を入力する（ステップ５０５）。次に、ゾーン情報（１１５）を入力する（ステップ５０６）。次に、特定区間運賃情報（１１６）を入力する（ステップ５０７）。
【００５７】
図６は、図４中の運賃表作成処理（ステップ４０２）の詳細を表すフローである。まず、ノード情報（１１０）の各レコードのノード種別（２０５）を設定する（ステップ６０１）。この処理は以下の手順で行う。まず、全ノードのノード情報（１１０）のノード種別（２０５）を全て一般ノードに初期設定する。次に、各ノード情報（１１０）について、そのノードから出発するエッジが１本だけなら当該ノードのノード種別（２０５）を末端ノードとし、そのノードから出発するエッジが３本以上なら当該ノードのノード種別（２０５）を交差ノードとし、そのノードから出発するエッジの中に複数の区分の接続エッジがあれば当該ノードのノード種別（２０５）を境界ノードに、それぞれ設定する。
【００５８】
次に、エッジ距離最短経路探索処理を実行する（ステップ６０２）。この処理の詳細は図７で説明する。次に、エッジ修正情報（１１３）があるか調べる（ステップ６０３）。エッジ修正情報（１１３）がある場合は、エッジ修正処理を実行する（ステップ６０４）。この処理の詳細は図９で説明する。次に、エッジ修正情報（１１３）とエッジ距離最短エッジテーブル（１１８）と連結エッジテーブル（１１７）を削除する（ステップ６０５）。ここで、エッジ修正情報（１１３）を入力情報として残しておきたい場合は、該エッジ修正情報を無効化するようなフラグを用いればよい。そして、ステップ６０１に戻る。
【００５９】
ステップ６０３で、エッジ修正情報（１１３）がない場合（あるいは無効化フラグが立っている場合）には、まず、ゾーン情報更新処理を実行する（ステップ６０６）。この処理の詳細は図１０で説明する。次に、区分分割処理を実行する（ステップ６０７）。この処理の詳細は図１１で説明する。次に、区分合成処理を実行する（ステップ６０８）。この処理では、以下のステップ６０９の区分内最短エッジテーブル作成処理とステップ６１０の最安経路探索処理の内容を切り替えるための情報を作成する。この処理の詳細は図１２で説明する。次に、区分内最短エッジテーブル作成処理を実行する（ステップ６０９）。この処理の詳細は図１４で説明する。次に、最安経路探索処理を実行する（ステップ６１０）。この処理の詳細は図１５で説明する。次に、特定区間運賃更新処理を実行する（ステップ６１１）。この処理の詳細は図１９で説明する。
【００６０】
図７は、図６中のエッジ距離最短経路探索処理（ステップ６０２）の詳細を表すフローである。まず、連結エッジテーブル作成処理を実行する（ステップ７０１）。この処理の詳細は図８で説明するが、概要を述べると、この処理により、連結エッジテーブル（１１７）（そのレコードのフォーマットは図２で説明したエッジ情報（１１１）と同じである）に、全ての特殊ノードと特殊ノードとの間を連結する連結エッジ情報と、それら特殊ノード間の連結エッジの部分区間のエッジ情報が設定される。
【００６１】
次に、配列Espに連結エッジテーブル（１１７）中の特殊ノード間エッジIDを全て代入する（ステップ７０２）。次に、配列Nspに、配列Espで示される全てのエッジに関して各エッジの発着ノードとなっている全ての特殊ノードIDを代入する（ステップ７０３）。これで、ノード集合Nspとエッジ集合Espで表されるグラフG(Nsp,Esp)が確定する。次に、エッジ修正情報（１１３）の要素があるかチェックする（ステップ７０４）。エッジ修正情報（１１３）がある場合は、エッジ修正を行う区間のみ最短経路探索を行う。
【００６２】
まず、エッジ修正情報（１１３）のインデクスuを用意し、全てのエッジ修正情報のレコードに対するループを実行する（ステップ７０５）。このループ内では、まず、エッジ修正情報（１１３）の出発ノードID（２１７）をfに、到着ノードID（２１８）をtに、折り返しノードID（２１９）をvに、それぞれ代入する（ステップ７０６）。次に、配列Eに配列Espをコピーし、f,v間、f,各特殊ノード間、各特殊ノード,v間の連結エッジIDを全て追加する（ステップ７０７）。このとき、同一エッジIDが重複しないようにする。次に、f,v間の最短経路探索を実行する（ステップ７０８）。この処理は、配列Eに現れる発着ノード配列をNとするときのグラフG(N,E)に対する最短経路探索でダイクストラ法を適用することができるので、ここでは説明を省略する。探索結果はエッジ距離最短エッジテーブル（１１８）に追加する。またこのとき、v,f間の最短経路はf,v間の逆方向経路となるので、その逆方向経路をv,f間の結果としてエッジ距離最短エッジテーブル（１１８）に追加する。なお、エッジ距離最短エッジテーブル（１１８）は、ノード間のエッジ距離が最短となる経路を格納するためのテーブルであり、そのレコードフォーマットは図２で説明したエッジ情報（１１１）と同じである。次のステップ７０９および７１０は、ステップ７０７および７０８の処理のf,vをv,tに置き換えただけなので、詳細は省略する。ここまでの処理で、各エッジ修正情報の出発ノードfと折り返しノードvとの間の最短経路とその逆方向経路および折り返しノードvと到着ノードtとの間の最短経路とその逆方向経路が、エッジ距離最短エッジテーブル（１１８）に追加されたことになる。
【００６３】
ステップ７０４でエッジ修正情報（１１３）が空の場合は、配列Nspの全特殊ノードの組み合わせに対する最短経路探索を実行する（ステップ７１１）。この処理は、グラフG(Nsp,Esp)に対する最短経路探索であり、ダイクストラ法またはワーシャルフロイド法が適用できるため、詳細は省略する。探索結果はエッジ距離最短エッジテーブル（１１８）に追加する。
【００６４】
次の処理では、任意のノード間に対する最短経路探索を行う。まず、配列Nに、ノード情報（１１０）の全てのノードIDを代入する（ステップ７１２）。次に、配列NのノードIDの全ての組み合わせについてのループを実行する（ステップ７１３、７１４）。ここでは、i＜jとなるようにループを回し、N[j],N[i]間の結果はN[i],N[j]間の結果の逆方向経路で追加している。ループ内ではまず、N[i],N[j]間の結果が既にあるかチェックする(７１５)。もしあるなら、次のノード間探索に進む。N[i],N[j]間の結果がまだない場合には、配列Eに以下の条件のエッジIDを格納する（ステップ７１６）。まず、N[i]が一般ノードの場合はその隣接特殊ノードをa,bとし、N[i]が特殊ノードの場合はa＝b＝N[i]とする。次に、N[j]が一般ノードの場合は隣接特殊ノードをp,qとし、N[j]が特殊ノードの場合はp＝q＝N[j]とする。そして、Eにステップ７１１で算出した特殊ノード間のエッジ距離最短エッジ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]間の最短経路を探索する（ステップ７１７）。この処理は、エッジ配列Eのエッジを使って以下の５種類の経路を作成し、その中からエッジ距離が最短となるものを探せばよい。
(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)のうちの連結可能な経路に対して最短となる経路を見つける。最短となる経路が見つかったら、エッジ距離最短エッジテーブル（１１８）に、逆方向経路とともに追加する。ここまでの処理で、全ノード間の最短経路とその逆方向経路が、エッジ距離最短エッジテーブル（１１８）に追加されたことになる。
【００６７】
図８は、図７中の連結エッジテーブル作成処理（ステップ７０１）の詳細を表すフローである。連結エッジとは、エッジ情報に含まれるエッジを１つまたは複数連結した経路を１つのエッジとするものである。経路中の前エッジ到着ノードと後エッジ出発ノードが同一の場合に、それらのエッジを連結して１つの連結エッジにすることができる。なお、連結エッジテーブル（１１７）には、発着ノード以外は特殊ノードを経由しない経路を全て連結エッジとして格納するものとする。
【００６８】
まず、配列Eに、エッジ情報（１１１）の全てのエッジIDを代入する（ステップ８０１）。次に、配列Nspに特殊ノードIDを全て代入する（ステップ８０２）。次に、配列Nspの各要素でループする（ステップ８０３）。このループ内では、まず、Eの要素があるかチェックする（ステップ８０４）。Eが空なら、処理を終了する。Eに要素（エッジID）がある場合は、まず、Eから、特殊ノードNsp[i]が出発ノードであるようなエッジIDを探し、変数esに代入する（ステップ８０５）。esに代入すべきエッジが見つからなかったら（ステップ８０６）、次のNspの要素にループを進める。エッジesが見つかったら、まず、経路配列Rの要素をesで初期化する（ステップ８０７）。すなわち、経路配列Rの先頭の要素としてエッジesを登録する。次に、Eからesとその逆方向エッジを削除する（ステップ８０８）。
【００６９】
次に、Rの終着ノードが特殊ノードでない間、以下の処理を実行する（ステップ８０９）。ここで、図８のフローでは、ループを抜ける条件として「Rの終着ノードが特殊ノード」を記述している。ループ内では、まず、経路Rとその逆方向経路を連結エッジテーブルに追加する（ステップ８１０）。次に、Rの終着ノードを出発し、まだRが通過していないノードに到着するエッジIDをEから探し、変数eに代入する（ステップ８１１）。次に、Rにeを追加する（ステップ８１２）。次に、Eからeとその逆方向エッジを削除する（ステップ８１３）。ステップ８０９からここまでのループで、特殊ノード間を移動するときの全ての一般ノードと出発側特殊ノード間の連結エッジが、連結エッジテーブル上に作成される。ループを抜けたら（すなわちRの終着ノードが特殊ノードになったら）、まず、経路Rとその逆方向経路を連結エッジテーブルに追加する（ステップ８１４）。
【００７０】
次に、R（この時点では、Rには特殊ノードから特殊ノードに至るエッジの並びが設定されている）の要素数が2以上の間、ループを実行する（ステップ８１５）。このループ内では、まず、Rから先頭要素を削除する（ステップ８１６）。ここで、Rの先頭要素を削除したら、それ以降の要素は１つづつ前にシフトするものとする。次に、Rとその逆方向経路を連結エッジテーブルに追加する（ステップ８１７）。次に、配列R2にRをコピーする（ステップ８１８）。次に、R2の要素数が2以上の間、以下のループ処理を実行する（ステップ８１９）。このループ内では、まず、R2から最後の要素を削除する（ステップ８２０）。次に、R2とその逆方向経路を連結エッジテーブルに追加する（ステップ８２１）。ループを抜けたら（すなわちR2の要素数が2より小さくなったら）、連結エッジテーブル内に同一発着ノードのエッジがあるか調べる（ステップ８２２）。なければ次のNsp要素にループを進め、ある場合はステップ８２３に進む。
【００７１】
以降の処理は、連結エッジテーブル内に、同一発着の特殊ノード間エッジが複数存在しないようにするものである。まず、同一発着エッジから一般ノードを１つ選び変数gに代入する（ステップ８２３）。エッジ情報では同一発着エッジを禁止しているので、ここでの一般ノードは必ず存在する。次に、gのノード種別を交差ノードに更新する（ステップ８２４）。次に、gを途中で通過する連結エッジを全て削除する（ステップ８２５）。ループを抜けたら、処理を終了する。
【００７２】
以上の図８の処理により、連結エッジテーブル（１１７）に、全ての特殊ノード間を連結する連結エッジ情報、および、特殊ノード間の連結エッジの全ての部分区間のエッジ情報が設定される。
【００７３】
図９は、図６中のエッジ修正処理（ステップ６０４）の詳細を表すフローである。まず、エッジ修正情報（１１３）のレコードでループする（ステップ９０１）。ループ内では、まず、変数fにu件目のエッジ修正情報（１１３）の出発ノードID（２１７）を、変数tに到着ノードID（２１８）を、変数vに折り返しノードID（２１９）を、それぞれ代入する（ステップ９０２）。次に、f,t間エッジがエッジ情報（１１１）にあるか調べる（ステップ９０３）。f,t間エッジがあれば修正の必要はないので次のエッジ修正情報（１１３）にループを進め、なければ以下に進む。次に、f,v間とv,t間最短経路があるか調べる（ステップ９０４）。どちらか片方でも最短経路がエッジ距離最短エッジテーブル（１１８）にない場合は、次のエッジ修正情報（１１３）にループを進める。そうでない場合は、以下に進む。
【００７４】
次に、変数fvにf,v間最短経路のエッジ距離を代入し、変数vtにv,t間最短経路のエッジ距離を代入する（ステップ９０５）。次に、変数cfvにf,v間最短経路の運賃距離を代入し、変数cvtにv,t間最短経路の運賃距離を代入する（ステップ９０６）。
【００７５】
次に、fv＜vtなら（ステップ９０７）、fとtを入れ替える（ステップ９０８）。次に、エッジ情報（１１１）中にf,v間エッジがあるか調べる（ステップ９０９）。ない場合は次のエッジ修正情報（１１３）にループを進め、ある場合には以下に進む。次に、エッジ情報（１１１）中のf,v間エッジの到着ノードをtに修正する（ステップ９１０）。次に、エッジ情報（１１１）中のv,f間エッジの出発ノードをtに修正する（ステップ９１１）。次に、fv−vtの絶対値を、修正したエッジ情報のエッジ距離に代入し、cfv−cvtの絶対値を運賃距離に代入する（ステップ９１２）。全ての修正エッジに対する処理を終えたら終了する。
【００７６】
再度、図６からの処理の流れの概要を、エッジ修正情報（１１３）がある場合を想定して、説明する。まず、図６のステップ６０１→６０２と進み、図７のエッジ距離最短経路探索処理では、エッジ修正情報（１１３）があるので、ステップ７０１〜７１０が実行される。特に、ステップ７０５〜７１０の処理により、エッジ修正情報（１１３）のエッジ修正を行う区間であるf,v間とv,t間（fは出発ノード、vは折り返しノード、tは到着ノード）の最短経路をエッジ距離最短エッジテーブル（１１８）に作成しておく。その後、ステップ６０３→６０４と進み、図９のエッジ修正処理で、修正後のf,t間とt,f間のエッジ情報をエッジ情報（１１１）に作成しておく。ステップ６０４のエッジ修正処理の後、ステップ６０５→６０１→６０２と進み、図７のエッジ距離最短経路探索処理では、エッジ修正情報（１１３）が無いので、ステップ７０１〜７０４，７１１〜７１７が実行される。これにより、連結エッジテーブル（１１７）に、全ての特殊ノード間を連結する連結エッジ情報、および、それらの特殊ノード間の全ての部分区間のエッジ情報が作成され、さらにエッジ距離最短エッジテーブル（１１８）には、全てのノード間の最短経路のエッジ情報（上述の修正後のf,t間とt,f間のエッジ情報を含む）が作成される。その後、ステップ６０３→６０６と進む。
【００７７】
図１０は、図６中のゾーン情報更新処理（ステップ６０６）の詳細を表すフローである。まず、ゾーンIDでループする（ステップ１００１）。ループ内では、変数midにzidゾーンの主ノードIDを代入する（ステップ１００２）。次に、ノードIDでループする（ステップ１００３）。具体的には、変数nidに１からノード数までのノードIDを順に設定しながらループする。このループ内では、まず、nidとmidが同一か調べる（ステップ１００４）。同一なら、次のノードにループを進める。nidとmidが同一でないなら、nidがzidゾーン所属かを判別し（ステップ１００５）、所属していたら、次のノードにループを進める。nidがzidゾーン所属か否かは、ノードnidのノード情報（１１０）のゾーンID配列（２０３）にzidが含まれているか否かで判別できる。nidがzidゾーン所属でないなら、変数dにmid,nid間の最短エッジ距離を代入する（ステップ１００６）。これは図７で作成したエッジ距離最短エッジテーブル（１１８）を参照すればよい。次に、dがzidゾーンの適用距離範囲（２２４）内の距離か判別する（ステップ１００７）。そうであれば、zidのゾーン情報（１１５）の範囲内ノードID配列（２２５）にnidを追加する（ステップ１００８）。dがzidゾーンの適用距離範囲（２２４）内でなければ、次のノードにループを進める。全てのループを抜けたら、終了する。以上の処理により、全てのゾーン情報（１１５）の範囲内ノードID配列（２２５）が設定される。
【００７８】
図１１は、図６中の区分分割処理（ステップ６０７）の詳細を表すフローである。この処理は、区分内最短経路が、エッジの移動コストとしてエッジ距離と運賃距離のどちらを利用しても、同一の最短経路になるようにするものである。最短経路が一致しない可能性がある場合には、その原因となる区分内の閉路を構成する可能性があるエッジをサブ区分として分割する。
【００７９】
まず、変数kに１から順に区分IDを格納し、該区分IDでループする（ステップ１１０１）。ループ内では、まず、変数subに２を代入する（ステップ１１０２）。次に、配列Eにエッジ情報（１１１）の区分kの全エッジIDを代入する（ステップ１１０３）。次に、配列Eで末端となるノードがある間、ループを実行する（ステップ１１０４）。ここでの末端となるノードとは、ノード情報（１１０）のノード種別（２０５）で末端となっているノードではなく、配列Eに格納されているエッジ集合において末端ノードとなっているノードのことである。ループ内では、末端ノード接続エッジを配列Eから削除する（ステップ１１０５）。以上により、配列Eには、環状線を構成するエッジだけが（存在すれば）残ることになる。
【００８０】
ループを抜けたら、まず配列Eに境界ノード接続エッジがあるか調べる（ステップ１１０６）。ここでの境界ノードは、ノード情報（１１０）のノード種別（２０５）で境界ノードとなっているノードである。境界ノード接続エッジがあれば、次に配列Eの全要素について運賃距離がエッジ距離と等しいかチェックする（ステップ１１０７）。全エッジの運賃距離がエッジ距離と等しいなら、この区分は分割する必要がないので、次の区分にループを進める。
【００８１】
ステップ１１０６で境界ノード接続エッジがない場合、あるいはステップ１１０７で運賃距離とエッジ距離が等しくない要素が配列Eに存在する場合は、ステップ１１０８に進む。配列Eに要素がある間、以下のループを実行する（ステップ１１０８）。ループ内では、まず、配列Eの要素を１つ削除し、削除したエッジIDを変数eに代入する（ステップ１１０９）。次に、変数e2にeの逆方向エッジを代入し、配列Eから削除する（ステップ１１１０）。次に、eの発着ノードのノード情報（１１０）のノード種別（２０５）を境界ノードに設定する（ステップ１１１１）。次に、エッジ情報（１１１）内にあるエッジeとe2のレコードおよび連結エッジテーブル（１１７）内にある、eおよびe2と発着ノードが同一のレコードのサブ区分（２１１）に変数subの値を設定する（ステップ１１１２）。
次に、連結エッジテーブル（１１７）内にある、エッジeまたはe2を経路内に含み、その他のエッジと連結しているレコードを削除する（ステップ１１１３）。つまり、この処理は連結エッジテーブル（１１７）内の、ステップ１１１１で新しく境界ノードに変更されたノードを途中で通過する連結エッジを全て削除する。
次に、subに１を加える（ステップ１１１４）。次に、配列Eで末端となるノードがある間、ループを実行する（ステップ１１１５）。ループ内では、末端ノード接続エッジを配列Eから削除する（ステップ１１１６）。全てのループを抜けたら、終了する。
【００８２】
以上の図１１の処理により、区分内の閉路を構成するエッジがサブ区分として分割されたことになる。
【００８３】
図１２は、図６中の区分合成処理（ステップ６０８）の詳細を表すフローである。まず、この処理の概要を説明する。
【００８４】
２つの区分1と2に対して、区分1と2のみを通過する経路の運賃が区分2表の運賃換算情報（１１２）によって算出され、同一距離に対して、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の両方を通るケースで最短経路を求める必要がある。その３つの最短経路の中に最安の経路があるはずである。しかし、もし同一距離に対して常に1表運賃 ≦ 2表運賃であるなら、上記(2)と(3)の条件は、(4)区分1と区分２のエッジをあわせたエッジ集合に対する最短経路、と統合することができる。なっぜなら、(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のそれぞれの最短経路から求めることができる。このようにして、図１２の区分合成処理では合成可能な最大の区分の組み合わせを算出する。
【００８６】
図１２のフローを説明する。まず、配列KMを空に初期化し、配列KPに全区分の区分IDを代入する（ステップ１２０１）。KMは、合成する区分を設定するグローバル変数（配列）である。次に、区分IDをセットする変数kに初期値として1を代入する（ステップ１２０２）。次に、区分kが最大区分ID以下かを調べ（ステップ１２０３）、区分kの全エッジのサブ区分に２がないかを調べ（ステップ１２０４）、区分kの全エッジのエッジ距離が運賃距離と等しいかを調べ（ステップ１２０５）、運賃換算情報で同一距離を与えた場合にKM表運賃がk表運賃以下かを調べる（ステップ１２０６）。ステップ１２０３〜１２０６を全て満たす場合はステップ１２０７に進み、それ以外はステップ１２２３に進む。
【００８７】
次に、KMが空かを調べる（ステップ１２０７）。空でない場合には、次に進む。次に、KM+k表とk表が同一か調べる（ステップ１２０８）。同一とは、同一距離なら同一運賃を返すということである。次に、KPからkを削除する（ステップ１２０９）。次に、変数kpcntに、2のKP要素数乗から1を引いた値を代入する（ステップ１２１０）。kpcntは、KPの部分集合を生成するために用いる。次に、kpcntが０より大きいかを調べる（ステップ１２１１）。kpcntが０以下である場合、KMにkを追加し（ステップ１２２２）、kに１を加えて（ステップ１２２３）、ステップ１２０３に戻る。またステップ１２０７でKMが空だった場合は、ＫＰからkを削除し（ステップ１２２１）、その次にステップ１２２２に進む。
【００８８】
ステップ１２１１でkpcnt＞0のときは、kpcntのビット列から、KPの部分列KP2を生成する（ステップ１２１２）。この処理は、kpcntで“1”が立っているビットのビット位置に対応するKPの要素（例えば、kpcntの２0ビットをKPの第１番目の要素に対応させ、kpcntの２1ビットをKPの第２番目の要素に対応させ、同様にして、kpcntの２nビットをKPの第n+1番目の要素に対応させる）をKP2に格納する処理である。次に、変数kmcntに2のKM要素数乗から1を引いた値を代入する（ステップ１２１３）。kmcntの意味はkpcntと同じで、KMに対するビット列である。次に、kmcntが０以上か調べる（ステップ１２１４）。０未満の場合は、kpcntから１を引いて（ステップ１２２０）、ステップ１２１１に戻る。次に、kmcntのビット列から、KMの部分列KM2を生成する（ステップ１２１５）。この処理は、ステップ１２１２でKPに対して行った処理をKMに対して行うものである。次に、KM2にkを追加する（ステップ１２１６）。次に、KM2+KP2表とKM+KP2表が同一かを調べる（ステップ１２１７）。同一でない場合は、KPにkを戻して（ステップ１２１９）、ステップ１２２４に進み、同一なら、kmcntから１を引いて（ステップ１２１８）、ステップ１２１４に戻る。
【００８９】
ステップ１２１０〜１２２０の処理は、要するに、いまKMにkが合成できるかどうかを調べているのであるが、その合成しようとしている区分の組み合わせKM+kが、合成されていない残りの配列KP内の区分のどのような部分集合と結びついたとしても、結局はKM+kの合成されようとしている区分のどこを通っても同じ運賃表を使うことになる、ということを確認しているものである。ステップ１２１１でNoとなってステップ１２２２に進むケースが、それが確認されてKMにkの合成が可能であると言うことである。ステップ１２１７でNoとなりステップ１２１９に進むケースは、それが確認できず合成ができない場合である。
【００９０】
ステップ１２２４まで進んだら、合成可能な区分IDがKM内に格納されている。KM要素数が１の場合は（ステップ１２２４）、合成する区分がなかったということであるから、KMの要素をKPに移動する（ステップ１２２５）。次に、ノード種別が境界ノードとなっているノードのノード情報（１１０）のうち、KMにある区分しか接続していないものを交差ノードに変更する（ステップ１２２６）。次に、運賃換算情報比較処理を実行し（ステップ１２２７）、処理を終了する。この処理の詳細は図１３で説明する。
【００９１】
図１２の処理により、KMに、合成可能な最大の区分の組み合わせが設定されたことになる。合成可能な最大の区分の組み合わせを求めておくことにより、後の例えば図１６のステップ１６０５で処理を簡略化することができる。
【００９２】
図１３は、図１２中の運賃換算情報比較処理（ステップ１２２７）の詳細を表すフローである。この処理では、図１２の処理で合成された区分と合成されなかった任意の区分の組み合わせとを組み合わせた場合に、部分集合となっている組み合わせの運賃換算情報が同一距離で高い運賃にならないことを判定する。判定結果がtrueになった場合、図１７での最安経路探索の枝狩り判定処理で、現在の最安経路と探索途中の経路運賃の比較によって、探索の枝を限定することができる。この判定処理も、図１２と基本的な意味は同じで、合成区分を必ず通過する経路が、合成されていない区分を新たに通過する場合、その運賃が安くならないことを保証するものである。
【００９３】
まず、配列Kに配列KM以外の全ての区分IDを代入する（ステップ１３０１）。KMは図１２で作成された合成区分である。次に、配列Kを引数に再帰判定ルーチンを呼び出す（ステップ１３０２）。再帰判定結果がtrueなら（ステップ１３０３）、枝狩り判定可能を設定し（ステップ１３０４）、falseなら、枝狩り判定不可能を設定する（ステップ１３０５）。枝狩り判定可能／不可能の結果は、グローバル変数に格納しておけばよい。この結果は、図１７のステップ１７１０で参照される。
【００９４】
次に、再帰判定ルーチンについて説明する。まず、引数として区分ID配列Kを受け取る（ステップ１３０６）。次に、変数bretにtrueを代入する（ステップ１３０７）。変数bretの値は再帰判定ルーチンの判定結果を表し、呼び出し元に通知される。次に、Kの要素が空なら（ステップ１３０８）、bretを返してリターンする。空でなければ、Kの要素でループする（ステップ１３０９）。このループ内では、まず、配列K2にKをコピーする（ステップ１３１０）。次に、K2からK[i]を削除する（ステップ１３１１）。このとき、K2が空になってもよい。次に、K2内の全エッジ（エッジ情報（１１１）内のエッジのうち、K2内の区分に属する全エッジ）のエッジ距離と運賃距離が同一かチェックする（ステップ１３１２）。条件を満たす場合はステップ１３１３に進む。K2が空のときもステップ１３１３に進むものとする。次に、２つの運賃換算情報K+KM表とK2+KM表に対して同一距離を与えた場合に「K+KM表運賃≧K2+KM表運賃」が成り立つかチェックする（ステップ１３１３）。これが成り立つ場合、K2+KMの区分を通過する経路を延長してk[i]を新たに通過する経路は、元の経路より運賃が安くならないことが保証される。もし、条件を満たすなら、K2を引数に指定して再帰判定ルーチンを呼び出す（ステップ１３１４）。その判定処理結果がfalseなら（ステップ１３１５）、またはステップ１３１２、１３１３が条件を満たさなかったら、bretにfalseを代入し（ステップ１３１６）、処理を終了する。ループを抜けたら処理を終了する。ステップ１３１４の判定処理結果がtrueなら、ループを進める。このループを抜けた場合、変数bretにはtrueが格納されている。
【００９５】
なお、ここでの判定処理は、図１７で枝狩り判定可能な十分条件の一例を示すものであり、入力データの条件を絞ることで、さらに枝狩り判定条件を拡張することも可能である。
【００９６】
図１４は、図６中の区分内最短エッジテーブル作成処理（ステップ６０９）の詳細を表すフローである。この処理は、区分とサブ区分を限定したエッジ集合に対して図７のステップ７１１以降の処理を適用し、その結果を区分内最短エッジテーブル（１１９）に格納するものである。なお、区分内最短エッジテーブル（１１９）は、区分とサブ区分を限定した範囲内における全ノード間の最短経路探索結果の経路を格納するためのテーブルであり、そのレコードフォーマットは図２で説明したエッジ情報（１１１）と同じである。
【００９７】
まず、区分とサブ区分でそれぞれループする（ステップ１４０１、１４０２）。このループ内では、まず、配列Espに、連結エッジテーブル（１１７）中の区分kかつサブ区分sの特殊ノード間エッジIDを全て代入する（ステップ１４０３）。この処理では、図１２の区分合成処理によって作成された合成区分配列KMに区分kが含まれている場合、KM内で区分kより優先度の低い区分の特殊ノード間連結エッジもEspに追加する。次に、配列Nspに、Espで発着ノードとなっている全ての特殊ノードIDを代入する（ステップ１４０４）。これで、ノード集合Nspとエッジ集合Espで表されるグラフG(Nsp,Esp)が確定する。次に、Nspの全特殊ノードの組み合わせに対する最短経路探索を実行する（ステップ１４０５）。この処理は、グラフG(Nsp,Esp)に対する最短経路探索であり、ダイクストラ法またはワーシャルフロイド法が適用できるため、詳細は省略する。探索結果は、区分内最短エッジテーブル（１１９）に追加する。
【００９８】
次の処理では、区分内の任意のノード間に対する最短経路探索を行う。まず、配列Nに区分kかつサブ区分sのエッジの全発着ノードIDを代入する（ステップ１４０６）。この処理では、ステップ１４０３と同様に、KMにkが含まれていれば、KM中のkより優先度の低い区分のエッジの発着ノードも含める。次に、Nに含まれるノードIDの組み合わせのループを実行する（ステップ１４０７、１４０８）。ここでは、i＜jとなるようにループを回し、j,i間の結果はi,j間の結果の逆方向経路で追加している。
【００９９】
ループ内では、まず、N[i],N[j]間エッジが区分内最短エッジテーブル（１１９）内に既にあるかチェックする（ステップ１４０９）。もしあるなら、次のノード間探索に進む。なければ、配列Eに以下の条件のエッジIDを格納する（ステップ１４１０）。まず、N[i]が一般ノードの場合はその隣接特殊ノードをa,bとし、N[i]が特殊ノードの場合はa＝b＝N[i]とする。次に、N[j]が一般ノードの場合は隣接特殊ノードをp,qとし、N[j]が特殊ノードの場合はp＝q＝N[j]とする。そして、配列Eに、ステップ１４０５で算出した特殊ノード間の区分内最短エッジ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]間の最短経路を探索する（ステップ１４１１）。この処理は、図７のステップ７１７と同じである。最短となる経路が見つかったら、区分内最短エッジテーブル（１１９）に、逆方向経路とともに追加する。全てのループを抜けたら、処理を終了する。
【０１００】
以上の図１４の処理により、区分とサブ区分を限定した範囲内での全ノード間の最短経路が、区分内最短エッジテーブル（１１９）に設定された。
【０１０１】
図１５は、図６中の最安経路探索処理（ステップ６１０）の詳細を表すフローである。この処理では、まず主ノードとそれ以外のノード間の経路を先に算出しておき、その後、任意ノード間の経路を探索する。このとき、ゾーン内ノードと図１１のゾーン情報更新処理によって設定された距離範囲内ノード間の経路は、先に算出しておいた主ノードと距離範囲内ノード間の経路に置き換える。
【０１０２】
まず、配列Nmに主ノードとなっている全ノードIDを、配列Nには全エッジの発着ノードIDを代入する（ステップ１５０１）。次に、配列Nmの要素でループする（ステップ１５０２）。次に、配列Nの要素でループする（ステップ１５０３）。ループ内では、まず、Nm[i]とN[j]が同一かチェックし（ステップ１５０４）、同一なら次のノードにループを進める。同一でなければ、運賃表（１２０）にNm[i],N[j]間結果があるかチェックし（ステップ１５０５）、あるなら次のノードにループを進める。なければ、ノードN[j]が所属するゾーンでループする（ステップ１５０６）。まず、変数mjに現在のループでのゾーンzjの主ノードIDを代入する（ステップ１５０７）。次に、N[j]とmjが同一かチェックし（ステップ１５０８）、同一ならゾーンのzjのループを抜ける。同一でなければ、Nm[i]がzjゾーンの範囲内ノードかチェックし（ステップ１５０９）、範囲内ノードなら次のノードにループを進める。zjループを抜けたら、まず、Nm[i],N[j]間最安経路探索処理を実行する（ステップ１５１０）。この処理の詳細は図１６で説明する。
【０１０３】
j、iのループを抜けたら、今度は、i,jそれぞれ配列Nの要素でループする（ステップ１５１１、１５１２）。このとき、i＜jとなるようにループを回す。ループ内では、まず、運賃表（１２０）にN[i],N[j]間結果があるか調べ（ステップ１５１３）、あるなら、次のノードにループを進める。なければ、変数fにN[i]を、変数tにN[j]を代入する（ステップ１５１４）。次に、N[j]がN[i]所属ゾーン範囲内ノードなら（ステップ１５１５）、変数fにN[i]所属ゾーンの主ノードIDを代入する（ステップ１５１６）。次に、N[i]がN[j]所属ゾーン範囲内ノードなら（ステップ１５１７）、変数tにN[j]所属ゾーンの主ノードIDを代入する（ステップ１５１８）。
【０１０４】
次に、運賃表（１２０）にf,t間結果があるか調べる（ステップ１５１９）。もしその結果があるなら、そのf,t間とt,f間の運賃（３０３）を、N[i],N[j]間とN[j],N[i]間の運賃表（１２０）のレコードの運賃（３０３）にコピーし（ステップ１５２０）、次のノードにループを進める。このコピー処理は、図６の特定区間運賃更新処理の終了後に改めて行っても良い。特定区間運賃とゾーンによる発着ノードの入れ替えはどちらが優先されるかは、予め決められているものとし、ゾーンのほうが優先されるなら、図６で改めてコピー処理を行うものとする。ステップ１５１９で当該結果がなければ、N[i],N[j]間最安経路探索処理を実行する（ステップ１５２１）。この処理の詳細は図１６で説明する。全てのループを抜けたら、終了する。
【０１０５】
上記の図１５の処理により、任意の全ノード間の最安経路が運賃表（１２０）に設定された。
【０１０６】
図１６は、図１５中の指定ノード間最安経路探索処理（ステップ１５１０，１５２１）の詳細を表すフローである。まず、指定された探索対象ノード間の始発ノードIDを変数fに、終着ノードIDを変数tに代入する（ステップ１６０１）。次に、f,t間のエッジ距離最短エッジがエッジ距離最短エッジテーブル（１１８）内にあるか調べ（ステップ１６０２）、なければ到達不可能なので処理を終了する。次に、当該f,t間エッジ距離最短経路を初期解として運賃表（１２０）に追加する（ステップ１６０３）。ここで、経路に対する運賃（３０３）は、後述する図１８の経路運賃算出処理によって算出する。以下、経路に対する運賃を求めるときは同様である。次に、区分内最短エッジテーブル（１１９）内にあるf,t間の全ての区分内最短エッジに対して、それぞれ現在の運賃表（１２０）の最安経路と運賃を比較し、最安の経路で運賃表（１２０）を更新する（ステップ１６０４）。
【０１０７】
次に、以下の条件で、区分内最短エッジID配列Ebdを構成する（ステップ１６０５）。まず、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内での最高優先度の区分以外の区分内最短エッジは除外する。なぜなら、図１４の区分内最短経路探索において、ＫＭの最高優先度区分での最短経路は、ＫＭの全ての区分のエッジを通ることが許されている。すなわち、最高優先度区分の区分内最短経路は合成区分ＫＭにおける最短経路となっているからである。
【０１０９】
次に、以下の条件で、t到着の区分内最短エッジID配列Etを構成する（ステップ１６０６）。まず、Etにはステップ１６０５での条件(2)のエッジを格納する。もしEtの要素数が、予め定めてある一定数以上になった場合、Etには区分内最短エッジではなく、t到着の全ての連結エッジを格納する。それでも数が多い場合には、Etを空にする。次に、配列Rを空で初期化し（ステップ１６０７）、再帰探索ルーチンを呼び出す（ステップ１６０８）。なお、上記配列Ebd、Et、および経路Rは、再帰探索ルーチンから参照可能なグローバル変数とする。探索が終了したら、t,f間の最安経路をf,t間の運賃表（１２０）の逆方向経路で追加し（ステップ１６０９）、処理を終了する。
【０１１０】
次に、再帰探索ルーチンについて説明する。まず、経路Rがtに到達していたら（ステップ１６１０）、経路Rの運賃と運賃表（１２０）の最安運賃とを比較し（ステップ１６１７）、経路Rの運賃が安くなっていたら、運賃表（１２０）を経路Rで更新して（ステップ１６１８）、リターンする。ステップ１６１０で経路Rがtに到達していないときは、配列Cに、経路Rと連結可能なEbdのエッジIDの候補を全て代入する（ステップ１６１１）。ここで、連結可能とは、経路Rの現在の終着ノードを出発し、経路Rの最終エッジと異なる区分とサブ区分のエッジで、かつ、経路Rの通過ノードを再度経由しないものを指す（経路Rが空なら、fを出発するEbdの全エッジを候補とする）。次に、配列Cの要素でループする（ステップ１６１２）。ループ内ではまず、経路RにC[i]を連結する（ステップ１６１３）。次に、枝狩り可能であるかを判定する（ステップ１６１４）。この判定は、図１７の枝狩り判定処理の結果に従う。枝狩りが不可能な場合は、再帰探索を呼び出す（ステップ１６１５）。次に、経路Rから最終エッジを削除する（ステップ１６１６）。ループを抜けたらリターンする。
【０１１１】
図１７は、図１６のステップ１６１４の枝狩り判定処理を表すフローである。この処理は、現在の経路Rをこれ以上延長しても、探索対象の区間の現在の最安経路より安い経路となり得ないことを判定する。
【０１１２】
まず、変数bretにtrueを代入する（ステップ１７０１）。この変数bretの値は、判定結果として呼び出し元に通知される。次に、配列R2に経路Rをコピーする（ステップ１７０２）。次に、R2の要素数が１かチェックする（ステップ１７０３）。もし要素数が１なら、ステップ１７１０に進み、そうでないなら以下に進む。
【０１１３】
次に、配列R2の始発終着ノードと同一始発終着のエッジ距離最短エッジをエッジ距離最短エッジテーブル（１１８）内から探し、その経路を配列Sに代入する（ステップ１７０４）。次に、経路R2のエッジ距離がSのエッジ距離を超えていたら（ステップ１７０５）、以下に進む。次に、経路R2の運賃距離がSの運賃距離を超えていたら（ステップ１７０６）、以下に進む。次に、配列Krに経路R2の通過区分IDを、配列KsにSの通過区分IDを、それぞれ代入する（ステップ１７０７）。ここでは、Kr,Ksそれぞれに対して、図１２で算出された合成区分配列KMの要素を含んでいる場合には、それら全ての区分をKM通過とみなして、KMに置き換える。次に、KsがKrと同一なら（ステップ１７０８）、処理を終了する。この場合、bretはtrueなので枝狩り可能が通知される。ステップ１７０５、１７０６、１７０８でそれぞれ条件を満たさなかった場合は、R2から先頭エッジを削除し（ステップ１７０９）、ステップ１７０３に戻る。
【０１１４】
ステップ１７０３でR2の要素数が１のときは、図１３の運賃換算情報比較処理で枝狩り判定可能が設定されたかを調べ（ステップ１７１０）、RがKMを通過するかを調べ（ステップ１７１１）、現在の最安経路がKMを通過しR通過区分のみを通過しているかを調べる（ステップ１７１２）。この処理でも、合成区分KMは１つの区分として取り扱う。図１２の運賃換算情報比較処理によって、枝狩り可能が設定されている場合、KMを通過する任意の区分配列A,Bに対して「A⊆B」が成り立っていれば、「A表≦B表」も成り立つことが保証されているので、Rの運賃が最安運賃を超えた場合は、その後どのような経路をたどっても最安運賃以下になることはない。上記の条件のうち１つでも条件を満たさない場合は、ステップ１７２０に進み、それ以外の場合は、以下に進む。
【０１１５】
次に、配列Etが空かチェックする（ステップ１７１３）。Etは図１６のステップ１６０６で構成された配列で、経路の終着ノードを到着ノードとする全てのエッジが格納されている。Etに要素がある場合、Etの要素でループする（ステップ１７１４）。ループ内ではまず、RにEt[i]を追加する（ステップ１７１５）。次に、Rの運賃と最安運賃を比較し（ステップ１７１６）、最安運賃がRの運賃以上なら、bretにfalseを代入して（ステップ１７１８）、終了する。この場合、呼び出し元には枝狩り不可能が通知される。最安運賃よりRの運賃が大きいときは、ステップ１７１５で追加したRの最終エッジを削除して（ステップ１７１７）、ループを進める。ループを抜けたら、処理を終了する。この場合、呼び出し元には枝狩り可能が通知される。ステップ１７１３でEtが空だった場合は、Rの運賃と現在の最安運賃を比較し（ステップ１７１９）、Rの運賃が最安運賃以下ならbretにfalseを代入し（ステップ１７２０）、処理を終了する。bretがtrueなら枝狩り可能、falseなら枝狩り不可能が呼び出し元に通知される。
【０１１６】
図１８は、図１６のステップ１６０３等で利用する経路運賃算出処理を表すフローである。まず、配列Rに運賃を算出する経路を代入する（ステップ１８０１）。次に、変数costを0で初期化する（ステップ１８０２）。次に、経路配列Rの要素が空かチェックする（ステップ１８０３）。経路配列Rが空なら処理を終了する。次に、配列Kに経路配列Rの通過区分IDを代入する（ステップ１８０４）。ここでもし、経路配列Rが図１２の区分合成処理で作成された合成区分配列KM内の区分を通過する場合は、KMの全区分を通過するものとしてKにKMを追加する。次に、変数edistに経路配列Rの総エッジ距離を代入する（ステップ１８０５）。次に、edistがKの運賃距離適用範囲（運賃距離適用範囲情報（１１４）を参照する）内なら（ステップ１８０６）、edistに経路配列Rの総運賃距離を代入する（ステップ１８０７）。次に、Kの運賃換算情報に距離edistを照らし合わせ、costに運賃を代入し（ステップ１８０８）、処理を終了する。処理終了時のcostの値が、指定された経路の運賃となる。
【０１１７】
図１９は、図６中の特定区間運賃更新処理（ステップ６１１）を表すフローである。まず、特定区間運賃情報（１１６）を更新フラグ（２２９）順でソートする（ステップ１９０１）。これは、後述の再帰処理による更新が、直接指定された運賃に対して優先されるかどうかに関わるもので、その優先順位は予め決められているものとして、降順昇順のどちらでソートするかも決められているものとする。次に、特定区間運賃更新情報でループする（ステップ１９０２）。ループ内ではまず、変数iに特定区間の始発ノードID（２２６）を、変数jに終着ノードID（２２７）を、変数nにi,j間更新運賃（２２８）を、変数fに更新フラグ（２２９）を代入する（ステップ１９０３）。次に、i,j,n,fを引数にして再帰関数を呼び出す（ステップ１９０４）。ループを抜けたら処理を終了する。
【０１１８】
次に、再帰関数ルーチンについて説明する。まず、与えられた引数から、変数iに特定区間の始発ノードIDを、変数jに終着ノードIDを、変数nにi,j間更新運賃を、変数fに更新フラグを代入する（ステップ１９０５）。次に、変数oにi,j間の運賃表（１２０）での運賃（３０３）を代入する（ステップ１９０６）。次に、oがn未満で（ステップ１９０７）、更新フラグfで強制更新が指定されていたら（ステップ１９０８）、i,j間、j,i間運賃を更新運賃nに更新する（ステップ１９０９）。次に、更新情報をログに出力する（ステップ１９１０）。ここでは、運賃が更新されていない場合でもログに出力するものとする。ログ出力が終わったら、処理を終了する。
【０１１９】
ステップ１９０７でoがn以上だった場合は、さらにoとnを比較し（ステップ１９１１）、o＝nの場合はステップ１９１０に進み、ログを出力して、処理を終了する。o＞nだった場合は、i,j間、j,i間運賃を更新運賃nに更新する（ステップ１９１２）。次に、更新フラグfで再帰更新が指定されているかチェックする（ステップ１９１３）。指定されていなければ、ステップ１９１０に進み、ログ出力後、処理を終了する。
【０１２０】
ステップ１９１３で再帰更新が指定されている場合は、配列Njに、jとエッジでつながっている全ノードIDを代入する（ステップ１９１４）。次に、Njの要素でループする（ステップ１９１５）。ループ内ではまず、i,Nj[p]間の最安経路がノードjを通過するか調べる（ステップ１９１６）。通過しない場合は、引数にi,Nj[p],n,fを指定して再帰関数を呼び出す（ステップ１９１７）。ループを抜けたら、配列Niにiの隣接ノードIDを代入する（ステップ１９１８）。次に、Niの要素でループする（ステップ１９１９）。ループ内ではまず、Ni[q],j間の最安経路がノードiを通過するか調べる（ステップ１９２０）。通過しない場合は、引数にNi[q],j,n,fを指定して再帰関数を呼び出す（ステップ１９２１）。ループを抜けたら、i,j間の更新ログを出力して処理を終了する。
【０１２１】
図２０は、図４中の出力処理（ステップ４０３）を表すフローである。まず、運賃表（１２０）を出力する（ステップ２００１）。このときの出力形式では、経路を出力するかどうかは任意である。また、始発と終着の運賃は同一であるため、ノードIDの小さいほうから大きいほうへの区間のみを出力してもよい。次に、指定があれば、i,j間の最安経路を出力する（ステップ２００２）。次に、指定があれば、特定区間運賃更新ログを出力し（ステップ２００３）、処理を終了する。
【符号の説明】
【０１２２】
１０１…入力装置、１０２…表示装置、１０３…出力装置、１０４…処理装置、１０５…プログラム、１０６…入力処理部、１０７…運賃表作成処理部、１０８…出力処理部、１０９…記憶装置、１１０…ノード情報、１１１…エッジ情報、１１２…運賃換算情報、１１３…エッジ修正情報、１１４…運賃距離適用範囲情報、１１５…ゾーン情報、１１６…特定区間運賃情報、１１７…連結エッジテーブル、１１８…エッジ距離最短エッジテーブル、１１９…区分内最短エッジテーブル、１２０…運賃表、１２１…特定区間運賃更新ログ。
【図１】
2011065406.tif 000003
【図２】
2011065406.tif 000004
【図３】
2011065406.tif 000005
【図４】
2011065406.tif 000006
【図５】
2011065406.tif 000007
【図６】
2011065406.tif 000008
【図７】
2011065406.tif 000009
【図８】
2011065406.tif 000010
【図９】
2011065406.tif 000011
【図１０】
2011065406.tif 000012
【図１１】
2011065406.tif 000013
【図１２】
2011065406.tif 000014
【図１３】
2011065406.tif 000015
【図１４】
2011065406.tif 000016
【図１５】
2011065406.tif 000017
【図１６】
2011065406.tif 000018
【図１７】
2011065406.tif 000019
【図１８】
2011065406.tif 000020
【図１９】
2011065406.tif 000021
【図２０】
2011065406.tif 000022