頂点集合 の重みつき有向グラフを考える。辺(始点 終点)と重みは次の 6 本である。
このグラフに負の閉路はない。ベルマン・フォード法を用いて、始点 から頂点 への最短距離 を求め、組 の形で答えよ。
負の重みを含む最短路(ベルマン・フォード法)
負の重みの辺を含む有向グラフで、ベルマン・フォード法の緩和 を 回くり返して、始点から各頂点への最短距離を求められる。負の閉路があるかどうかも判定できる
前提
中学までに習ったことだけで始められます。
説明
辺に向きと重み(長さ)がついたグラフで、始点から各頂点への重みの合計の最小値(最短距離)を求める方法です。重みに負の数が混じっていても使えます。たとえば、ある区間を通ると費用が払い戻されるような経路の問題に使えます。さらに、始点からたどり着ける負の閉路(一周すると重みの合計が負になる回り道)があるかどうかも判定できます。
なぜそうしてよいのか
まず言葉を決めます。有向グラフとは、頂点の集合 と、向きのついた辺 の集まりのことです。各辺には重み (負でもよい)がついています。辺を向きに沿ってたどったもの(同じ頂点を何度通ってもよい)を道とよび、その重みの合計を道の長さとします。始点 から頂点 への道の長さの最小値が最短距離です。同じ頂点に戻ってくる道で長さが負のものを負の閉路といいます。 から負の閉路にたどり着けると、それを何周もすれば長さをいくらでも小さくできます。そのため、その閉路を経由して行ける頂点には最短距離が存在しません。
アルゴリズムでは、各頂点に「今わかっている最良の長さ」 を持たせます。最初は 、ほかは (まだ届いていない)とします。各辺 について「 まで長さ で来られるなら、この辺を足せば へ で行ける」ので、 と書き換えます。これを緩和といいます。 は増えることがありません。また、有限の はつねに から への実際の道の長さなので、最短距離より小さくなることはありません。すべての辺を 1 回ずつ緩和する作業を 1 巡とよびます。このとき「 巡したあとの は、辺を 本以下使う から への道の長さの最小値以下」が成り立ちます(そのような道がなければ何も主張しません)。 についての帰納法で示します。 のとき、辺 0 本の道は にとどまる長さ 0 の道だけです。そして なので成り立ちます。 のときは、辺 本以下の道のうち最短のものを とします。 の辺が 本以下なら、 巡目までに はその長さ以下になっています。 は増えないので、 巡目のあともそのままです。 の辺がちょうど 本なら、最後の辺を とします。 のその手前までの部分は、辺 本の から への道です。よって 巡目までに、 は有限で、その長さ以下になっています。 巡目にこの辺を緩和すると、( の長さ)となります。
からたどり着ける負の閉路がなければ、 から への最短の道は、同じ頂点を 2 度通らないものに取れます。道の途中の閉路は からたどり着けるので長さが 0 以上であり、取り除いても長さは増えないからです。このような道の辺は 本以下です。したがって 巡すれば、到達できるすべての で が最短距離に一致します。到達できない は のままです。もう 1 巡しても何も変わりません。逆に、どの辺ももう緩和できない状態を考えます。このとき から到達できる頂点の はすべて有限です。 は有限です。そして が有限で辺 が緩和できないなら、 なので も有限です。これを からの道に沿ってくり返せばわかります。ここで、たどり着ける負の閉路 があったとします。閉路上の はすべて有限なので、 を でたし合わせると、両辺の が打ち消し合います。その結果 (閉路の重みの合計)となり、閉路の重みの合計が負であることに反します。よって、 巡のあとにまだ更新できる辺があることと、 から到達できる負の閉路があることは同じです。
手順
初期化する:始点を とし、それ以外の頂点を とする。
1 巡する:すべての辺 を決めた順に調べる。 かつ なら、 と更新する。
手順 2 を 回くり返す。途中のある巡で 1 回も更新が起きなければ、そこで打ち切ってよい(以後も変化しない)。
負の閉路を判定する:もう 1 巡だけ調べる。更新できる辺が 1 本でもあれば、始点から到達できる負の閉路がある。1 本もなければ、各 がそのまま最短距離である( のままなら到達不能)。
例題
頂点の集合を とする有向グラフがある。辺と重みは 、、、、 である。ベルマン・フォード法により、始点 から頂点 への最短距離を求めよ。
例題の解答
辺は の順に調べる。 なので、最大 3 巡する。
【手順 1】、 とする。
【手順 2:1 巡目】: より 。: より 。: より 。: より 。: なので更新しない。
【手順 3:2 巡目】: なので変化なし。: なので変化なし。: より 。: なので変化なし。: なので変化なし。
【手順 3:3 巡目】各辺で 、、、、 となり、更新は起きない。
【手順 4】3 巡目で更新がなかったので、もう 1 巡調べても更新は起きない。よって始点から到達できる負の閉路はない。最短距離は 、、、 である。 への最短の道は で、長さは となる。
答え:
よくある誤り
一番近い頂点から順に距離を確定させ、あとで見直さない誤り。例題でこうすると を確定させてしまい、 となる。正しくは、負の辺 によって に下がりうる。だから距離を確定させずに全辺の緩和をくり返し、 を得る。
まだ届いていない頂点から緩和してしまう誤り。たとえば 、 のときに を などの有限の値にしてはいけない。正しくは とみなし、 の辺だけを緩和する。
更新が続いているのに 1 巡や 2 巡で打ち切る誤り。辺を調べる順番によっては、最短の道の情報が 1 巡に辺 1 本分しか伝わらない(例題でも になるのは 2 巡目)。正しくは 巡するか、ある巡で更新が 1 回も起きなくなるまで続ける。
負の重みの無向の辺(例: の重み )を、 と (どちらも重み )の 2 本の有向の辺に置き換えてしまう誤り。こうすると重みの合計が の閉路 ができる。その結果、この辺に到達できさえすれば必ず「負の閉路あり」と判定され、最短距離は求まらない。正しくは、負の重みの無向の辺をもつグラフはこの方法の対象外である。もとの状況が「 から へ進むときだけ払い戻しがある」のような一方向の意味なら、 の 1 本だけを置いた有向グラフとして定式化し直してから使う(重みが 0 以上の無向の辺なら、2 本の有向の辺に置き換えてよい)。
この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。
入口の問題
頂点の集合を とし、次の 5 本の重みつき有向辺をもつ有向グラフを考える( は から への重み の辺を表す)。
始点 から頂点 への最短距離(経路上の辺の重みの和の最小値)をそれぞれ とする。ベルマン・フォード法を用いて、組 をこの順に求めよ。頂点の集合を とする有向グラフ がある。辺と重みは次の 5 本である。
ここで は から へ向かう辺の重みを表す。ベルマン・フォード法を用いて、始点 から頂点 への最短距離 を求め、組 の形で答えよ。
この技能の次に学べること
- 最短路の本数の数え上げ (大学数学 オペレーションズ・リサーチ)