目录
- 模拟退火算法简介
- 模拟退火算法的步骤
- 模拟退火算法的Python实现
- 场景:函数优化问题
- 代码解释
- 总结
模拟退火算法简介
模拟退火算法(Simulated Annealing, SA)是一种基于物理退火过程的随机搜索算法,用于寻找全局最优解。其灵感来源于物理中的退火过程,退火是指将固体材料加热到高温再逐渐冷却,使其内部结构趋于有序状态,从而达到能量最低的稳定状态。模拟退火算法通过引入“温度”参数,逐渐降低“温度”,从而减少接受较差解的概率,最终收敛到全局最优解。
模拟退火算法的步骤
-
初始化:
- 设置初始解和初始温度。
- 定义目标函数。
-
生成新解:
- 在当前解的邻域中随机生成一个新解。
-
接受新解:
- 计算新解的目标函数值。如果新解比当前解好,则接受新解。
- 如果新解比当前解差,则根据一定的概率接受该解,接受概率与当前温度和目标函数差值相关。
-
降温:
- 按照一定的策略降低温度(例如线性降温或指数降温)。
-
迭代:
- 重复步骤2至步骤4,直到温度降至某个阈值或达到最大迭代次数。
-
输出结果:
- 返回最终的最优解。
模拟退火算法的Python实现
我们将通过Python实现模拟退火算法,并通过解决一个简单的函数优化问题来演示该算法的应用。
场景:函数优化问题
import numpy as np
import matplotlib.pyplot as plt
def objective_function(x):
return x**2 + 4 * np.sin(5 * x) + 0.1 * x**4
def simulated_annealing(objective_function, bounds, n_iterations, initial_temp, cooling_rate):
best = bounds[0] + (bounds[1] - bounds[0]) * np.random.rand()
best_eval = objective_function(best)
curr, curr_eval = best, best_eval
temp = initial_temp
for i in range(n_iterations):
candidate = curr + np.random.uniform(-1, 1)
candidate = np.clip(candidate, bounds[0], bounds[1])
candidate_eval = objective_function(candidate)
if candidate_eval < best_eval:
best, best_eval = candidate, candidate_eval
diff = candidate_eval - curr_eval
t = np.exp(-diff / temp)
if diff < 0 or np.random.rand() < t:
curr, curr_eval = candidate, candidate_eval
temp = temp * cooling_rate
return best, best_eval
# 参数设置
bounds = [-10, 10] # 搜索空间
n_iterations = 1000 # 迭代次数
initial_temp = 10.0 # 初始温度
cooling_rate = 0.99 # 降温速率
# 运行模拟退火算法
best_solution, best_value = simulated_annealing(objective_function, bounds, n_iterations, initial_temp, cooling_rate)
print(f"最优解: x = {best_solution}, 最小值: f(x) = {best_value}")
# 绘制结果
x = np.linspace(bounds[0], bounds[1], 1000)
y = objective_function(x)
plt.plot(x, y, label='Objective Function')
plt.plot(best_solution, best_value, 'ro', label='Best Solution')
plt.title('Simulated Annealing Optimization')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.show()
代码解释
-
目标函数:
objective_function
定义了我们要最小化的函数。
-
模拟退火主循环:
- 初始解
best
随机生成,并在其邻域内生成候选解candidate
。 - 通过计算目标函数值
candidate_eval
来决定是否接受新解。 - 如果新解更优,则直接接受。如果不如当前解,则根据概率
t
来决定是否接受,这种机制允许算法跳出局部最优,寻找全局最优。
- 初始解
-
温度下降:
- 温度
temp
逐渐下降,降低接受较差解的概率,最终收敛到最优解。
- 温度
-
结果输出与绘图:
- 打印最优解
best_solution
及其对应的最小值best_value
。 - 使用Matplotlib绘制函数曲线及最优解位置。
- 打印最优解
总结
模拟退火算法通过模拟物理退火过程来求解复杂的优化问题。该算法的优势在于能够有效地跳出局部最优解,寻找全局最优解。尽管在理论上无法保证找到绝对最优解,但在实际应用中,模拟退火算法通常能够找到非常接近最优的解,并且实现相对简单、参数调整灵活。