2012-04-14 7 views
3

問題:パス発見アルゴリズムの難易

は、我々が少ないターン用に最適化A *アルゴリズムを変更します。アルゴリズムは、可能であれば(x + 1、y)または(x-1、y)が好ましくは である(a、b)からANY TILE ADJACENT TO(x、y)までの パスを見つける。

マイ試み溶液:

  1. 実行元のA *アルゴリズム(B)から(x、y)とします。
  2. (x-1、)または(x + 1、)が通過するパスの最後の座標を探します。
  3. その座標平面に*からyまで直線的にアクセス可能な垂直線がある場合は、その線をたどるようにパスを修正します。

ビジュアルデモンストレーション:(Xにアクセスできない場所SからのパスがEに)

......S   .....S 
.  X   . X 
.   =>  .  
.     . 
E    E. 

私は私の解決策は、いくつかのケースで働くということはよく分からないが、すなわち:

......S   .....S 
.  X   . X 
.X  ???  X.  
.     . 
E    E.. 

誰もこの問題の解決策を考えることができますか?

注:A *アルゴリズムは、結果のパスのターン数を減らすために、方向変更の回数を因数分解する以外の一般的なものです。

+1

「可能な場合に優先する」とはどういう意味ですか? (x + 1、y)と(x、y + 1)の長さが等しい場合、(x + 1、y)へのパスを見つける必要がありますか?それとも、(x + 1、y)へのパスがあれば、もっと長くても見つかるはずですか?また、隣接はどういう意味ですか? (x + 1、y + 1)は隣接していますか? – btilly

+0

可能な場合に優先されるのは、それがまだ最短経路である場合のみです。隣接には対角線は含まれません。 –

+0

私の友人は次のように提案しました。1.返されたパスが最後にx + 1またはx-1平面を通過するかどうかを調べます。 2. A *を開始から(x + 1、y)または(x-1、y)のどちらかに近づける。結果のパスが短い場合は、代わりにそれを返します。これは今までのテストで正しいソリューションを提供するようですが、基本的にアルゴリズムを2回実行する必要があります。よりエレガントなものがあれば好奇心が強い。 –

答えて

2

A *は、このように、実際[単一のソースからの全ての頂点への最短パスを見つけるために[admissible heuristic関数で】設計され、実際Dijkstra's algorithmが通知バージョンです。

あなたは、ターゲットの頂点[*がきちんと複数のターゲットを処理することができます]など(x,y)に隣接する全てのタイルを定義することができます。また、どの対象ノードへの許容値を与えるために、ヒューリスティック機能を変更する必要があります。これは単にh'(tile) = max { h(tile) - 1 , 0}を変更することで行うことができますが、場合によってはより良い方法があるかもしれません。

上記を確立した後、我々は、元のA *に次の修正を得ることができます:あなたは、ターゲットタイルの拡張後[ などをターゲットタイルへのパスを見つけるまで、

  1. ランA *は、上述した。パスの長さをdとします。
  2. オープンノードの最小値 f(tile)の値がdより厳密に大きくなるまで、現在の状態でA*を実行し続けます。 長さdのパスで、ソースから到達可能なすべてのタイルを見つけることが保証されており、具体的には、長さがdのソースからのパスを持つすべてのターゲットタイルを見つけることが保証されていることが保証されている です。 [許容ヒューリスティック関数を仮定する]。
  3. これらすべてのタイルから、「優先されたタイル」を選択して パスを返すことができます。優先タイルが見つからない場合は、 へのパスを任意のターゲットタイルに戻します。

私は助けてくれることを願っています!

+0

アドバイスをいただきありがとうございます。私はそれを噛んで、これを動作させることができるかどうかを確認する必要があります。 –

0

ヒューリスティック機能を変更して、(x+1,y)(x-1,y)という点をわずかに押し上げます。パスを終えるまでに2ステップがあれば、その2ポイントを優先してネクタイを壊します。