群体智能优化算法-模拟退火优化算法(Simulated Annealing, SA,含Matlab源代码)

摘要

模拟退火(SA)算法是一种基于物理退火过程的全局优化算法,其核心思想来源于热力学中的退火过程:将材料加热到高温后再缓慢冷却,使其分子结构趋于最低能量状态,从而获得稳定结构。SA 算法利用 Metropolis 准则来决定接受新的解,以一定概率接受劣解,从而避免陷入局部最优。SA 具有收敛速度快、计算复杂度低、适用于连续优化问题等特点,被广泛应用于组合优化、函数优化、神经网络训练等领域。

算法介绍

1. 主要思想

SA 算法模拟物理退火过程,将目标函数 视为能量状态,以一定概率接受更差的解,防止陷入局部最优。

算法的核心机制如下:

  1. 温度控制:随着迭代次数增加,温度逐步降低,降低搜索的随机性。
  2. 邻域搜索:每次迭代基于当前解生成新解(小范围扰动)。
  3. Metropolis 准则
    • 若新解优于当前解,则无条件接受。
    • 若新解劣于当前解,则以概率 P=e−ΔfTP = e^{-\frac{\Delta f}{T}}P=e−TΔf 决定是否接受,TTT 为当前温度,Δf\Delta fΔf 为目标函数值的变化量。

该概率随温度降低而降低,意味着算法在早期具有较强的探索能力,而在后期趋向收敛。


详细代码

以下是 模拟退火优化算法(SA) 的 MATLAB 实现:

Matlab 复制代码
%% 模拟退火优化算法(Simulated Annealing, SA)
% 输入:
%   Mmax - 最大退火次数(降温步数)
%   l - 搜索空间下界
%   u - 搜索空间上界
%   dim - 变量维度
%   fobj - 目标优化函数
% 输出:
%   Best_score - 最优适应度值(最小化目标)
%   Best_pos - 最优解
%   curve - 收敛曲线(记录最优值的变化)

function [Best_score, Best_pos, curve] = SA(Mmax, l, u, dim, fobj)

    % 设置容忍度(用于 Metropolis 准则)
    TolFun = 1e-10;  

    % 生成初始解,在搜索空间内随机取值
    x0 = (u - l) .* rand(1, dim) + l;

    % 计算初始解的适应度值
    f = fobj;
    x = x0;
    fx = feval(f, x); % 计算当前解的适应度
    f0 = fx;          % 记录当前最优值
    count = 1;        % 记录收敛曲线索引

    % 退火过程
    for m = 1:Mmax
        T = m / Mmax; % 计算当前温度(温度随迭代次数降低)
        mu = 10^(T * 1000); % 退火步长参数

        % 每个温度下执行 100 次局部搜索
        for k = 0:100
            % 生成扰动(新解相对当前解的偏移量)
            dx = mu_inv(2 * rand(1, dim) - 1, mu) .* (u - l);
            x1 = x + dx; % 生成新解
            
            % 处理边界(防止超出搜索范围)
            x1 = max(min(x1, u), l);

            % 计算新解的适应度值
            fx1 = feval(f, x1);
            df = fx1 - fx; % 计算适应度变化量

            % 按 Metropolis 准则决定是否接受新解
            if (df < 0 || rand < exp(-T * df / (abs(fx) + eps) / TolFun))
                x = x1; % 接受新解
                fx = fx1;
            end

            % 更新全局最优解
            if fx1 < f0
                x0 = x1;
                f0 = fx1;
            end
        end
        
        % 记录当前最优值到收敛曲线
        curve(count) = f0;
        count = count + 1;
    end

    % 输出最终最优解
    Best_pos = x0;
    Best_score = f0;
end

%% 计算模拟退火产生的新位置偏移量
function x = mu_inv(y, mu)
    % 计算扰动值
    x = (((1 + mu) .^ abs(y) - 1) / mu) .* sign(y);
end

代码解读

  1. 初始化

    • 设定搜索空间 lu,确保解在合理范围内。
    • 生成初始解 x0,并计算其适应度 fx
    • 设定最大迭代次数 Mmax温度退火步长 mu
  2. 模拟退火循环

    • 温度控制 :温度随迭代次数下降,T = m / Mmax
    • 局部搜索 :在当前解 x 附近随机采样 100 个新解 x1
    • Metropolis 准则
      • 若新解 x1 更优,则直接接受。
      • x1 更差,则以概率 P = exp(-T * Δf / |f0|) 决定是否接受,避免局部最优。
    • 全局最优更新 :如果 x1 比当前 f0 更优,则更新全局最优。
  3. 终止条件

    • 退火次数达到 Mmax
    • 记录收敛曲线 curve,用于绘制优化过程。

总结

  • SA 是基于概率的全局优化算法,能有效避免局部最优。
  • 利用 Metropolis 准则,可接受劣解,增强全局搜索能力。
  • 温度控制机制保证算法在早期探索,后期收敛。
  • 适用于函数优化、旅行商问题(TSP)、神经网络权重优化等。

优点:

  • 搜索范围大,易于跳出局部最优
  • 适用于复杂问题
  • 实现简单,参数易调整

缺点:

  • 收敛速度较慢
  • 过早降温可能影响搜索效果
相关推荐
chao_7893 分钟前
链表题解——反转链表【LeetCode】
开发语言·python·算法
pen-ai3 分钟前
【深度学习】12. VIT与GPT 模型与语言生成:从 GPT-1 到 GPT4
人工智能·gpt·深度学习
新智元11 分钟前
Fellou 2.0 震撼发布:你的专属贾维斯,开启 AI 批量化生产新时代
人工智能·openai
大写-凌祁22 分钟前
GLIDE论文阅读笔记与DDPM(Diffusion model)的原理推导
论文阅读·人工智能·笔记·python·深度学习·机器学习·计算机视觉
TAICHIFEI32 分钟前
KITTI数据集(计算机视觉和自动驾驶领域)
图像处理·人工智能·深度学习·计算机视觉
Code_流苏33 分钟前
Python趣学篇:从零打造智能AI井字棋游戏(Python + Tkinter + Minimax算法)
python·算法·游戏·tkinter·智能井字棋·minimax算法
理智的灰太狼43 分钟前
题目 3230: 蓝桥杯2024年第十五届省赛真题-星际旅行
算法·职场和发展·蓝桥杯
wcjwdq43 分钟前
“顶点着色器”和“片元着色器”是先处理完所有顶点再统一进入片元阶段,还是一个顶点处理完就去跑它的片元?
算法·着色器
小Mie不吃饭1 小时前
SpringBoot接入Kimi实践记录轻松上手
人工智能·spring
技术帮扶户1 小时前
Leetcode-7 寻找用户推荐人
算法·leetcode·职场和发展