(これはまさに私が抱えている問題ではありませんが、同形であり、この説明が他の人にとって最も理解しやすいと思います。)
n次元空間に一連の点があるとします。たとえば、3 次元を使用すると、次のようになります。
A : [1,2,3]
B : [4,5,6]
C : [7,8,9]
この空間で可能な動きを表す一連のベクトルもあります。
V1 : [+1,0,-1]
V2 : [+2,0,0]
次に、点destが与えられた場合、最も効率的な方法で dest に移動する開始点pと一連のベクトル移動を見つける必要があります。効率は「最小の移動数」として定義され、必ずしも「最小の直線距離」ではありません。移動セットがより少ない移動でそこに到達できるようなものである場合、他の候補よりもdestから離れたpを選択することは許容されます。移動中のベクトルは、使用可能なベクトルの厳密なサブセットでなければなりません。入力セットに複数回出現しない限り、同じベクトルを複数回使用することはできません。
入力には ~100 個の開始点とおそらく ~10 個のベクトルが含まれており、次元数は ~20 です。開始点と利用可能なベクトルは、アプリの存続期間中固定されますが、非常に多くの異なる目的地へのパスを見つけます。メモリではなく速度を最適化したい。アルゴリズムが失敗することは許容されます ( destへの可能なパスが見つからないため)。
承認されたソリューションで更新
以下で「承認済み」とマークされているものと非常によく似た解決策を採用しました。すべてのポイントとベクトルを繰り返し処理し、到達可能なすべてのポイントのリストとそれらに到達するためのルートを作成します。このリストを < dest , p+vectors >のハッシュに変換し、目的地ごとに最短のベクトル セットを選択します。(ハッシュ サイズの最適化も少しありますが、ここでは関係ありません。) 後続のdestルックアップは一定の時間で発生します。