如果您对一个好的解决方案感到满意,并且不要求最好的解决方案 - 您可以使用启发式算法来解决这个问题。
设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
现在,给定这些数据 - 您可以调用人工智能书中的任何优化算法,例如遗传算法或爬山算法。
例如,Hill Climbing with random restarts将是这样的:
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.
上述算法是随时可用的——这意味着如果给予更多时间,它将产生更好的结果。