relaxation of an Edge
グラフ理論の文脈における平均?これに出会ったのは、単一ソースの最短パスに対するダイクストラのアルゴリズムを調べていたときです。
Here's 緩和の概念も説明するアルゴリズムの説明。
「リラクゼーション」の概念は、最短経路の推定値と、圧縮用に設計されていない引張コイルばねの長さとの類似性に由来しています。当初、最短経路のコストは過大評価であり、伸びた春に例えられます。短い経路が見つかると、推定コストが下がり、春が緩和されます。最終的に、最短経路が存在する場合はそれが見つかり、スプリングはその長さまでリラックスしました。
ダイクストラのアルゴリズムの緩和プロセスは、vを介したパスを含めることでコストが改善される場合、頂点vに接続されているすべての頂点のコストを更新することを指します。
エッジの緩和(他の最短パスアルゴリズムにも見られる概念)は、別の頂点を使用して頂点に到達するコストを削減しようとしています。
[〜#〜] s [〜#〜]などの開始頂点から他のすべての頂点までの距離を計算しています。ある時点で、中間結果、つまり現在の推定値が得られます。リラクゼーションは、いくつかの頂点およびvについてチェックするプロセスです。
_if directly_connected(v, u)
if est(S, v) > est(S, u) + dist(u,v)
est(S, v) = est(S, u) + dist(u, v)
_
ここで、est(S,a)
は距離の現在の推定値であり、dist(a,b)
はグラフ内の隣接する2つの頂点間の距離です。
リラクゼーションプロセスで基本的に確認しているのは、現在の推定値aからbへのパスですc (この「迂回」は、aからcおよびcからbのパスの長さです) 。
グラフに(u、v)∈Eがあり、w(u、v)= 10の場合、w(u、y)= 1やw(y、v)=のような3番目の頂点を追加することで、 3ここで、重み1 + 3 = 4 <10でuとvの間のパスを見つけます。次に、2番目のパスを最短(u、y、v)と見なし、最初のパスを無視します。これは緩和です。
エッジ緩和。
Edge v-> wを緩和するということは、sからwへの最もよく知られている方法がsからvへであるかどうかをテストし、vからwへEdgeを取り、もしそうであれば、データ構造を更新することを意味します。
Javaコード:
private void relax(DirectedEdge e) {
int v = e.from(), w = e.to;
if (distTo[w] > distTo[v] + e.weight()) {
distTo[w] = distTo[v] + e.weight();
edgeTo[w] = e;
}
}
頂点緩和もあります。これは、指定された頂点を指すすべてのエッジを緩和することを意味します。
private void relax(EdgeWeightedGraph G, int v) {
for (DirectedEdge e : G.adj(v)) {
relax(e);
}
}