サイクルキャンセルアルゴリズムの負のサイクルを見つける


9

最小コストのフロー問題の最適なソリューションを見つけるために、サイクルキャンセリングアルゴリズムを実装しています。残余ネットワークで負のコストサイクルを見つけて削除することにより、各ラウンドの総コストが削減されます。負のサイクルを見つけるために、私はベルマンフォードアルゴリズムを使用しています。

私の問題は、Bellman-fordはソースから到達可能なサイクルのみを検出しますが、到達不可能なサイクルも検出する必要があります。

例:次のネットワークでは、すでに最大フローを適用しています。エッジ(A,B)は非常に高価になります。残余ネットワークでは、容量負のコストサイクルがあります1。これを削除すると、エッジとを使用した安価なソリューションが得られますが、ソースからは到達できません。C T SCCTS

ラベル:フロー/容量、コスト

ここに画像の説明を入力してください

もちろん、各ノードをソースとしてベルマンフォードを繰り返し実行することもできますが、それは良い解決策のようには思えません。私が読んだすべての論文がこのステップをスキップしているように見えるので、私は少し混乱しています。

ベルマンフォードを使用して、すべての負のサイクル(到達可能かどうか)を見つける方法を教えていただけますか?そしてそれが不可能な場合、他にどのアルゴリズムを提案しますか?


ソースを介してサイクルに到達できない場合、それは全体の流れにどのように影響しますか?
Nicholas Mancuso 2012年

フロー値には影響しませんが、総コストには影響します。新しい例をご覧ください。
Patrick Schmidt

2
流し台からベルマンフォードを走らせるべきだと思いますよね?最大フローを見つけた場合、残差グラフG fの下にはsからtへのパスはありません。したがって、Bellman-Fordはtを指定してG fで実行する必要があります。fGfstGft
Nicholas Mancuso 2012年

回答:


2

私のコメントを拡張すると、Min-Cost-Flowを見つけるためのこのアルゴリズムは、が最大であるという事実に依存していることを覚えておいてください。最初にFord-Fulkersonを実行してfと結果の残余ネットワークG fを見つけることにより、G fの負のサイクルを見つけることでコストfが削減されます。これは、負のサイクルを見つけることによって、あるG fは、我々は流れの量、変化しませんF、単にコストを。ffGffGfGff

ここで、G fのからBellman-Fordを実行することにより、(G fの定義により)負でないフローを持つエッジを逆方向にトレースできます。サイクルがこれらのパスのいずれかのエッジに隣接している場合、サイクル内の他のエッジにある程度の流れを「転送」できます。つまり、一部のサイクルのネットフローを同じに保ちますが、コストを変更できます。tGfGf

から到達できないサイクルにはゼロフローが必要であることに注意してください。そうでなければ、fが最大であることには矛盾があります。tf


この説明の「手の波状」をお詫び申し上げます。今夜は時間があるときにもっとフォーマルになるように努力します。


T

0

私の提案:残余ネットワークで負のサイクルを見つけるには、アルゴリズムをTから開始する必要があります。結果は同じになるはずですが、その後サークルに到達できます


1
これはこのグラフで機能しますが、SまたはTのいずれにも接続されていない負のサイクルを持つ可能性があります。OPが一般的に機能するソリューションを必要としていると思います。
Peter Shor

はい、一般に、すべての負のサイクルを見つけることはできませんが、OPはコストを確認することにより、残存ネットワークを改善したいと考えています。その後、到達不可能なネガティブサークルは問題になりません
Sven Jung

T

STTSST

もちろん、何も変わっていないので、すべてのエッジを反転してTから始めても同じです。しかし、なぜエッジを反転せずにTから始めないのですか?次に、存在する場合、到達可能な負のサイクルを見つける必要があります。問題は、到達不可能な負のサイクルが本当に問題ではないかどうかです
Sven Jung

0

TまたはSからBellman-Fordを実行するだけでは不十分だと思います。SからTへのエッジが1つあり、SとTのどちらからも達成できない負のコストサイクルが1つある例を考えてみます。

1つの解決策は、補助S 'を追加し、コストが0のS'から他の頂点にエッジを追加することです。次に、S 'からBellman-Fordを実行します。このようにして、すべての負のサイクルはS 'から到達可能です。

さらに、実装に補助頂点S 'を追加する必要はありません。頂点vに対してd(v)= 0を初期化するだけです。

Boost Graph Libraryがどのように実装するかをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.