拓冰建站拓冰建站
首页 / 资讯中心 / 正文

scikit-opt 模拟退火(SA)深入:Fast / Boltzmann / Cauchy 三种降温策略的原理、参数与实战

scikit-opt 模拟退火SA深入Fast / Boltzmann / Cauchy 三种降温策略的原理、参数与实战【免费下载链接】scikit-optGenetic Algorithm, Particle Swarm Optimization, Simulated Annealing, Ant Colony Optimization Algorithm,Immune Algorithm, Artificial Fish Swarm Algorithm, Differential Evolution and TSP(Traveling salesman)项目地址: https://gitcode.com/GitHub_Trending/sci/scikit-opt本篇文章以 scikit-opt 仓库中的 docs/en/more_sa.md 为主体系统讲解模拟退火Simulated AnnealingSA在 scikit-opt 中的三种具体实现快速模拟退火Fast、玻尔兹曼模拟退火Boltzmann与柯西模拟退火Cauchy。你将学会三种策略各自的状态更新公式与降温曲线掌握SAFast、SABoltzmann、SACauchy的完整调用方式含边界约束版本并结合 sko/SA.py 的源码理解 Metropolis 准则、链长与停止条件等底层机制最终能在 examples/demo_sa.py 的基础上快速完成自己的优化任务。一、模拟退火三策略的数学模型三种降温 抽样方案scikit-opt 的模拟退火实现把生成新解抽样与温度更新降温两件事绑定在一起形成三种风格迥异的策略。文档 docs/en/more_sa.md 给出了三种策略的数学定义它们分别对应源码中SAFast、SACauchy、SABoltzmann三个类sko/SA.py。1.1 Fast快速退火策略u ~ Uniform(0, 1, size d) y sgn(u - 0.5) * T * ((1 1/T)**abs(2*u - 1) - 1.0) xc y * (upper - lower) x_new x_old xc c n * exp(-n * quench) T_new T0 * exp(-c * k**quench)该策略基于快速退火Fast Simulated Annealing思想扰动幅度由温度T与均匀分布随机数u共同决定扰动呈近似柯西分布的重尾特性有利于在大范围内跳变降温速度呈指数级衰减收敛速度较快。对照源码SAFast.get_new_x将公式中的upper - lower实现为可配置的hop步长sko/SA.pycool_down则按T_new T_max * exp(-c * k**quench)降温sko/SA.py其中c m * exp(-n * quench)sko/SA.py。1.2 Cauchy柯西策略u ~ Uniform(-pi/2, pi/2, sized) xc learn_rate * T * tan(u) x_new x_old xc T_new T0 / (1 k)柯西策略的扰动服从柯西分布通过tan(u)生成同样具有重尾特性允许偶尔产生大步长跳跃温度随迭代次数k线性反比下降T0 / (1 k)。源码实现中扰动幅度为learn_rate * T * tan(u)其中learn_rate默认取0.5sko/SA.py降温逻辑见 sko/SA.py。1.3 Boltzmann玻尔兹曼策略std minimum(sqrt(T) * ones(d), (upper - lower) / (3*learn_rate)) y ~ Normal(0, std, size d) x_new x_old learn_rate * y T_new T0 / log(1 k)玻尔兹曼策略的扰动服从高斯分布标准差取sqrt(T)与边界约束折算值两者中的较小者使扰动范围受边界约束钳制温度按对数函数T0 / log(1 k)缓慢下降属于三类中降温最慢、搜索最细致的方案。源码中std min(sqrt(T), hop / (3 * learn_rate))的钳制逻辑在 sko/SA.py 实现降温逻辑见 sko/SA.py。三种策略核心差异可总结如下策略生成新解降温公式特点Fast重尾扰动xc y * hopT_new T0 * exp(-c * k**quench)降温快适合快速粗寻优Cauchy柯西分布扰动xc learn_rate * T * tan(u)T_new T0 / (1 k)允许大步长跳跃Boltzmann高斯扰动标准差受边界钳制T_new T0 / log(1 k)降温最慢搜索细致二、三种策略的统一骨架SimulatedAnnealingBase 与 Metropolis 准则无论选择哪种策略它们都继承自SimulatedAnnealingBasesko/SA.py共享同一套核心流程初始化以x0作为初始解计算初始函数值作为best_y温度初始化为T_maxsko/SA.py内层循环链在每一温度下迭代L次通过get_new_x生成新解并依据Metropolis 准则决定是否接受# Metropolis df y_new - y_current if df 0 or np.exp(-df / self.T) np.random.rand(): x_current, y_current x_new, y_new if y_new self.best_y: self.best_x, self.best_y x_new, y_new见 sko/SA.py其含义是新解更优df 0必然接受新解更差时以概率exp(-df / T)接受温度越高越容易容忍坏解从而跳出局部最优外层循环每完成一轮链调用cool_down()降温并记录generation_best_Y、generation_best_X历史sko/SA.py停止条件温度降至T_min以下或连续max_stay_counter轮最优值未改善sko/SA.py。需要注意的是run()返回(best_x, best_y)同时结果也保存在对象的best_x、best_y、best_x_history、best_y_history属性中便于后续绘图分析examples/demo_sa.py。基类还提供了fit run的兼容别名sko/base.py不过官方更推荐使用run()。三、Fast 模拟退火基础用法与边界约束3.1 基础用法SAFast的类名定义为SA SAFastsko/SA.py因此from sko.SA import SA拿到的就是 Fast 策略。文档及示例代码 examples/demo_sa.py 中的基础用法如下from sko.SA import SAFast demo_func lambda x: x[0] ** 2 (x[1] - 0.05) ** 2 x[2] ** 2 sa_fast SAFast(funcdemo_func, x0[1, 1, 1], T_max1, T_min1e-9, q0.99, L300, max_stay_counter150) sa_fast.run() print(Fast Simulated Annealing: best_x is , sa_fast.best_x, best_y is , sa_fast.best_y)其中demo_func是一个三维连续函数理论最优点接近(0, 0.05, 0)。运行后best_x会收敛到该点附近best_y接近 0。3.2 带边界约束的用法当决策变量存在取值范围时可传入lb下界与ub上界两者必须同时给出否则抛错sko/SA.py。边界约束版本会在每次生成新解后用np.clip将解限制在界内sko/SA.pyfrom sko.SA import SAFast sa_fast SAFast(funcdemo_func, x0[1, 1, 1], T_max1, T_min1e-9, q0.99, L300, max_stay_counter150, lb[-1, 1, -1], ub[2, 3, 4]) sa_fast.run() print(Fast Simulated Annealing with bounds: best_x is , sa_fast.best_x, best_y is , sa_fast.best_y)源码提示从 sko/SA.py 的实现看SAFast实际从kwargs中读取的调温参数是m默认 1、n默认 1、quench默认 1以及影响扰动范围的hop有边界时默认ub - lb无边界时默认 10见 sko/SA.py。文档示例中传入的q0.99会被**kwargs静默吸收而不生效若要调节降温速度应改用quench等参数。四、Boltzmann 模拟退火基础用法与边界约束SABoltzmann使用高斯扰动与对数降温sko/SA.py。文档示例对应 examples/demo_sa.pyfrom sko.SA import SABoltzmann sa_boltzmann SABoltzmann(funcdemo_func, x0[1, 1, 1], T_max1, T_min1e-9, q0.99, L300, max_stay_counter150) sa_boltzmann.run() print(Boltzmann Simulated Annealing: best_x is , sa_boltzmann.best_x, best_y is , sa_boltzmann.best_y)带边界约束版本examples/demo_sa.py注意示例中lb传的是标量-1ub传的是列表[2, 3, 4]源码会用np.ones(n_dim)自动广播成与维度匹配的数组sko/SA.pyfrom sko.SA import SABoltzmann sa_boltzmann SABoltzmann(funcdemo_func, x0[1, 1, 1], T_max1, T_min1e-9, q0.99, L300, max_stay_counter150, lb-1, ub[2, 3, 4]) sa_boltzmann.run() print(Boltzmann Simulated Annealing with bounds: best_x is , sa_boltzmann.best_x, best_y is , sa_boltzmann.best_y)SABoltzmann还接受learn_rate参数默认 0.5它同时参与扰动标准差钳制与解更新的缩放sko/SA.py可视为该策略的核心灵敏度旋钮。五、Cauchy 模拟退火基础用法与边界约束SACauchy使用柯西分布扰动与线性反比降温sko/SA.py。文档示例对应 examples/demo_sa.pyfrom sko.SA import SACauchy sa_cauchy SACauchy(funcdemo_func, x0[1, 1, 1], T_max1, T_min1e-9, q0.99, L300, max_stay_counter150) sa_cauchy.run() print(Cauchy Simulated Annealing: best_x is , sa_cauchy.best_x, best_y is , sa_cauchy.best_y)带边界约束版本examples/demo_sa.pyfrom sko.SA import SACauchy sa_cauchy SACauchy(funcdemo_func, x0[1, 1, 1], T_max1, T_min1e-9, q0.99, L300, max_stay_counter150, lb[-1, 1, -1], ub[2, 3, 4]) sa_cauchy.run() print(Cauchy Simulated Annealing with bounds: best_x is , sa_cauchy.best_x, best_y is , sa_cauchy.best_y)同样地SACauchy的有效调节参数是learn_rate默认 0.5与hopq不参与计算。六、参数一览表如何为三种策略调参综合 docs/en/more_sa.md 与 sko/SA.py 源码三类模拟退火共享以下构造参数参数默认值作用func必填目标函数输入一维数组输出标量x0必填初始解一维数组其长度决定n_dimT_max100初始温度须满足T_max T_min 0sko/SA.pyT_min1e-7终止温度L300每个温度下的迭代次数链长Long of Chainsko/SA.pymax_stay_counter150最优值连续未改善的轮数上限用于提前停止冷却计数sko/SA.pylb/ub无决策变量上下界需同时传入可传标量或数组不传则无边界hop有界时ub-lb无界时 10Fast 策略的扰动缩放步长也参与 Boltzmann 的标准差钳制策略专属参数策略专属参数默认值作用SAFastm、n、quench1、1、1控制指数降温速度c m * exp(-n * quench)SABoltzmannlearn_rate0.5扰动标准差与解更新缩放SACauchylearn_rate0.5柯西扰动幅度缩放一般调参思路T_max应覆盖目标函数可能的函数值落差决定初始容忍坏解程度L决定每个温度下的精细度越大越接近精确搜索但耗时更长max_stay_counter用于提前终止避免在低收益阶段空转。文档示例统一采用T_max1, T_min1e-9, L300, max_stay_counter150对 demo 函数已足够收敛。七、结果验证与收敛曲线绘制run()结束后可从对象属性中取出历史收敛数据并绘制曲线examples/demo_sa.pyimport matplotlib.pyplot as plt import pandas as pd plt.plot(pd.DataFrame(sa.best_y_history).cummin(axis0)) plt.show()其中best_y_history记录了每个降温周期外层循环的最优函数值cummin取累计最小值后绘图可以直观看到三种策略各自的收敛速度与最终精度便于横向对比 Fast / Boltzmann / Cauchy 在具体问题上的表现。八、延伸SA 用于 TSP 组合优化虽然 docs/en/more_sa.md 只介绍连续函数上的三种策略但仓库将同一套 SA 骨架扩展到了组合优化——SA_TSPsko/SA.py。它以路径序列为解每轮以等概率从三种变异算子中选择一种生成新路径swap交换两个城市的访问顺序sko/operators/mutation.pyreverse反转一段子路径即 2-Opt 思想sko/operators/mutation.pytranspose将一段子路径整体搬移到另一位置sko/operators/mutation.py。用法示例完整代码见 examples/demo_sa_tsp.pyfrom sko.SA import SA_TSP sa_tsp SA_TSP(funccal_total_distance, x0range(num_points), T_max100, T_min1, L10 * num_points) best_points, best_distance sa_tsp.run()其降温曲线为T_new T_max / (1 log(1 k))sko/SA.py可借助best_x_history制作寻优过程动画。这也印证了更换get_new_x与cool_down即可定制新的 SA 策略的设计思路——三种连续策略与 TSP 版本本质上复用同一个SimulatedAnnealingBase骨架。小结三种策略选型Fast 降温最快、适合快速粗寻优Cauchy 重尾扰动、兼顾大范围跳变Boltzmann 对数降温最慢、搜索最细致。三者均支持lb/ub边界约束解会被clip在界内统一机制Metropolis 准则、链长L、温度区间[T_min, T_max]、max_stay_counter提前停止构成三类算法的公共骨架sko/SA.py调参要点Fast 调节m/n/quenchBoltzmann 与 Cauchy 调节learn_rate文档示例中的q参数在当前源码中不生效实战入口直接运行 examples/demo_sa.py 即可复现三策略全部示例再结合best_y_history绘制收敛曲线对比效果。【免费下载链接】scikit-optGenetic Algorithm, Particle Swarm Optimization, Simulated Annealing, Ant Colony Optimization Algorithm,Immune Algorithm, Artificial Fish Swarm Algorithm, Differential Evolution and TSP(Traveling salesman)项目地址: https://gitcode.com/GitHub_Trending/sci/scikit-opt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门