基于局部搜索原理的近似算法;基于动态规划的近似算法。
编辑中
基于局部搜索的近似算法
原理
工作过程:
-
从任意可行解出发,搜索其邻域(通过对其进行局部修改),检查是否有更优的解存在(具有更优的解代价)
-
如存在则移动至该解并继续执行局部搜索
-
反之则意味着达到了一个局部优化解,输出局部优化解作为近似解。
关键:
-
在搜索空间中如何定义邻域(邻居关系的选择和定义);需要保证每次的局部搜索在多项式时间内完成。
即怎么来得到邻域。
-
在每一步中选择相邻解的规则。
即怎么从获得的邻域中选择最优的。
这决定了迭代次数,以及可否在有限步内找到局部最优解。
-
初始的可行解如何选择。
与基于贪心的近似算法比较:
-
相同:
-
均是启发式规则
-
均是做局部优化选择,不一定保证全局最优
-
-
不同
-
贪心的解是一步步构建的,每步通过选择当前最优来决定下一步
-
局部搜索则是已经得到一个可行解,从这个解出发,通过对其局部、小的修改来产生新的可行解,使代价更优。
局部搜索无法保证一定能够在多项式时间内找到局部最优解.
-
优缺点:
-
优点:
简单、灵活、易于实现
对于大多数难计算问题不难设计一个局部搜索算法。
-
缺点 :
容易陷入局部最优
有随机的可能——解的质量难以保证,与初始解、邻域结构密切相关。
问题
-
最大割问题
问题描述:
输入: 加权无向图$G(V,E)$,权值函数$W:E \to N$
输出: $S \subseteq V$ , 使得$\sum_{u \in S , v \in V - S}W(uv)$最大
这里,就是把顶点集分为两个集合,$S$ 和$V-S$ , 这就是一个割。 将$S$到$V-S$中的边的权值相加,就是割的代价。最大割就是找一个割,使得割的代价最大。
最大割问题是一个NP完全问题。
近似算法 :
需要定义$Cost(v , S)$ :
v是一个顶点,S是一个顶点集合。
如果v在S中,则$Cost(v,S)$表示v到S中其余顶点的权值和,减去v到$V - S$中顶点的权值和。(当然这些顶点间是要有边的)
如果v在$V-S$中,则$Cost(v,S)$就表示v到$V-S$中其余顶点的权值和,减去v到S中顶点的权值和。
如果$Cost(v,S)$为正,则说明如果我们交换v在两个集合的位置,得到的割的权值将变大!(因为第一项是内部权值和,第二项是到外部的权值和,如果交换,相比与未交换,到外部的权值就大了,割就更大了)
-
初始S集合,随意放入一个顶点到S中。
-
在所有顶点中,找$Cost(v,S) \gt 0$的顶点$v$,交换$v$在$S$ , $V-S$中的位置。
-
重复步骤2,直到找不到这样的顶点,则返回集合S,为近似解。
-