模拟退火算法是一种概率型优化算法,用于在大搜索空间中寻找近似最优解。这个算法受到物理退火过程的启发,物理退火过程中材料被加热后再慢慢冷却,原子在高温下获得移动的自由度,并在冷却过程中逐渐减少,最终形成低能量的有序结构。
在这张图中,展示了模拟退火算法的一个迭代步骤。这里是这个过程的解释:
- 算法计算新的解 x new x_{\text{new}} xnew 的目标函数值 f ( x new ) f(x_{\text{new}}) f(xnew) 与当前解 x current x_{\text{current}} xcurrent 的目标函数值 f ( x current ) f(x_{\text{current}}) f(xcurrent) 之差,记为 δ = f ( x new ) − f ( x current ) \delta = f(x_{\text{new}}) - f(x_{\text{current}}) δ=f(xnew)−f(xcurrent)。
- 如果 δ < 0 \delta < 0 δ<0,则新的解的目标函数值比当前解要好,因此算法会接受新的解,这称为“下山”(downhill)移动,意味着我们向最优解的方向前进。
- 如果 δ ≥ 0 \delta \geq 0 δ≥0,则新的解的目标函数值不比当前解好,但算法仍然有一定概率接受这个新解,以允许探索可能的更好的局部区域,这是为了避免早期收敛于局部最优解。这称为“上山”(uphill)移动。
- 接受上山移动的概率是 exp ( − δ / T ) \exp(-\delta/T) exp(−δ/T),其中 T T T 是一个控制参数,通常称为“温度”。随着时间的推移,温度会逐渐降低,这意味着接受较差解的概率会降低。
- 图中还说明了 exp ( − δ / T ) \exp(-\delta/T) exp(−δ/T) 的值随 δ \delta δ 和温度 T T T 的变化情况。如果 δ \delta δ 很大,表示新解比当前解差很多,那么 exp ( − δ / T ) \exp(-\delta/T) exp(−δ/T) 将接近于零;如果 δ \delta δ 很小,表示新解只是稍微比当前解差,那么 exp ( − δ / T ) \exp(-\delta/T) exp(−δ/T) 的值将会更大。如果温度 T T T 很高,算法趋于接受各种解,即使它们比当前解差;如果 T T T 很低,算法主要接受那些能使目标函数值降低的解。
这种机制允许算法在早期阶段跳出局部最小值,并在后期阶段精细搜索全局最小值。
遗传算法的目标是在给定的搜索空间 G G G 中找到使目标函数 f ( x ) f(x) f(x) 最大化的解 x x x。在这个算法中, f ( x ) f(x) f(x) 被称作适应度函数(fitness function),它用来评价解的质量。
图中列出了基本遗传算法的主要步骤:
- 设置初始种群。种群由多个个体组成,每个个体(或称为染色体)都是问题解的一个编码,通常用二进制字符串表示。
- 创建新一代的种群。
- 选择父代:根据相对适应度 f i ∑ f i \frac{f_i}{\sum f_i} ∑fifi 选择用于繁殖的父代。适应度高的个体被选为父代的概率更大。
- 生成后代:通过遗传操作,如交叉(例如1点交叉),从父代创建后代。在1点交叉中,选取两个父代的染色体,在随机位置断开,然后交换断点后的部分,形成两个新的染色体。
- 突变:以一定的概率 p mut p_{\text{mut}} pmut 翻转染色体中的位(bit),以引入新的遗传变异。
- 如果达到了最大的代数限制,算法停止。
图中还展示了交叉和突变的例子:
- 交叉示例:父代染色体 10101
和 00110
经过1点交叉后成为 10110
和 00101
。
- 突变示例:染色体 101011
在突变后成为 111111
。
遗传算法通过模拟自然选择的过程,在多代中逐步演化出越来越好的解。这种算法特别适用于搜索空间巨大且不适合传统优化方法的复杂优化问题。
分枝定界算法是用来解决包含整数变量的优化问题的一种方法,该方法结合了枚举和剪枝策略。算法的基本步骤如下:
- U ∗ U^* U∗ 被设置为正无穷大( + ∞ +\infty +∞),表示最佳可行整数解的目标函数值还未知。
- I I I 是整数变量的索引集合。
- 解决原问题的线性规划(LP)松弛,得到最优解 x ∗ x^* x∗。
- 分枝:
- 选取最近创建的子问题。
- 选择分枝变量 x j x_j xj( j ∈ I j \in I j∈I,且 x j ∗ x_j^* xj∗ 不是整数)。
- 创建两个新的子问题,并添加约束 x j ≤ ⌊ x j ∗ ⌋ x_j \leq \lfloor x_j^* \rfloor xj≤⌊xj∗⌋ 和 x j ≥ ⌈ x j ∗ ⌉ + 1 x_j \geq \lceil x_j^* \rceil + 1 xj≥⌈xj∗⌉+1。
- 定界:
- 使用LP松弛计算下界 L i L_i Li。
- 剪枝:如果满足以下条件,则剪去分支 i i i:
- L i > U ∗ L_i > U^* Li>U∗:计算的下界超过当前找到的最好解的值。
- LP松弛没有可行解。
- LP解 x ∗ x^* x∗ 的整数变量部分对于所有 j ∈ I j \in I j∈I 都是整数,即当前找到了一个更好的整数解,因此更新 U ∗ U^* U∗。
- 如果没有剩余的子问题需要探索,算法结束。
通过这个过程,分枝定界算法能够有效地探索解空间,同时避免了对所有可能的整数解进行完全枚举。这种方法在实际中被广泛应用于各类优化问题,尤其是在工业工程、运筹学和计算机科学等领域。