迷路が決して変わらず、存在するパスが永遠に存在する場合、迷路の「領域」を見つけてそれらを何らかの形式で保存するマッピングアルゴリズムを使用できませんか?メモリ使用量はノードまたはセルの量に比例し、速度は配列の2つの要素にアクセスして比較する速度です。
コンピューティング(リージョンへのスプライティング)はおそらくもっと時間がかかりますが、最初に一度実行されます。たぶん、この目的のためにいくつかのフラッドフィルアルゴリズムを適応させることができますか?
上記から明らかかどうかはわかりませんが、例は常に役立つと思います。PHP構文を使用してご容赦ください。
例(迷路5x5)([]
障害物をマークします):
0 1 2 3 4
+----------+
0 |[][] 2 |
1 | [][] |
2 | [] []|
3 | 1 [] |
4 | [] |
+----------+
インデックス付き領域(「x:y」の代わりに数値ハッシュを使用する方が良い場合があります):
$regions=array(
'0:1'=>1,'0:2'=>1,'0:3'=>1,'0:4'=>1,'1:2'=>1,'1:3'=>1,'1:4'=>1,
'2:0'=>2,'3:0'=>2,'3:1'=>2,'3:2'=>2,'3:3'=>2,'3:4'=>2,'4:0'=>2,
'4:1'=>2,'4:3'=>2,'4:4'=>2
);
その場合、タスクは、開始点と終了点が両方とも同じ領域にあるかどうかを確認することだけです。
if ( $regions[$startPoint] == $regions[$endPoint] )
pathExists();
誤解しない限り、A *の複雑さ(速度)は開始点と終了点の間の距離(または解の長さ)に依存します。これはおそらく検索を高速化するために使用される可能性があります。
迷路の中にいくつかの「ジャンクションノード」(JN )を作成しようとします。それらは関数上に配置でき(最も近いJNがどこにあるかをすばやく知るため)、隣接するすべてのJN間のパスが事前に計算されます。
したがって、開始点から最も近いJNまで、および終点から最も近いJNまで(すべてが同じ領域(上記)にある場合)、ソリューションを検索するだけで済みます。これで、いくつかの領域があり、その一部にJNがまったくないか、すべてのJNが迷路の障害物に落ちるシナリオ(迷路の複雑さに関して関数が適切に選択されていない場合)を見ることができます。 ..したがって、可能であればこれらのJNを手動で定義するか、このJN配置機能を重要なものにする(各領域の面積を考慮して)方がよい場合があります。
JNに到達すると、それらの間のパスにインデックスを付けるか(開始JNと終了JNの間の事前定義されたパスを高速に取得するため)、または別のA *パスファインディングを実行できます。ただし、今回は「ジャンクションノード」のセットのみです。それらのうち、 JN間のこのパス検索はより高速になります。