問題を使用する
http://www.geeksforgeeks.org/greedy-algorithms-set-6-dijkstras-shortest-path-algorithm/
試しをたくさん助けになると思い、それでは何も知られているシンプルな(正確な)解決策はありません速くなることが保証されています。
例が小さい場合は、B
のすべてのサブセットを列挙し、A
をカバーする最小のものを選んでください。明らかに、それは最良の場合でも指数関数的です。
より良いアプローチは、合理的なソルバーが存在する別の形式で問題を表現することです。このような形式の1つは、整数線形プログラムである。
あなたの例を表す整数リニアプログラムです。
Minimize
obj:b1+b2+b3+b4+b5
Subject To
b1+b2+b3+b4 >= 1
b2+b4 >= 1
b3+b5 >= 1
b1+b2+b3+b4 >= 1
b1+b2+b3+b4+b5 >= 1
b3+b4 >= 1
b5 >= 1
Bounds
0 <= b1 <= 1
0 <= b2 <= 1
0 <= b3 <= 1
0 <= b4 <= 1
0 <= b5 <= 1
End
"minimize"句は、可能な限り小さな解決策を望むという考えを捉えています。 "件名"句の末尾には、A[i]
が含まれるようにソリューションが制限されています。 (注意:あなたの例では、A
のいくつかがまったく同じセットのB
に隣接しているため、いくつかの制約が重複しています。
GLPK(または他の整数リニアプログラムソルバーの多く)はこれを解決することができます。また、ソルバーとのインタフェースを持つJavaライブラリもあります。
あなたはここにこのオンラインを実行することができます。http://hgourvest.github.io/glpk.js/
出力は次のようになります。
GLPK Simplex Optimizer, v4.49
7 rows, 5 columns, 20 non-zeros
Preprocessing...
4 rows, 4 columns, 12 non-zeros
Scaling...
A: min|aij| = 1 max|aij| = 1 ratio = 1
Problem data seem to be well scaled
Constructing initial basis...
Size of triangular part = 4
0: obj = 1 infeas = 4 (0)
*1: obj = 2 infeas = 0 (0)
*2: obj = 2 infeas = 0 (0)
OPTIMAL SOLUTION FOUND
{"b1":0,"b2":0,"b3":0,"b4":1,"b5":1}
を最後の行では、あなたが最適解が{B4, B5}
である最小のセットに対応するb4=b5=1
で見ることができます。
これはNP完全な問題ですので、ある意味では良い(既知の)アルゴリズムはありません。あなたの例が小さい場合は、単純にすべてのサブセットを列挙し、Aをカバーする最小のものを選ぶことができます。 –