2010-12-29 12 views
1

私は現在、無限グリッド上のパスを計算するためにA *経路探索アルゴリズムを使用しています(GridWorldのUnboundedGrid、AP CSのケーススタディ、誰にも役立つ場合)。エンドノードが完全に壁に囲まれているため、有効なパスが存在しない場合を除いて、すべてが素晴らしく機能します。予想どおり、アルゴリズムは無限に探索を続け、エンドノードを見つけることはありません。私の経路探索エリアの周りに境界線を置くことは許容されますか?

可能な解決策は、開始ノード、終了ノード、およびすべての壁を確認しながら、不可視(ユーザーは表示されていませんがアルゴリズムはそうしているように)、経路探索領域全体の壁を配置することですノードはこれらの壁の中にあり、2〜3個のスペースが埋められています。ような何か:

_________________________________ 
|        | 
|    S |    | 
|   _____| _____  | 
|      | E |  | 
|      |___|  | 
|_______________________________| 

...最終的にすべてのノードがclosedlistに追加されますアイデアビーイングは、openlistは空になり、その時点で私は有効なパスが存在しないことを知っているだろう。

これは問題の妥当な解決策のようですか?これが潜在的に間違っている可能性のある方法はありますか?私は別の解決策は、終わりから後方へ同時に進路を見つけることであると理解していますが、特にエンドノードがきつく囲まれていない場合には、コストがかかる可能性があります。

+0

これは主観的な回答の質問です。それは正しいですか?場合によってはそうですが、そうではないものもあります。プロジェクトの制限に依存します。あなたは道を見つけなければなりませんか?もしそうなら、あなたは上記のような状況に遭遇し、パスがないと言ってそれらを解決できなければなりませんか?はいの場合は、何らかの制限が必要です。そうでなければ、まあ、あなたはしない:)。 – bastijn

+0

ユーザーは好きなだけ環境を手配することができます。ええ、私は悪い道に対処できなければなりません。同時に両側からのパスファインディングは、おそらくこれを実行する最善の方法であると確信しているようですが、私のコードをリファクタリングして動作させる必要があるかもしれません。ああよく:D – Lewis

答えて

2

エンドノードがどこにあるのか正確に分かりませんか?そうする場合は、アルゴリズムを実行する前に囲まれているかどうかを確認してください。

+0

すぐには囲まれないかもしれないという問題があります。あらゆる種類の奇妙な形で10、20、50のノードになる可能性があります。 – Lewis

+1

@Lewisその場合、開始点と終了点の両方からA *を実行し、会議室があるとき、またはキューが空のときに停止します(そのうちの1つは囲まれています)。あなたが提案したことをやって、有効なパスが存在する可能性がありますので、有効なパスが見つからない可能性があります –

+0

もちろん、あなたは正しいのですが、その方法をもう一度見てみると、私はその質問に提案した。しかし、ちょうどそれの楽しさのために、四角い壁の方法で囲むことは実際に働くでしょうか? – Lewis

1

あなたの質問にも私のコメントも見てください。入力後、私は素晴らしい解決策を思いつきました。これは、あなたがあなたのエンドノードを知らず、上記のようにあなたのエンドノードの位置で何もできない場合です。

あなたは可能性もの線に沿って何か:「私はパスがないと言う、とを更新することができのy% propability持つので、私はX時間後、私の分野で密閉箱なしのパスを発見しましたYの時間をかけて増加する%が、100%に達することはありません。

は、探索領域の境界と何もしないの真ん中にある素敵な解決策になるかもしれません。

+0

これは良い解決策です。特に、アルゴリズムの実行中にユーザーが統計情報を見ることができるようにしたい場合には、これは良い解決策です。 A *は、エンドノードを知っている必要があります(そうでなければ、必要に応じてDijkstraのアルゴリズムのようなものです)ので、私は最終的にエンドノードにアクセスできます。 – Lewis

+0

それは本当です、私はA * :)を使用して以来、しばらくしています。 – bastijn

0

私は同様の問題を抱えていたし、ここで何私はですした:

B.探しAから始まる N反復、0
  1. 実行アルゴリズム
  2. 実行アルゴリズムA.

探しBから始まるN反復のためにいずれかの実行が判断した場合に1つまたはもう1つは完全に分離された領域にあります(これ以上ノードがオープンしていない場合)、検索は失敗します。そうでなければ、通常通り検索が行われます。

ここでのトリックは、もちろん、nの良い値を思い付くことです。 nが増えて複数のパスを実行し、結果をキャッシュしました(私のグラフはあまり変化しませんでした)。

0

あなたはA *を使用しているので、地形ノードにコストをかけて重み付けすることができます。壁のノードに非常に高いコストをかける。可能なパスの合計コストより大きくなければなりません。パスの終了コストがその境界コストより大きい場合、パスを見つけるために壁を渡さなければならないため、無効です。A *アルゴリズムはコストの高いノードの周りをルーティングするため、必要でない限り壁を経由しません。

関連する問題