適切なソリューションで問題がなく、最適なソリューションを要求しない場合は、ヒューリスティック アルゴリズムを使用してこれを解決できます。
S
を点の集合とし、-w(s)
加重関数とします。
重み関数を作成しますW:2^S->R
(S のサブセットから実数へ):
W(U) = - INFINITY is the solution is not feasible
Sigma(w(u)) for each u in U otherwise
next:2^S -> 2^2^S
関数( のサブセットを取得し、 のサブセットのS
セットを返す関数S
)も作成します。
next(U) = V you can get V from U by adding/removing one element to/from U
ここで、そのデータが与えられたら、遺伝的アルゴリズムやヒル クライミングなど、人工知能の本の任意の最適化アルゴリズムを呼び出すことができます。
たとえば、ランダムな再起動を伴うヒル クライミングは次のようになります。
1. best<- -INFINITY
2. while there is more time
3. choose a random subset s
4. NEXT <- next(s)
5. if max{ W(v) | for each v in NEXT} < W(s): //s is a local maximum
5.1. if W(s) > best: best <- W(s) //if s is better then the previous result - store it.
5.2. go to 2. //restart the hill climbing from a different random point.
6. else:
6.1. s <- max { NEXT }
6.2. goto 4.
7. return best //when out of time, return the best solution found so far.
上記のアルゴリズムはいつでも使用できます。つまり、時間があれば、より良い結果が得られます。