悪いニュース:この問題は、サブセット和からの削減によってNP困難です。数x1 、…、x n 、Sが与えられた場合、サブセット和の目的は、x iの一部のサブセットがSに合計されるかどうかを決定することです。容量x1 、…、xnおよびBのAボトルを作成します。 -容量Sおよび(x1 + …+ xn --S)のボトルを使用し、n回の注入で十分かどうかを判断します。
良いニュース:貪欲な戦略(つまり、空でないAを選択し、満たされていないBを選択し、停止するまで注ぐ)は2近似です(つまり、最適な注ぐ量の最大2倍を使用します)。最適なソリューションでは、少なくともmax(| A |、| B |)の注入を使用し、貪欲な使用では最大で|A|を使用します。+ | B |、貪欲な人が注ぐたびに、Aが排出されるか、Bが満たされ、出入りする必要がないためです。
近似スキーム(a(1 +ε)-任意のε> 0の近似)が存在する可能性があります。今では、近似不可能な結果が生じる可能性が高いと思います。近似スキームを取得するための通常のトリックは、ここでは適用されないようです。
ここに、実用的な正確なアルゴリズムにつながる可能性のあるいくつかのアイデアがあります。
A
解決策が与えられたら、左の頂点と右の頂点、およびに注がれた場合に限り、からへB
の(無向の)エッジを持つ2部グラフを描画します。解決策が最適である場合、私はサイクルがないと主張します。そうでなければ、サイクル内の最小の注入を排除し、サイクルの周りで失われた量を置き換えることができます。たとえば、私が注ぐ場合a
b
a
b
a1 -> b1: 1
a1 -> b2: 2
a2 -> b1: 3
a2 -> b3: 4
a3 -> b2: 5
a3 -> b3: 6
a1 -> b1
それから私はそのように注ぐことによって排除することができます:
a2 -> b1: 4 (+1)
a2 -> b3: 3 (-1)
a3 -> b3: 7 (+1)
a3 -> b2: 4 (-1)
a1 -> b2: 3 (+1)
これで、グラフにサイクルがないため、エッジ(注入)の数をとしてカウントできます|A| + |B| - #(connected components)
。ここでの唯一の変数は、最大化したい連結成分の数です。
欲張りアルゴリズムは、サイクルのないグラフを形成すると私は主張します。最適解の連結成分が何であるかを知っていれば、それぞれに欲張りアルゴリズムを使用して、最適解を得ることができます。
このサブ問題に取り組む1つの方法は、動的計画法を使用して、sum(X)== sum(Y)となるようにAのすべてのサブセットペアXとBのYを列挙し、これらを正確なカバーアルゴリズムにフィードすることです。もちろん、どちらの手順も指数関数的ですが、実際のデータではうまく機能する可能性があります。