Lecture 4. Heuristic Method


【例 1】(柯克曼女生散步问题)15 个女生每天出去散步一次,每次散步三人一组。请问如何安排散步方案,可以使得 7 天内任何两个人刚好散步一次?

猜想:对于 nn 个女生,充分必要条件是 n3(mod 6)n \equiv 3 (\text{mod }6),散步 (n1)/2(n-1)/2 天。

【解】


构建启发式算法主要有下面几个步骤:假设解空间 XX,定义对于某特定解 xx 的收益为 P(x)P(x),我们需要最大化收益,即 maxxXP(x)\max_{x\in X} P(x),且找到最优解 x=arg minxP(x)x^*=\argmin_x P(x)。有时可能有一些约束条件 R(x)R(x) 需要满足。

  1. 构建邻域函数 N:X2XN:X\rightarrow 2^X:即任何 XX 中元素的邻居由 XX 的一个子集组成,我们通常会定义 N(x)N(x) 中的元素在某些分量/属性上接近于 xx。这里,我们不考虑 N(x)N(x) 中的元素是否均可行,因此邻域中会存在不可行元素的情况。
  1. 对邻域进行(随机)搜索,寻找可行解:如果要找最优解,我们可以穷举邻域中的所有元素,判断可行性并且计算收益,找最大值;但在启发式方法中,我们对邻域进行随机搜索以提升速度,策略可以有如下几种:
    1. 找到一个可行解 yN(x)y\in N(x) 使得 P(y)P(y) 最大;
    1. 找到一个可行解 yN(x)y\in N(x) 使得 P(y)P(y) 最大,同时 P(y)>P(x)P(y)>P(x)
    1. 找到 yN(x)y\in N(x) 的任一可行解;
    1. 找到 yN(x)y\in N(x) 的可行解使得 P(y)>P(x)P(y)>P(x)

    其中,a 和 c 允许接受次优的方案,而 b 和 d 强制要求新方案 yy 一定比当前方案 xx 优;通常根据问题的实际情况从上述策略中进行选择。

  1. 迭代过程 2 至阈值:不断重复过程 2,直到到达迭代次数或当前解已经足够优,从而获得最终启发式算法得到的解。

爬山法. 我们只允许 yN(x)y\in N(x)P(y)>P(x)P(y)>P(x)yy 更新 xx;这样的 yy 可以是穷举性的,也可以是随机性的。但爬山法容易陷入局部最优解。


模拟退火. 在模拟退火中,使用随机的邻域搜索策略,如果 y=N(x)y=N(x) 可行并且 P(y)>P(x)P(y)>P(x),那么 yy 就替换 xx,与爬山算法类似。但如果 P(y)<P(x)P(y) < P(x),我们以 exp((P(y)P(x))/T)\exp((P(y)-P(x))/T) 的概率用 yy 替换 xx,其中 TT 是每轮更新的温度变量,初始为 T0T_0,每轮更新为 TαTT\leftarrow\alpha T。容易发现模拟退火算法可以逃脱局部最优解。


禁忌搜索. 在禁忌搜索中,我们用 yN(x)\{x}y\in N(x)\backslash \{x\} 中的元素替换 xx,即 yy 可行且 P(y)P(y) 是该集合中所有可行解的最大值。通常需要对 N(x)N(x) 进行穷举搜索,可能会出现 P(y)<P(x)P(y)<P(x) 的情况,因此可以逃脱局部最优解。当然,我们同时记录本次更新的位置在禁忌表 Tabulist 中,并且在一段时间 LL 内不允许再次在该位置更新,直到 LL 轮后该位置从禁忌表中移除。这样可以避免循环更新的问题,如 xyxyx\rightarrow y\rightarrow x\rightarrow y\rightarrow \cdots


【例 2】(组合优化问题)有限解空间为 XX,约束条件为 gj(x)>0 (1jm)g_j(x)>0 \ (1\leq j\leq m),其中 g1,g2,,gmg_1, g_2,\cdots,g_m 为整数值函数,其中满足奖励 P(x)P(x) 最大的可行解 xx 为最优解,即

maxxXP(x)s.t. gj(x)>0,j=1,2,,m\max_{x\in X} P(x) \\\text{s.t. } g_j(x)>0,j=1,2,\cdots,m

【例 3】(背包问题)背包容量 WW,每个物品重量 w1,w2,,wnw_1,w_2,\cdots,w_n,价值 v1,v2,,vnv_1,v_2,\cdots,v_n,在重量不超过 WW 的情况下最大化价值和,即可行解空间 X={0,1}nX=\{0,1\}^n

maxxXi=1nxivis.t. i=1nxiwiW\max_{x\in X} \sum_{i=1}^nx_iv_i\\\text{s.t. }\sum_{i=1}^nx_iw_i\leq W

【解 1(模拟退火)】定义邻居函数 N1(x)={y{0,1}n:dist(x,y)=1}N_1(x)=\{y\in\{0,1\}^n:dist(x,y)=1\},生成随机的 yN1(x)y\in N_1(x)(可以看成选取随机整数 j[1,n]j\in[1,n],将 xx 的第 jj 位取反得到 yy)。于是可以计算新的 W(y)W(y)V(y)V(y)。判断是否满足 W(y)WW(y)\leq W,如果满足则考虑:

【解 2(禁忌搜索)】邻居的定义与解 1 相同,但使用贪心算法而不是随机法来搜索邻居中最好的方案更新 xx。假定至少存在一个 ii 使得 xi=0x_i=0ii 不在禁忌表中、且将 xix_i 改为 1 后满足条件(不超过 WW),那么在这些满足条件的 ii 中选择最大的 Pi/wiP_i/w_i,将 xix_i 改为 1;若不存在这种 ii,那么考虑所有 xi=1x_i=1ii 不在禁忌表中,在这些 ii 中选择最小的 Pi/wiP_i/w_i,将 xix_i 改为 0。


【例 4】(均匀图分割)2n2n 个节点的图,划分成节点相等的两部分 X0,X1X_0,X_1,使得两部分之间的边最少。

【解】定义邻域为交换一对点 uX0,vX1u\in X_0,v\in X_1,那么

GX0,X1(u,v)=C(X0,X1)C(X0\{u}{v},X1\{v}{u})=yX1cost(u,y)+xX0cost(x,v)yX1cost(v,y)xX0cost(x,u)\begin{aligned}G_{X_0,X_1}(u,v)&=C(X_0,X_1)-C(X_0\backslash\{u\}\cup\{v\},X_1\backslash\{v\}\cup\{u\}) \\&=\sum_{y\in X_1}cost(u,y)+\sum_{x\in X_0} cost(x,v)-\sum_{y\in X_1}cost(v,y)-\sum_{x\in X_0} cost(x,u)\end{aligned}

选择 GX0,X1(u,v)G_{X_0,X_1}(u,v) 最大的 (u,v)(u,v) 进行更新(爬山),或采用模拟退火、禁忌搜索等方法更新。


【例 5】(Steiner Triple System,STS)定义 STS 为一个集合系统 (V,B)(V,B),每个块 bBb\in B 含有三个元素且 VV 中的每一对点都包含在唯一的一个块中,若 V=v|V|=v,则这样的系统称为 STS(v)STS(v)。则 STS(v)STS(v) 存在的必要条件是什么?并尝试构造出一个合法的 STS(v)STS(v)

一个 STS(7)STS(7) 的例子为 V={1,2,3,4,5,6,7}V=\{1,2,3,4,5,6,7\},且

B={{1,2,4},{2,3,5},{3,4,6},{4,5,7},{1,5,6},{2,6,7},{1,3,7}}B=\{\{1,2,4\},\{2,3,5\},\{3,4,6\}, \{4,5,7\}, \{1,5,6\},\{2,6,7\}, \{1,3,7\}\}

【解】考虑对 {((x,y),b)x,yV;bB;x,yb}\{((x,y),b)\mid x,y\in V; b\in B;x,y\in b\} 双计数。

因此,得到

B=v(v1)6|B|=\frac{v(v-1)}{6}

由于 B|B| 必须为整数,因此 STS(v)STS(v) 存在的必要条件是 v1 mod 6v\equiv 1 \text{ mod }6v3 mod 6v\equiv 3 \text{ mod }6。且容易发现 d(x)=(v1)/2d(x)=(v-1)/2

下面考虑给定一个满足条件的 vv,构造 STS(v)STS(v)

重复这个过程,结束后即构造出 STS(v)STS(v)


【例 6】(Hopfield Neural Network) Hopfield 神经网络可以看做无向图 G=(V,E)G=(V,E),每条边 ee 上有一个整数的权重 wew_e。对每个节点 uu 分配 Su=±1S_u=\pm 1 的数值,若 uV\forall u\in V

v:(u,v)=eEweSuSv0\sum_{v:(u,v)=e\in E} w_eS_uS_v \leq 0

则称网络为稳定构型。要求找到一个稳定的构型。

【解】重复下面的过程: