Skip to content

Local Search 局部搜索

用于解决最优化问题的一种启发式算法。

  • 步骤:
    • 从一个初始解/可行解(Feasible solution,FS)开始,搜索解的邻域。
    • 如果有更优的解,移动到该解继续搜索。

局部搜索容易陷入局部最优解。

这是一种马尔可夫链蒙特卡洛(Markov Chain Monte Carlo,MCMC)算法,使用马尔可夫链从随机分布中取样。

  • 步骤:
    • 初始化:选定初始状态 \(x_0\),令 \(t=0\)
    • 迭代:
      1. 生成:从某一容易抽样的分布 \(Q(x'|x_t)\) 中随机生成候选状态 \(x'\);[注 1]
      2. 计算:计算是否采纳候选状态的概率 \(A(x'|x)=\min \left(1,{\frac {P(x')}{P(x)}}{\frac {Q(x|x')}{Q(x'|x)}}\right)\)
      3. 接受或拒绝:
        • \([0,1]\) 的均匀分布中生成随机数 \(u\)
        • \(u\leq A(x'|x)\),则接受该状态,并令 \(x_{t+1}=x'\)
        • \(u>A(x'|x)\),则拒绝该状态,并令 \(x_{t+1}=x_t\)(复制原状态);
      4. 增量:令 \(t=t+1\)

模拟退火(Simulated Annealing,SA)基于 MH 算法,能够依概率收敛到全局最优解。

s := s0; e := E(s)                  // 设定目前状态为 s0,其能量 E(s0)
k := 0                              // 评估次数 k
while k < kmax and e > emin         // 若还有时间(评估次数 k 还不到 kmax)且结果还不够好(能量 e 不够低)则:
    sn := neighbour(s)              // 随机选取一邻近状态 sn
    en := E(sn)                     // sn 的能量为 E(sn)
    if random() < P(e, en, temp(k/kmax)) // 决定是否移至邻近状态 sn
        s := sn; e := en            // 移至邻近状态 sn
    k := k + 1                      // 评估完成,次数 k 加一
return s                            // 返回状态 s

Vertex Cover Problem 顶点覆盖问题

问题描述
  • 给定无向图 \(G = (V, E)\)
  • 顶点覆盖:\(C \subseteq V\),对于每条边 \((u, v) \in E\),至少有一个端点在 \(C\)
  • 最小顶点覆盖:\(|C|\) 最小
问题分析
  • NP-hard
  • 无多项式时间算法
  • 近似算法:贪心算法
解法
  • 初始解:\(C = V\)
  • 邻域:从 \(C\) 中随机选择一个顶点 \(v\),将 \(v\)\(C\) 中移除
  • 初始解:\(C = V\)
  • 邻域:从 \(C\) 的领域中随机选择一个覆盖 \(C'\)
  • 如果 \(C'\) 更优,则接受 \(C'\),否则以一定概率接受 \(C'\)

Hopfield Network 霍普菲尔德网络

问题描述
  • 二值 Hopfield 网络:\(N\) 个神经元,每个神经元的状态为 \(\oplus 1\)
  • 边的权重: \(w_{e}\):当 \(w_{e} > 0\) 时,该边两端的神经元 \(i\)\(j\) 状态应当不同;当 \(w_{e} < 0\) 时,神经元 \(i\)\(j\) 状态应当相同。权重的绝对值表示约束的强度。显然,当 \(w_{ij}s_i s_j < 0\) 时,约束被满足。
  • 点的满足度:\(E = \sum_{e} w_{e} s_i s_j\)。当其 \(\leq 0\) 时,约束被满足。
  • 网络的稳定性:当所有点的约束都被满足时,网络达到稳定状态。
  • 目标:找到一个稳定状态。
问题分析
解法
  • 初始解:随机生成一个状态
  • 邻域:随机选择一个未被满足的神经元,翻转其状态
  • 直到满足所有约束

该算法在最多 \(W=\sum_e |w_e|\) 步内收敛到一个稳定状态。

证明

Maxium Cut Problem 最大割问题

问题描述
  • 给定无向图 \(G = (V, E)\)
  • 割:将 \(V\) 分为两个不相交的集合 \(S\)\(T\)\(S \cup T = V\)
  • 割的大小:\(|E(S, T)|\),其中 \(E(S, T)\) 表示 \(S\)\(T\) 之间的边
  • 最大割:割的大小最大
问题分析

这是 Hopfield 网络的一个变种,其中 \(w_{ij} = 1\)。``````