在工程优化、机器学习和运筹学等领域,我们经常需要寻找一个复杂函数的最优解。然而,许多问题存在大量局部最优解,传统的梯度下降等方法很容易陷入其中。这时,C++模拟退火算法就成为一种非常有效的全局优化工具。
模拟退火算法(Simulated Annealing, SA)是一种受物理退火过程启发的智能优化算法。在冶金中,退火是指将金属加热到高温后缓慢冷却,使其内部结构趋于能量最低、最稳定的状态。模拟退火算法正是模仿这一过程,在解空间中以一定概率接受“更差”的解,从而跳出局部最优,最终逼近全局最优。

C++具有高性能、内存控制精细、支持面向对象等优点,非常适合实现对效率要求较高的优化算法C++程序。同时,C++标准库提供了丰富的数学函数和随机数生成器,便于我们快速构建算法原型。
e^(-ΔE/T) 接受,其中 ΔE 是能量差,T 是当前温度。下面我们以一个经典问题——一维函数最小化为例,演示如何用C++实现模拟退火算法。目标函数为:
f(x) = x² + 10*sin(5*x) + 7*cos(4*x)
该函数具有多个局部极小值,非常适合测试优化算法。
#include <iostream>#include <cmath>#include <random>#include <chrono>// 目标函数:我们要最小化的函数double objectiveFunction(double x) { return x * x + 10 * sin(5 * x) + 7 * cos(4 * x);}double simulatedAnnealing() { // 随机数生成器(使用系统时间作为种子) std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count()); std::uniform_real_distribution<double> dist(-10.0, 10.0); // 初始解范围 std::uniform_real_distribution<double> rand01(0.0, 1.0); // 用于生成[0,1)随机数 // 初始化参数 double currentX = dist(rng); // 当前解 double currentEnergy = objectiveFunction(currentX); double bestX = currentX; double bestEnergy = currentEnergy; double T = 100.0; // 初始温度 const double Tmin = 1e-8; // 最低温度 const double coolingRate = 0.98; // 降温系数 while (T > Tmin) { // 生成新解(在当前解附近扰动) double newX = currentX + (rand01(rng) - 0.5) * 2.0; // 边界处理(可选) if (newX < -10.0) newX = -10.0; if (newX > 10.0) newX = 10.0; double newEnergy = objectiveFunction(newX); double deltaE = newEnergy - currentEnergy; // Metropolis 准则 if (deltaE < 0 || exp(-deltaE / T) > rand01(rng)) { currentX = newX; currentEnergy = newEnergy; // 更新全局最优解 if (currentEnergy < bestEnergy) { bestX = currentX; bestEnergy = currentEnergy; } } // 降温 T *= coolingRate; } return bestX;}int main() { double result = simulatedAnnealing(); std::cout << "找到的最优解 x = " << result << std::endl; std::cout << "对应的函数值 f(x) = " << objectiveFunction(result) << std::endl; return 0;}模拟退火算法的效果高度依赖于参数设置:
通过本教程,你已经掌握了如何用C++实现一个完整的C++模拟退火算法。这种智能优化算法不仅适用于函数优化,还可扩展到旅行商问题(TSP)、排课调度、神经网络权重优化等复杂场景。只要理解其核心思想——“以退为进”,就能灵活应用于各类优化算法C++项目中。
建议读者动手运行代码,尝试调整参数,观察结果变化,从而加深对模拟退火算法教程的理解。编程不仅是写代码,更是理解算法背后的哲学。
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125991.html