【例 1】(柯克曼女生散步问题)15 个女生每天出去散步一次,每次散步三人一组。请问如何安排散步方案,可以使得 7 天内任何两个人刚好散步一次?
猜想:对于 n 个女生,充分必要条件是 n≡3(mod 6),散步 (n−1)/2 天。
【解】
- 目标函数:设 fij 为 (i,j) 点对出现次数,那么目标函数为
- 遇到的问题:如果陷入局部最优解,则可以进行扰动一下。
构建启发式算法主要有下面几个步骤:假设解空间 X,定义对于某特定解 x 的收益为 P(x),我们需要最大化收益,即 maxx∈XP(x),且找到最优解 x∗=argminxP(x)。有时可能有一些约束条件 R(x) 需要满足。
- 构建邻域函数 N:X→2X:即任何 X 中元素的邻居由 X 的一个子集组成,我们通常会定义 N(x) 中的元素在某些分量/属性上接近于 x。这里,我们不考虑 N(x) 中的元素是否均可行,因此邻域中会存在不可行元素的情况。
- 对邻域进行(随机)搜索,寻找可行解:如果要找最优解,我们可以穷举邻域中的所有元素,判断可行性并且计算收益,找最大值;但在启发式方法中,我们对邻域进行随机搜索以提升速度,策略可以有如下几种:
- 找到一个可行解 y∈N(x) 使得 P(y) 最大;
- 找到一个可行解 y∈N(x) 使得 P(y) 最大,同时 P(y)>P(x);
- 找到 y∈N(x) 的任一可行解;
- 找到 y∈N(x) 的可行解使得 P(y)>P(x)。
其中,a 和 c 允许接受次优的方案,而 b 和 d 强制要求新方案 y 一定比当前方案 x 优;通常根据问题的实际情况从上述策略中进行选择。
- 迭代过程 2 至阈值:不断重复过程 2,直到到达迭代次数或当前解已经足够优,从而获得最终启发式算法得到的解。
爬山法. 我们只允许 y∈N(x) 且 P(y)>P(x) 的 y 更新 x;这样的 y 可以是穷举性的,也可以是随机性的。但爬山法容易陷入局部最优解。
模拟退火. 在模拟退火中,使用随机的邻域搜索策略,如果 y=N(x) 可行并且 P(y)>P(x),那么 y 就替换 x,与爬山算法类似。但如果 P(y)<P(x),我们以 exp((P(y)−P(x))/T) 的概率用 y 替换 x,其中 T 是每轮更新的温度变量,初始为 T0,每轮更新为 T←αT。容易发现模拟退火算法可以逃脱局部最优解。
禁忌搜索. 在禁忌搜索中,我们用 y∈N(x)\{x} 中的元素替换 x,即 y 可行且 P(y) 是该集合中所有可行解的最大值。通常需要对 N(x) 进行穷举搜索,可能会出现 P(y)<P(x) 的情况,因此可以逃脱局部最优解。当然,我们同时记录本次更新的位置在禁忌表 Tabulist 中,并且在一段时间 L 内不允许再次在该位置更新,直到 L 轮后该位置从禁忌表中移除。这样可以避免循环更新的问题,如 x→y→x→y→⋯。
【例 2】(组合优化问题)有限解空间为 X,约束条件为 gj(x)>0 (1≤j≤m),其中 g1,g2,⋯,gm 为整数值函数,其中满足奖励 P(x) 最大的可行解 x 为最优解,即
【例 3】(背包问题)背包容量 W,每个物品重量 w1,w2,⋯,wn,价值 v1,v2,⋯,vn,在重量不超过 W 的情况下最大化价值和,即可行解空间 X={0,1}n,
【解 1(模拟退火)】定义邻居函数 N1(x)={y∈{0,1}n:dist(x,y)=1},生成随机的 y∈N1(x)(可以看成选取随机整数 j∈[1,n],将 x 的第 j 位取反得到 y)。于是可以计算新的 W(y) 和 V(y)。判断是否满足 W(y)≤W,如果满足则考虑:
- 若 V(y)>V(x) 则令 x=y,
- 否则有 exp((V(y)−V(x))/T) 的概率令 x=y。
【解 2(禁忌搜索)】邻居的定义与解 1 相同,但使用贪心算法而不是随机法来搜索邻居中最好的方案更新 x。假定至少存在一个 i 使得 xi=0、i 不在禁忌表中、且将 xi 改为 1 后满足条件(不超过 W),那么在这些满足条件的 i 中选择最大的 Pi/wi,将 xi 改为 1;若不存在这种 i,那么考虑所有 xi=1 且 i 不在禁忌表中,在这些 i 中选择最小的 Pi/wi,将 xi 改为 0。
【例 4】(均匀图分割)有 2n 个节点的图,划分成节点相等的两部分 X0,X1,使得两部分之间的边最少。
【解】定义邻域为交换一对点 u∈X0,v∈X1,那么
选择 GX0,X1(u,v) 最大的 (u,v) 进行更新(爬山),或采用模拟退火、禁忌搜索等方法更新。
【例 5】(Steiner Triple System,STS)定义 STS 为一个集合系统 (V,B),每个块 b∈B 含有三个元素且 V 中的每一对点都包含在唯一的一个块中,若 ∣V∣=v,则这样的系统称为 STS(v)。则 STS(v) 存在的必要条件是什么?并尝试构造出一个合法的 STS(v)。
一个 STS(7) 的例子为 V={1,2,3,4,5,6,7},且
【解】考虑对 {((x,y),b)∣x,y∈V;b∈B;x,y∈b} 双计数。
- 从 (x,y) 的角度来说,每对 (x,y) 恰好包含在 1 个 b∈B 中;总共有 (2v) 个可能的 (x,y);故得到 (2v)⋅1=(2v)。
- 从 b 的角度来说,每个 b∈B 中包含 3 个元素,因此有 3 对 (x,y);总共有 ∣B∣ 个可能的 b∈B;故得到 ∣B∣⋅3=3∣B∣。
因此,得到
由于 ∣B∣ 必须为整数,因此 STS(v) 存在的必要条件是 v≡1 mod 6 或 v≡3 mod 6。且容易发现 d(x)=(v−1)/2。
下面考虑给定一个满足条件的 v,构造 STS(v)。
- 定义 PSTS(V,B) 表示满足 V 中的每一对点最多包含在一个块中的情况。
- 每次向集合内添加一块(或删去后添加),保持 PSTS 性质,直到 ∣B∣=v(v−1)/6。
- 定义 live point 为对于 x∈V,出现在块中的次数小于 (v−1)/2,即还没达到度数上限。
- 定义 live pair 为还没有在任意一个块中出现的点对。任意一个 live point x 当前最多和
个点相遇,因此还有至少 2 个点没有遇到过,假设这两个点为 y,z,那么考虑 {x,y,z},若 {y,z} 也是 live pair,则直接将 {x,y,z} 加入集合 B,否则把原来的 {u,y,z} 删除后加入。
重复这个过程,结束后即构造出 STS(v)。
【例 6】(Hopfield Neural Network) Hopfield 神经网络可以看做无向图 G=(V,E),每条边 e 上有一个整数的权重 we。对每个节点 u 分配 Su=±1 的数值,若 ∀u∈V:
则称网络为稳定构型。要求找到一个稳定的构型。
【解】重复下面的过程:
- 找到一个不满足条件的点 u,此时 ∑v:(u,v)=e∈EweSuSv>0;
- 翻转 u 的数值,即 Su′←−Su 此时对新的 Su′ 必然有 ∑v:(u,v)=e∈EweSu′Sv<0 满足条件。