web-dev-qa-db-ja.com

ルートクリエーターの構築

さて、すでに前もって、これは私が取っているデータ構造コースのボーナスタスクであることをお伝えします。これが宿題のためであるかどうかにかかわらず、それはすべての質問の世話をするはずです。

ルート作成者

会社が特定のデータセットのルートを作成する必要があるタスクがあります。データセットはすべての操作に対して入力でき、最終的には最適なルートを出力する必要があります。条件は次のとおりです。

  • 通りは南北または東西にのみ向けることができ、2つの通りの間のあらゆる角度を90度で効果的に作成します。
  • データセットには、通り、ジャンクション、クライアントを選ぶ場所、クライアントを降ろす場所、および車の出発地が含まれます。

私の問題は、これを行うための正しいデータ構造の方法を考えるのに苦労していることです。頭のてっぺんから最初に出てきたのは有向グラフでした。理論的には、完全にフィットするはずです

  • 通りは数値識別子で前もって入力されます
  • ノードはジャンクションを表し、通りのIDで表されます
  • 2つのノード間のエッジは通りの一部を表し、長さがあります
  • 関心のある場所は、事実上、ジャンクションノードのサブクラスであるため、あるノードから別のノードまでの距離があります。

次に、車の出発地からクライアントの出発地までの最短経路+クライアントの出発地からクライアントの終了場所までの最短経路+の終了場所からの最短経路を見つけることによって最適ルートが計算されます。車の出発地へのクライアント。

この問題に関する私の考えは、遠く離れたところでさえ正しいですか?有向グラフ以外のデータ構造でこれをイメージするのは非常に難しいと感じていますが、この考え方で選択肢を制限しているだけかもしれません。

4

すべての道路がN_SまたはE_Wを実行していることを知っていると、 A *アルゴリズム の優れたヒューリスティックを簡単に計算できるようになると思います。これを解決するための最良の汎用アルゴリズムのようです。

このような優れたヒューリスティックを使用すると、大規模な剪定を実行できるため、非常にまばらな構造を使用できるはずです。

編集-ヒューリスティックについて詳しく説明する要求に応じて:A *アルゴリズムでは、 許容ヒューリスティック 、{h(x)}が必要です。現在のノードからターゲットまでの距離の推定。ヒューリスティック、つまり現在のポイント(x)からゴールまでの距離の推定値を「許容」するには、実際の距離以下である必要があります。実際の道路は直線よりも短くなることはないため、通常は2点間の直線距離(「カラスが飛ぶように」)を使用します。

あなたの問題では、すべての道路が南北または東西に走っているので、斜めの道路はないと言われています。具体的な例を見てみましょう。点(0,0)から始まり、(10,10)まで移動するための最小距離h(x)を推定したいとします。これは一辺が10の正方形であるため、通常、(0,0)から(10,10)に直進する道路が存在する可能性があると推定されるため、直線距離は200の平方根になります。または約14.14。しかし、あなたの場合、すべての道路がN-SまたはE-Wを走っているので、可能な最小距離は20であることがわかります。もちろん、実際の距離は、利用可能な道路によってはもっと長くなる可能性があります。

2つの点(x1、y1)に対して許容可能なヒューリスティックがあるため、(x2、y2)はh(x) =(abs(x2-x1)+ abs(y2-y1)) ; this h(x)は常に直線距離以上であるため、より小さな解空間につながるという点で「より優れた」ヒューリスティックです。言い換えれば、より大きな木の剪定。

5
JonnyBoats

道路網とルート検索アルゴリズムは、グラフを使用して、A *、ダイクストラのアルゴリズム、または検索用のアルゴリズムのバリエーションを使用してモデル化するのが最適であることは間違いありません。

あなたの場合、交差点をノードとしてモデル化し、道路をエッジとしてモデル化する必要があることは間違いありません。商用GPSパッケージの作成者として、私は各道路の始点をノードとしてモデル化します(したがって、3つの道路のジャンクションには3つのノードがあります)。このより複雑なモデルでは、ターンコスト(特にUターンを高価にする)とターン制限をカウントできます。

すべての道路の制限速度が同じであるか、最短距離を見つけたい場合は、A *が適切なアルゴリズムですが、h(x)が実際のパスコストに十分に近づいていない場合は、 A *ルーティングは、より単純なダイクストラアルゴリズムに比べて速度の利点がない場合があります。元々はA *を使用していましたが、最近では、h(x)を計算する余分なオーバーヘッドがなく、A *と考えることができる修正された双方向ダイクストラアルゴリズムを使用しています。

すべての道路がグリッド上にあるという事実は、選択するデータ構造に影響を与える可能性がありますが、コードを2つの部分に分割できます。1つは、保存方法に関係なく任意のグラフをサポートする一般的なA *またはDijkstraアルゴリズムであり、もう1つはデータ構造の実装の詳細を処理します。

2
Qwertie

有向グラフは、あなたの場合の最良のアプローチであるはずです。通りは南北または東西にしか向かないという制約を考慮して、より最適な構造を考案できる可能性があることはおそらく真実ですが、この可能性について考えるのに時間を無駄にすることはありません。人工的な制約の解決策であり、それはよりハッキーで学術的でないデータ構造をもたらすでしょう。ドメインのマップを描画するように求められた場合は、この制約を考慮に入れることをお勧めしますが、それだけです。

1
Mike Nakis

ジャンクションのグリッド(2次元配列)を作成します。各ジャンクションには、南向きと東向きの出口があります(北と西の出口は隣接するセルからの出口です)。各出口には、名前と番号の間隔があります。これにより、ナビゲートできます。

簡単に検索できるように、特定のストリート名はジャンクション参照のリストです。

1
user1249