一篇文章搞懂退火算法
模拟退火算法(Simulated Annealing, SA)是一种通用的概率方法,在给定的大规模搜索空间中寻找问题的近似最优解。该算法的灵感来源于固体物理领域中的退火过程,在这一过程中物质被加热至高温后经历缓慢降温的过程,在加热阶段物质分子获得较大的运动自由度,在温度逐渐降低的过程中分子逐步趋于能量较低的稳定状态。经过这一系列降温步骤最终使得系统趋于能量最低的状态即达到了晶体结构状态
定义
模拟退火是一种经典的最优化算法,在解决复杂优化问题时具有显著效果。该算法基于物理退火过程模拟的方法旨在寻找全局最优或其近似值。该算法在搜索过程中偶尔会接受较劣的解决方案,从而避免陷入局部最优状态,并将其定义为"退火"过程。
原理
模拟退火算法的基本原理包括以下几个步骤:
- 初始化阶段:选择一个较高的初始温度,并随机选取一个初始最优编码作为当前最优编码。
- 生成候选编码:基于当前最优编码,在其邻域内引入随机扰动生成一个新的候选编码。
- 接受准则定义为:当新产生的候选编码的目标函数值优于当前最优值时,则直接采用该候选作为新的当前最优;否则,在一定的概率下仍可接受此较差的候选,并且这种接受概率会伴随温度的下降逐步减小。
- 降温策略:将系统温度按一定速率逐步降低。
- 停止条件设定为:当系统温度降至预设阈值或者算法满足其他停止准则时,则退出迭代过程并输出最终结果。
用途
模拟退火算法被广泛应用在组合优化领域中的各种问题中,在如旅行商问题(TSP)、作业调度、神经网络的训练过程以及VLSI设计过程中表现尤为突出。
Python Demo
以下是一个用模拟退火算法优化旅行商路径的Python代码示例。
pip install numpy
然后,运行以下代码:
import numpy as np
import math
# 计算两个城市之间的距离
def distance(city1, city2):
return math.sqrt((city1[0] - city2[0])**2 + (city1[1] - city2[1])**2)
# 计算整个路径的总距离
def total_distance(cities):
return sum(distance(cities[i], cities[i - 1]) for i in range(len(cities)))
# 模拟退火算法
def simulated_annealing(cities, temperature, cooling_rate, iterations):
current_solution = cities.copy()
best_solution = current_solution.copy()
np.random.shuffle(current_solution)
for i in range(iterations):
new_solution = current_solution.copy()
# 随机交换两个城市的位置
idx1, idx2 = np.random.randint(0, len(cities), size=2)
new_solution[idx1], new_solution[idx2] = new_solution[idx2], new_solution[idx1]
current_distance = total_distance(current_solution)
new_distance = total_distance(new_solution)
# 如果新解更好,或者以一定概率接受较差的解
if new_distance < current_distance or np.random.rand() < math.exp(-(new_distance - current_distance) / temperature):
current_solution = new_solution
if new_distance < total_distance(best_solution):
best_solution = new_solution
# 降温
temperature *= (1 - cooling_rate)
return best_solution
# 创建城市坐标
cities = [(np.random.rand(), np.random.rand()) for _ in range(10)]
# 设置初始温度、冷却率和迭代次数
initial_temperature = 10000
cooling_rate = 0.003
iterations = 10000
# 运行模拟退火算法
best_route = simulated_annealing(cities, initial_temperature, cooling_rate, iterations)
# 打印最优路径和总距离
print("最优路径:", best_route)
print("总距离:", total_distance(best_route))
该段代码首先随机生成一组城市坐标,并随后采用模拟退火算法寻求旅行商问题的最佳路径。当该算法运行完成后,则会输出最佳路径及其总距离。请注意,在本示例中涉及的参数(例如初始温度、冷却速率及迭代次数)可能需要根据具体情况进行微调以达到最佳效果。
--------------------------------------------------------------------------------------------------------------------------------------
作者个人简介:
💐大厂多年AI算法经验,创业中,兼任算法/产品/工程
🍎持续分享aigc干货
❤️提供人工智能相关岗位简历优化和技能辅导服务,欢迎骚扰。
🌺提供aigc产品推广服务
微信公众号:
Ai自然说

关注后,自动发送您一份ai算法学习路线资料,完全免费。
个人微信:
pichaqiu1

这是我的个人微信,欢迎添加,找我讨论AI相关的内容。
微信群:

创建了一个全新的交流群。我们邀请您在群里展开深入交流讨论:人工智能领域的技术和产品动态、运营策略以及最新的商业知识与资讯分享。诚挚邀请您扫描二维码加入我们的交流群。
知识星球:

搭建了一个学习社群,在这个平台里我会定期输出高质量的学习资源和深度分析内容,请问有意向的朋友可加我好友交流吗?
