模拟退火算法
模拟退火算法​模拟退火算法最早的思想由Metropolis等1953提出1983年Kirkpatrick等将其应用于组合优化。算法的目的克服优化过程陷入局部极小克服初值依赖性。物理退火过程在物理学中退火是将金属加热到极高温度然后让其极其缓慢地冷却的过程。高温状态原子运动剧烈处于无序状态高能量。等温过程对于与环境换热而温度不变的封闭系统系统状态的自发变化总是朝自由能减少的方向进行当自由能达到最小时系统达到平衡态缓慢冷却原子逐渐找到最稳定的位置形成整齐的晶体结构。最终状态系统的内能最低全局最优。如果冷却得太快淬火Quenching原子来不及调整位置就被“冻结”在杂乱的状态系统处于亚稳态局部最优内能较高材料脆。温度越低物体的能量状态越低到达足够的低点时液体开始冷凝与结晶在结晶状态时系统的能量状态最低。缓慢降温退火时可达到最低能量状态但如果快速降温淬火会导致不是最低能态的非晶形。Boltzmann概率分布在温度T分子停留在状态r满足Boltzmann概率分布在同一个温度T选定两个能量E1E2有1在同一个温度分子停留在能量小状态的概率大于停留在能量大状态的概率2温度越高不同能量状态对应的概率相差越小温度足够高时各状态对应概率基本相同。3随着温度的下降能量最低状态对应概率越来越大温度趋于0时其状态趋于1Metropolis准则以概率接受新状态假设当前状态为 x能量为 E(x)。我们随机生成了一个邻域新解 x能量为 E(x)。定义能量差为简单来说它的核心数学思想是以一定的概率接受一个“更差”的解从而跳出局部最优陷阱最终趋向全局最优。情况 A新解更好 (ΔE0)如果新解的能量更低比如在下山我们100% 接受这个新解。P(accept)1这对应了贪心算法Gradient Descent的部分。情况 B新解更差 (ΔE0)如果新解的能量更高比如要爬坡反方向我们不是直接拒绝而是以一定的概率接受它。这个概率P服从玻尔兹曼分布 (Boltzmann Distribution)ΔE能量差肯定为正。T当前的温度。k物理中的玻尔兹曼常数在算法中通常设为 1。(1) 温度 T 极高时 (探索阶段)接受概率接近 100%。哪怕新解比旧解差很多算法也会接受。算法在搜索空间中随机游走 (Random Walk)像个醉汉。这保证了它能翻越极高的山峰从深坑里跳出来遍历整个空间。(2) 温度 T 降低时 (过渡阶段)随着 T 变小分母变小指数部分变成较大的负数。如果Delta E 很大解变差很多概率 P\(就会很小如果 \Delta E\)很小只差一点点概率 P$还比较大。算法开始变得挑剔。它仍然允许跳出浅坑局部最优但不再接受那些太离谱的差解。(3) 温度 T 极低时 (收敛阶段)接受更差解的概率几乎为 0。算法退化为贪心算法 (Hill Climbing)。它只接受好解不再爬坡。这时候它应该已经落入了全局最优降温系数在每一个固定的温度 T下算法进行多次迭代。这实际上是在生成一个马尔可夫链。 如果迭代次数足够多系统会达到服从玻尔兹曼分布热平衡分布 (Stationary Distribution)。当 T缓慢下降时概率分布图会变得越来越尖Peaked大部分概率密度会集中在全局最小值的附近。引入冷却系数数学上的最优降温 (对数冷却) Geman 在 1984 年证明如果降温速度足够慢满足那么模拟退火以概率 1 收敛到全局最优解。缺点这个速度太慢了慢到实际上无法使用可能需要几百年。工程上的降温 (指数冷却)这是对收敛速度和求解质量的折衷。虽然理论上不保证 100% 找到全局最优但在有限时间内能找到“足够好”的解。Rosenbrock 函数验证N 维 Rosenbrock 函数的通常定义如下\[f(\mathbf{x}) \sum_{i1}^{N-1} [100 (x_{i1} - x_i^2)^2 (1 - x_i)^2] \]c库代码如下sa.hpp/* by 01130.hk - online tools website : 01130.hk/zh/guid.html */ #ifndef SA_SA_HPP #define SA_SA_HPP #include params.hpp #include policies.hpp #include detail/solver.hpp namespace sa { /** * brief 模拟退火通用求解函数 * * tparam State 状态类型 (自动推导) * tparam EnergyFunc 能量函数类型 (自动推导) * tparam NeighborFunc 邻域函数类型 (可选) * tparam CoolingPolicy 降温策略 (可选) * tparam ConstraintPolicy 约束策略 (可选) * * param initial_state 初始状态值 * param energy_func 能量函数句柄 * param params 算法参数配置 * param neighbor 邻域生成器实例 * param cooling 降温器实例 * param constraint 约束器实例 * return std::pairState, double {最优状态, 最优能量值} */ template typename State, typename EnergyFunc, typename NeighborFunc DefaultNeighborState, typename CoolingPolicy ExponentialCooling, typename ConstraintPolicy std::nullptr_t auto solve( const State initial_state, EnergyFunc energy_func, Params params Params{}, NeighborFunc neighbor NeighborFunc{}, CoolingPolicy cooling CoolingPolicy{}, ConstraintPolicy constraint ConstraintPolicy{} ) { using AcceptancePolicy MetropolisAcceptance; detail::SolverState, EnergyFunc, NeighborFunc, CoolingPolicy, AcceptancePolicy, ConstraintPolicy solver(params, energy_func, neighbor, cooling, AcceptancePolicy{}, constraint); return solver.solve(initial_state); } } // namespace sa #endif // SA_SA_HPPpolicies.hpp/* by 01130.hk - online tools website : 01130.hk/zh/guid.html */ #ifndef SA_POLICIES_HPP #define SA_POLICIES_HPP #include params.hpp #include detail/traits.hpp #include cmath #include random #include algorithm #include stdexcept #include vector namespace sa { // 默认降温策略 struct ExponentialCooling { inline double operator()(double T, const Params p) const noexcept { return T * p.alpha; } }; // 默认接受策略 (Metropolis 准则) struct MetropolisAcceptance { templatetypename RNG bool operator()(double delta_E, double T, RNG rng, std::uniform_real_distributiondouble dist) const { if (delta_E 0.0) return true; return std::exp(-delta_E / T) dist(rng); } }; // 默认连续邻域生成策略 templatetypename State struct DefaultNeighbor { double sigma 1.0; State operator()(const State current, double T, std::mt19937 rng) const { if constexpr (std::is_arithmetic_vState) { std::normal_distributiondouble dist(0.0, sigma * T); return static_castState(current dist(rng)); } else if constexpr (detail::is_std_vector_vState) { using ValueType typename State::value_type; static_assert(std::is_arithmetic_vValueType, vector value type must be arithmetic); std::normal_distributiondouble dist(0.0, sigma * T); State candidate current; for (auto v : candidate) v static_castValueType(v dist(rng)); return candidate; } else { static_assert(sizeof(State) 0, No default neighbor for this State type); return current; } } }; // 离散翻转邻域策略 (针对 vectorbool 或 vectorint) templatetypename State struct DiscreteFlipNeighbor { State operator()(const State current, double T, std::mt19937 rng) const { static_assert(detail::is_std_vector_vState, DiscreteFlipNeighbor requires std::vector); using ValueType typename State::value_type; static_assert( std::is_same_vValueType, int || std::is_same_vValueType, bool, DiscreteFlipNeighbor requires vectorint or vectorbool ); State candidate current; std::uniform_int_distributionstd::size_t dist(0, candidate.size() - 1); std::size_t idx dist(rng); if constexpr (std::is_same_vValueType, bool) candidate[idx] !candidate[idx]; else candidate[idx] 1 - candidate[idx]; return candidate; } }; // 边界约束策略 (Box Constraint) templatetypename State class BoxConstraintPolicy { public: using ValueType std::conditional_t std::is_arithmetic_vState, State, typename State::value_type; BoxConstraintPolicy(ValueType lower, ValueType upper) : lower_(lower), upper_(upper) {} void apply(State state) const noexcept { if constexpr (std::is_arithmetic_vState) { state std::clamp(state, lower_, upper_); } else { for (auto v : state) v std::clamp(v, lower_, upper_); } } private: ValueType lower_; ValueType upper_; }; } // namespace sa #endif // SA_POLICIES_HPPparams.hpp// // Created by 31007 on 2026/2/12. // #ifndef MATH_TYPES_HPP #define MATH_TYPES_HPP #include cstddef #include cstdint namespace sa { struct Params { double initial_temp 100.0; // 初始温度 double final_temp 1e-6; // 终止温度 double alpha 0.98; // 降温系数 std::size_t iter_per_temp 100; // 每个温度下的迭代次数 std::size_t max_total_iters 1000000; // 最大总迭代次数 (防止死循环) std::uint32_t seed 0; // 随机种子 (0表示随机) }; } // namespace sa #endif //MATH_TYPES_HPPsolver.hpp#ifndef SA_DETAIL_SOLVER_HPP #define SA_DETAIL_SOLVER_HPP #include ../params.hpp #include random #include utility #include stdexcept namespace sa::detail { template typename State, typename EnergyFunc, typename NeighborFunc, typename CoolingPolicy, typename AcceptancePolicy, typename ConstraintPolicy class Solver { public: Solver(Params params, EnergyFunc energy, NeighborFunc neighbor, CoolingPolicy cooling, AcceptancePolicy acceptance, ConstraintPolicy constraint) : params_(params), energy_(energy), neighbor_(neighbor), cooling_(cooling), acceptance_(acceptance), constraint_(constraint), dist_(0.0, 1.0) { validate_params(); if (params_.seed 0) { std::random_device rd; rng_ std::mt19937(rd()); } else { rng_ std::mt19937(params_.seed); } } std::pairState, double solve(const State initial_state) { State current initial_state; double current_energy energy_(current); State best current; double best_energy current_energy; double T params_.initial_temp; std::size_t total_iters 0; while (T params_.final_temp total_iters params_.max_total_iters) { for (std::size_t i 0; i params_.iter_per_temp total_iters params_.max_total_iters; i, total_iters) { State candidate neighbor_(current, T, rng_); // 编译期判断是否存在约束策略 if constexpr (!std::is_same_vConstraintPolicy, std::nullptr_t) { constraint_.apply(candidate); } double candidate_energy energy_(candidate); double delta candidate_energy - current_energy; if (acceptance_(delta, T, rng_, dist_)) { current std::move(candidate); current_energy candidate_energy; if (current_energy best_energy) { best current; best_energy current_energy; } } } T cooling_(T, params_); } return {std::move(best), best_energy}; } private: void validate_params() { if (params_.initial_temp 0.0) throw std::invalid_argument(initial_temp must be 0); if (params_.final_temp 0.0) throw std::invalid_argument(final_temp must be 0); if (params_.alpha 0.0 || params_.alpha 1.0) throw std::invalid_argument(alpha must be in (0,1)); if (params_.iter_per_temp 0) throw std::invalid_argument(iter_per_temp must be 0); } Params params_; EnergyFunc energy_; NeighborFunc neighbor_; CoolingPolicy cooling_; AcceptancePolicy acceptance_; ConstraintPolicy constraint_; std::mt19937 rng_; std::uniform_real_distributiondouble dist_; }; } // namespace sa::detail #endif // SA_DETAIL_SOLVER_HPPtraits.hpp#ifndef SA_DETAIL_TRAITS_HPP #define SA_DETAIL_TRAITS_HPP #include vector #include type_traits namespace sa::detail { // 类型萃取判断是否为 std::vector templatetypename T struct is_std_vector : std::false_type {}; templatetypename T, typename Alloc struct is_std_vectorstd::vectorT, Alloc : std::true_type {}; templatetypename T inline constexpr bool is_std_vector_v is_std_vectorT::value; } // namespace sa::detail #endif // SA_DETAIL_TRAITS_HPP

相关新闻

在机器学习建模过程中,参数调优是个绕不开的坎。今天咱们用Matlab的神经网络工具箱实战一把K折交叉验证寻参,手把手搞定隐藏层节点数的选择

在机器学习建模过程中,参数调优是个绕不开的坎。今天咱们用Matlab的神经网络工具箱实战一把K折交叉验证寻参,手把手搞定隐藏层节点数的选择

Matlab实现BP神经网络K折交叉验证,Kfold寻参案例先准备点实验数据——直接上Matlab自带的癌症诊断数据集: load breastcancer inputs breastInputs; targets ind2vec(breastTargets); % 转成one-hot编码 注意这里把标签转成向量形式,这是…

2026/7/6 4:25:35 阅读更多 →
数据仓库入门指南:从零开始构建大数据存储系统

数据仓库入门指南:从零开始构建大数据存储系统

数据仓库入门指南:从零开始构建大数据存储系统 关键词:数据仓库、事实表、维度表、ETL、星型模型、OLAP、大数据存储 摘要:本文是为数据新手量身打造的「数据仓库入门手册」,通过超市销售分析的生活化案例,用「整理房间」「做菜」等通俗类比,从0到1拆解数据仓库的核心概念…

2026/5/17 5:47:08 阅读更多 →
手把手教你使用vscode开发stm32!

手把手教你使用vscode开发stm32!

开发工具配置篇:迎接新时代--使用vscode开发stm32已经2026年了,你是否还在使用古老的keil5的调试呢?是否还在为keil5复制粘贴代码到聊天式ai再粘贴回来而烦恼呢?快快加入vscode开发stm32的大部队接受光荣的进化吧!目录…

2026/6/26 17:33:07 阅读更多 →

最新新闻

SwiftUI与AppKit架构融合:eul如何重构macOS状态监控应用开发范式

SwiftUI与AppKit架构融合:eul如何重构macOS状态监控应用开发范式

SwiftUI与AppKit架构融合:eul如何重构macOS状态监控应用开发范式 【免费下载链接】eul 🖥️ macOS status monitoring app written in SwiftUI. 项目地址: https://gitcode.com/gh_mirrors/eu/eul 在macOS应用开发领域,传统AppKit与现…

2026/7/6 16:31:44 阅读更多 →
告别背景音乐干扰:LTX-2.3 Foley LoRA让视频音效更真实的终极技巧

告别背景音乐干扰:LTX-2.3 Foley LoRA让视频音效更真实的终极技巧

告别背景音乐干扰:LTX-2.3 Foley LoRA让视频音效更真实的终极技巧 【免费下载链接】LTX-2.3-Foley-LoRA 项目地址: https://ai.gitcode.com/hf_mirrors/FuzzPuppy/LTX-2.3-Foley-LoRA 你是否曾为视频自动生成的背景音乐感到困扰?想要真实的音效却…

2026/7/6 16:29:42 阅读更多 →
summon源码解析:深入了解Go语言实现的密钥管理核心逻辑

summon源码解析:深入了解Go语言实现的密钥管理核心逻辑

summon源码解析:深入了解Go语言实现的密钥管理核心逻辑 【免费下载链接】summon CLI that provides on-demand secrets access for common DevOps tools 项目地址: https://gitcode.com/gh_mirrors/su/summon 你是否曾经为管理敏感配置信息而烦恼&#xff1f…

2026/7/6 16:29:42 阅读更多 →
如何永久免费使用IDM?终极开源激活脚本完全指南

如何永久免费使用IDM?终极开源激活脚本完全指南

如何永久免费使用IDM?终极开源激活脚本完全指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager(IDM&am…

2026/7/6 16:29:42 阅读更多 →
从关门到赛车:LTX-2.3 Foley LoRA经典音效案例全解析

从关门到赛车:LTX-2.3 Foley LoRA经典音效案例全解析

从关门到赛车:LTX-2.3 Foley LoRA经典音效案例全解析 【免费下载链接】LTX-2.3-Foley-LoRA 项目地址: https://ai.gitcode.com/hf_mirrors/FuzzPuppy/LTX-2.3-Foley-LoRA LTX-2.3 Foley LoRA是一款基于LTX-2.3模型的视频转音频LoRA插件,能够为视…

2026/7/6 16:27:39 阅读更多 →
终极优化:MiMo-V2.5-DFlash量化配置与性能调优技巧

终极优化:MiMo-V2.5-DFlash量化配置与性能调优技巧

终极优化:MiMo-V2.5-DFlash量化配置与性能调优技巧 【免费下载链接】MiMo-V2.5-DFlash 项目地址: https://ai.gitcode.com/XiaomiMiMo/MiMo-V2.5-DFlash MiMo-V2.5-DFlash作为小米推出的高性能AI模型,通过科学的量化配置与性能调优,能…

2026/7/6 16:25:38 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻