ノードが実数 (正と負) に重み付けされている無向グラフを通る最短経路を見つける必要があります。これらの重みは、ノードに入ることによって獲得または解放できるリソースのようなものです。
パスの総コスト (リソースの合計) はそれほど重要ではありませんが、0 より大きくなければならず、長さは可能な限り短くする必要があります。
たとえば、次のようなグラフを考えてみましょう。
A-start node; D-end node
A(+10)--B( 0 )--C(-5 )
\ | /
\ | /
D(-5 )--E(-5 )--F(+10)
最短パスは AEFED です
ダイクストラのアルゴリズムだけではうまくいきません。負の値を処理できないからです。そこで、いくつかの解決策を考えました。
最初のものは、ダイクストラのアルゴリズムを使用して、重みを考慮せずに、各ノードから出口ノードまでの最短経路の長さを計算します。これは、A* のようなある種のヒューリスティック値のように使用できます。このソリューションが機能するかどうかはわかりません。また、非常にコストがかかります。Floyd-Warshall のアルゴリズムを実装することも考えましたが、どうすればよいかわかりません。
別の解決策は、重みを考慮せずにダイクストラのアルゴリズムを使用して最短パスを計算することでした。パスのリソースの合計を計算した後、ゼロ未満の場合は、各ノードを調べて、リソースの合計をすばやく増やすことができる隣接ノードを見つけ、それをに追加します。パス (必要に応じて数回)。このソリューションは、リソースの合計を増やすのに十分な可能性があるノードがある場合には機能しませんが、計算された最短パスから遠く離れています。
例えば:
A- start node; E- end node
A(+10)--B(-5 )--C(+40)
\
D(-5 )--E(-5 )
この問題を解決するのを手伝ってくれませんか?
編集:最短経路を計算するときに、リソースの合計がゼロに等しいポイントに到達した場合、その経路は有効ではありません。ガソリンがなくなると先に進むことができないためです。