通用优化方法:模拟退火、局部搜索与进化算法
1. 模拟退火算法
模拟退火算法是一种通用的优化方法,其核心在于模拟物理退火过程,通过控制温度的变化来寻找最优解。在使用该算法时,需要确定一个冷却时间表,即温度 (T) 随时间的变化方式。
-
简单冷却时间表
:
- 选择一个起始温度 (T_0),这个温度要足够大,以确保所有邻居解都能被接受。
- 对于每个温度,有一个固定的迭代次数 (N)。(N) 应尽可能小,但要保证系统能接近平衡状态。
- 每经过 (N) 次迭代,将温度 (T) 乘以一个小于 1 的常数 (\alpha)(通常在 0.8 到 0.99 之间)。
- 当 (T) 变得非常小,使得向较差解的移动几乎不可能时(即 (T) 与任意两个可行解的目标值最小差值相当时),将 (T) 设为 0,此时退火过程以爬山搜索结束。
-
动态冷却时间表
:
- 初始温度可以从一个较低值开始,快速增加,直到接受的转移比例接近 1。
- 根据局部搜索中实际观察到的 (f(x)) 的变化来决定 (T) 应降低的幅度。如果温度变化与观察到的变化相比太小,则效果不佳;如果变化太大,则系统可能过早陷入局部最优。
- 降低温度前的步数可以根据实际接受的移动次数来确定。还可以使用简化的统计模型来估计系统何时接近平衡。
下面是一个简单的模拟退火算法流程:
graph TD
A[初始化温度 \(T_0\) 和迭代次数 \(N\)] --> B[生成初始解 \(x\)]
B --> C{是否达到终止条件}
C -- 否 --> D[在当前解 \(x\) 的邻域内随机选择一个解 \(x'\)]
D --> E[计算目标函数差值 \(\Delta f = f(x') - f(x)\)]
E -- \(\Delta f \leq 0\) --> F[接受新解 \(x = x'\)]
E -- \(\Delta f > 0\) --> G{以概率 \(e^{-\Delta f / T}\) 接受新解}
G -- 是 --> F
G -- 否 --> H[保持当前解 \(x\) 不变]
F --> I{是否完成 \(N\) 次迭代}
I -- 是 --> J[降低温度 \(T = \alpha T\)]
I -- 否 --> D
J --> C
C -- 是 --> K[输出最优解]
2. 模拟退火在图着色问题中的应用
图着色问题是一个经典的优化问题,给定一个无向图 (G = (V, E)),需要找到一个节点着色方案 (c: V \to 1..k),使得相邻节点颜色不同,目标是最小化颜色数 (k)。这里介绍两种模拟退火方法:
-
Kempe 链退火
:
-
目标函数
:选择目标函数 (f(c) = \sum_{i} |C_i|^2),其中 (C_i = {v \in V : c(v) = i}) 是颜色为 (i) 的节点集合。该函数要被最大化,当大的颜色类以牺牲小的颜色类为代价进一步扩大时,目标函数值增加,最终会使一些颜色类为空,从而减少颜色数。
-
局部变化
:传统的局部变化是对单个顶点重新着色,而 Kempe 链退火使用更宽松的定义。假设要将节点 (v) 的颜色从 (i) 变为 (j),为了保持可行性,需要改变其他节点的颜色。考虑包含颜色 (i) 和 (j) 的节点诱导子图 (H),包含 (v) 的 (H) 的连通分量就是 Kempe 链 (K),通过交换 (K) 中颜色 (i) 和 (j) 来保持可行性。
-
惩罚函数方法
:
-
放松约束
:为了使搜索更灵活,更容易找到起始解,允许非法着色(即相邻节点颜色相同)。
-
初始解生成
:通过猜测所需颜色数并随机着色节点来生成初始解。
-
邻域生成
:随机选择一个颜色 (j) 和一个颜色为 (j) 的节点 (v),然后从已使用的颜色和一个新的未使用颜色中随机选择一个新颜色给节点 (v)。
-
目标函数
:目标是最小化 (f(c) = 2\sum_{i} |C_i| \cdot |E_i| - \sum_{i} |C_i|^2),其中 (E_i = E \cap (C_i \times C_i)) 是连接颜色为 (i) 的两个节点的边的集合。第一项惩罚非法边,第二项有利于大的颜色类。该目标函数的局部最小值是合法着色,因此即使从非法着色开始,惩罚版本的模拟退火也能保证找到合法着色。
3. 实验结果
不同的模拟退火方法在不同类型的图上表现不同:
| 图类型 | 边概率 (p) | Kempe 链退火 | XRLF 算法 | 惩罚函数退火 | 固定 - K 退火 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 随机图((G_{n,p}) 模型) | 0.5 | 给定足够时间可产生很好的着色 | 能在更短时间内产生更好的解 | - | - |
| 随机图((G_{n,p}) 模型) | 0.9 | 表现优于 XRLF | - | - | - |
| 随机图((G_{n,p}) 模型) | 0.1 | 被惩罚函数退火超越 | - | 有时可与 XRLF 竞争 | - |
| 随机几何图 | - | 表现良好 | - | - | 优于 Kempe 链退火 |
这表明模拟退火方法的相对性能强烈依赖于输入类和可用的计算时间,不能基于其他实例类的经验来预测其在给定实例类上的性能。
4. 局部搜索的改进方法
- 阈值接受 :使用参数 (T) 作为阈值,新状态的 (f(x)) 值低于阈值时被接受,否则不接受。
- 禁忌列表 :局部搜索算法有时会反复回到相同的次优解,形成循环。禁忌搜索通过维护一个禁忌列表来避免这种情况,列表中的“解元素”在一段时间内应在新解中“避免”。例如在图着色中,将节点 (v) 从颜色 (i) 变为 (j) 后,将元组 ((v, i)) 存储在禁忌列表中,表明只要 ((v, i)) 在列表中,颜色 (i) 就禁止用于节点 (v)。通常,如果通过将节点 (v) 着色为 (i) 获得了改进的解,则不应用此禁忌条件。
- 重启 :一个调整良好的局部搜索算法通常会移动到一个有良好可行解的区域,然后探索该区域以寻找更好的局部最优解。但可能存在其他遥远的区域有更好的解。因此,多次使用不同的随机起始解运行算法是有意义的,因为不同的起始点可能会探索不同的良好解区域。即使这些重启不能提高算法的平均性能,也可能使其更健壮,减少产生严重次优解的可能性。
5. 并行局部搜索
局部搜索难以并行化,因为它按顺序执行步骤。但可以通过以下方式进行并行化:
- 并行评估一个步骤中的多个操作,例如并行评估邻域 (N(x)) 中的多个成员。在 Kempe 链退火中,多个处理器可以从不同节点开始探索不同的 Kempe 链。
- 尝试在每个步骤中执行更多工作以减少步骤数,例如使用更大的邻域。
- 执行多个独立的局部搜索,然后取最佳结果,这在某种程度上是重启策略的并行化。成功的局部搜索策略并行化可能会在多个级别上使用并行性,例如每个处理器芯片上的几个线程可以并行评估目标函数,多个这样的线程组处理大邻域中的不同成员,分布式内存机器的多个节点进行独立的局部搜索。
通用优化方法:模拟退火、局部搜索与进化算法
6. 进化算法概述
进化算法借鉴了生物进化的原理,通过模拟生物的突变、重组和适者生存机制来寻找优化问题的解。在进化算法中:
-
基因组与解的对应
:个体的基因组对应于可行解的描述,不可行解可视为“死亡”或“不健康”的个体。
-
种群的重要性
:需要一个足够大的种群,否则重组会退化为近亲繁殖,适者生存的优势无法体现。因此,进化算法处理的是一组可行解,而不是像局部搜索那样只处理一个解。
-
繁殖与选择
:种群中的个体产生后代,由于资源有限,更适应环境的个体更有可能生存并产生更多后代。在进化算法中,使用适应度函数 (f) 评估可行解,适应度更高的解更有可能生存并产生后代。通常,进化算法使用一个大小有限的解池,例如大小为 (N),通过保留 (N) 个最佳解来实现适者生存。
-
突变与重组
:即使是通过细胞分裂繁殖的细菌,后代也不会与亲代完全相同,这是由于突变的存在。在解中,局部变化类似于突变。而重组是进化中更重要的因素,后代包含来自双亲的遗传信息。通过重组可以更快地将具有不同有用突变的个体组合在一起,而获得具有两个新有用突变的个体则需要更长时间。
7. 通用进化算法流程
下面是一个通用进化算法的流程:
graph TD
A[创建初始种群 population = {x1, ..., xN}] --> B{是否结束}
B -- 否 --> C{是否进行交配步骤}
C -- 是 --> D[选择高适应度个体 x1, x2 进行交配 mate(x1, x2) 得到 x′]
C -- 否 --> E[选择高适应度个体 x1 进行突变 mutate(x1) 得到 x′]
D --> F[将 x′ 加入种群 population := population ∪ {x′}]
E --> F
F --> G[筛选种群 population := {x ∈ population : x 足够适应}]
G --> B
B -- 是 --> H[输出最优解]
具体步骤如下:
1.
创建初始种群
:创建一个大小为 (N) 的初始种群,这个过程应包含随机性,同时使用启发式方法生成良好的初始解是有益的。
2.
循环迭代
:
-
决定繁殖方式
:以概率决定是通过突变还是重组产生后代。
-
选择繁殖个体
:选择一个或两个个体进行繁殖,为了对种群施加选择压力,繁殖成功应基于个体的适应度。但通常不建议只使用最适应的个体,因为这可能导致种群过于单一,从而出现近亲繁殖问题。例如,可以随机选择繁殖候选者,为适应度更高的个体赋予更高的选择概率。一种选择是按适应度对个体排序,然后将繁殖概率定义为排名的递减函数。
-
产生后代
:最关键的操作是
mate
函数,用于从两个祖先产生新后代。常见的交配操作是交叉(crossover),假设个体由 (n) 位字符串表示,选择一个整数 (k),新个体的前 (k) 位来自一个亲本,后 (n - k) 位来自另一个亲本。也可以随机选择 (k) 个位置来自第一个亲本,其余位来自另一个亲本。对于不同的问题,交叉操作的实现方式可能不同。例如,在背包问题中,交叉是一种自然的选择,每一位决定对应物品是否放入背包;而在图着色问题中,可能更自然的方式是将图切成两块,使切割的边最少,一块继承第一个亲本的颜色,另一块继承第二个亲本的颜色,对于连接两块的边导致的颜色冲突,可以使用启发式方法修复,例如为错误着色的节点选择最小合法颜色。
-
筛选种群
:将新产生的后代加入种群,然后筛选出足够适应的个体,保留种群大小为 (N)。
8. 不同优化算法对比
为了更清晰地了解模拟退火算法、局部搜索改进方法和进化算法的特点,下面给出一个简单的对比表格:
| 算法类型 | 核心思想 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- | ---- |
| 模拟退火算法 | 模拟物理退火过程,通过控制温度变化寻找最优解 | 能跳出局部最优,理论上可找到全局最优解 | 计算时间长,参数选择困难 | 复杂的全局优化问题 |
| 阈值接受 | 使用阈值判断新状态是否接受 | 简单易实现 | 可能陷入局部最优 | 对计算效率要求高,不太复杂的优化问题 |
| 禁忌搜索 | 通过禁忌列表避免循环,跳出局部最优 | 能有效避免局部最优,提高搜索效率 | 禁忌列表的维护和参数设置较复杂 | 组合优化问题,如旅行商问题、图着色问题 |
| 重启策略 | 多次使用不同随机起始解运行算法 | 可能探索到不同的解区域,减少次优解可能性 | 增加计算量 | 有多个局部最优解,难以确定全局最优解的问题 |
| 进化算法 | 模拟生物进化的突变、重组和适者生存机制 | 能处理复杂的优化问题,具有较强的鲁棒性 | 计算复杂度高,参数调整困难 | 多目标优化问题、复杂约束条件的优化问题 |
9. 总结
模拟退火算法、局部搜索改进方法和进化算法都是通用的优化方法,它们各自有其特点和适用场景。模拟退火算法通过模拟物理退火过程,在温度控制下逐步寻找最优解;局部搜索的改进方法如阈值接受、禁忌列表和重启策略,针对局部搜索容易陷入局部最优的问题进行了优化;进化算法则借鉴了生物进化的原理,通过种群的繁殖、突变和选择来寻找解。在实际应用中,需要根据问题的特点、计算资源和时间要求等因素选择合适的算法。同时,这些算法也可以相互结合,以获得更好的优化效果。例如,可以在进化算法中引入模拟退火的思想,对新产生的后代进行一定概率的接受,从而提高算法的全局搜索能力。
超级会员免费看

1160

被折叠的 条评论
为什么被折叠?



