当前位置: 首页 > news >正文

模拟退火算法对Rastrigin函数的优化

前言

提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。

内容由AI辅助生成,仅经笔者审核整理,请甄别食用。

文章目录

  • 前言
  • matlab代码
  • 代码分析
      • **一、核心数学原理与算法框架**
      • **二、代码核心模块解析**
        • **1. 参数设置与目标函数**
        • **2. 初始化与可视化基础**
        • **3. 模拟退火主循环(核心实现)**
        • **4. 可视化与图例修正**
      • **三、结果输出与算法效果**
      • **四、算法特点与参数调优**


matlab代码

clc; clear; close all;%% 参数设置
T_init = 100;           % 初始温度
T_min = 1e-3;           % 最小温度
alpha = 0.95;           % 温度衰减系数
max_iter = 50;         % 每温度下的迭代次数
bounds = [-5.12, 5.12]; % 搜索空间边界% 目标函数(Rastrigin)
rastrigin = @(x, y) 20 + x.^2 - 10*cos(2*pi*x) + y.^2 - 10*cos(2*pi*y);% 理论最优解(已知)
x_theory = 0;
y_theory = 0;
f_theory = rastrigin(x_theory, y_theory);%% 初始化
x = (bounds(2)-bounds(1)) * rand() + bounds(1);
y = (bounds(2)-bounds(1)) * rand() + bounds(1);
f_current = rastrigin(x, y);x_best = x;
y_best = y;
f_best = f_current;%% 绘制目标函数曲面
[X, Y] = meshgrid(bounds(1):0.2:bounds(2), bounds(1):0.2:bounds(2));
Z = rastrigin(X, Y);figure('Color','w');
h_surf = surf(X, Y, Z, 'EdgeColor', 'none', 'FaceAlpha', 0.5); % 曲面
colormap parula
hold on
xlabel('x'); ylabel('y'); zlabel('f(x, y)')
view(45, 45)
grid on% 绘制理论最优解
h_theory = plot3(x_theory, y_theory, f_theory, 'b*', 'MarkerSize', 10, 'LineWidth', 2); % 蓝星% 初始化轨迹句柄(空句柄占位)
h_traj = plot3(NaN, NaN, NaN, 'ro', 'MarkerSize', 3, 'MarkerFaceColor', 'r');% 添加标题占位符
title_str = title('');%% 模拟退火主过程
T = T_init;
iter_total = 0;while T > T_minfor i = 1:max_iteriter_total = iter_total + 1;% 产生新解x_new = x + 0.5 * (2*rand()-1);y_new = y + 0.5 * (2*rand()-1);% 边界限制x_new = max(min(x_new, bounds(2)), bounds(1));y_new = max(min(y_new, bounds(2)), bounds(1));f_new = rastrigin(x_new, y_new);delta = f_new - f_current;% 接受准则if delta < 0 || rand() < exp(-delta/T)x = x_new;y = y_new;f_current = f_new;% 更新最优解if f_current < f_bestx_best = x;y_best = y;f_best = f_current;end% 动态可视化更新轨迹plot3(x, y, f_current, 'ro', 'MarkerSize', 3, 'MarkerFaceColor', 'r');drawnow limitrateend% 更新标题显示迭代次数title_str.String = sprintf('Simulated Annealing: Iteration %d, T = %.4f', iter_total, T);end% 温度衰减T = T * alpha;
end%% 显示最终找到的最优解
h_best = plot3(x_best, y_best, f_best, 'gp', 'MarkerSize', 10, 'MarkerFaceColor', 'g');% 最终设置图例(使用句柄数组)
legend([h_surf, h_theory, h_traj, h_best], ...{'Rastrigin Surface', 'Theoretical Optimum', 'Search Trajectory', 'Best Found Solution'}, ...'Location', 'northeast');
%% 打印结果
fprintf('理论最优解: x = %.4f, y = %.4f, f(x,y) = %.4f\n', x_theory, y_theory, f_theory);
fprintf('实际最优解: x = %.4f, y = %.4f, f(x,y) = %.4f\n', x_best, y_best, f_best);

运行结果
在这里插入图片描述
在这里插入图片描述

这段代码实现了模拟退火算法对Rastrigin函数的优化,并通过3D可视化展示了优化过程。

代码分析

一、核心数学原理与算法框架

模拟退火算法的核心思想源于固体退火过程,通过温度控制概率接受准则实现全局优化,关键数学模型包括:

  1. Metropolis接受准则
    对于新解与当前解的能量差ΔE=fnew−fcurrent\Delta E = f_{\text{new}} - f_{\text{current}}ΔE=fnewfcurrent,接受新解的概率为:
    P={1if ΔE<0(新解更优)exp⁡(−ΔET)if ΔE≥0(以概率接受劣解)P = \begin{cases} 1 & \text{if } \Delta E < 0 \, (\text{新解更优}) \\ \exp\left(-\frac{\Delta E}{T}\right) & \text{if } \Delta E \geq 0 \, (\text{以概率接受劣解}) \end{cases} P={1exp(TΔE)if ΔE<0(新解更优)if ΔE0(以概率接受劣解)
    其中TTT为当前温度,温度越高,接受劣解的概率越大(利于全局搜索);温度越低,概率越小(利于局部收敛)。

  2. 温度衰减策略
    采用几何降温:Tk+1=α⋅TkT_{k+1} = \alpha \cdot T_kTk+1=αTkα∈(0,1)\alpha \in (0,1)α(0,1)为衰减系数),确保温度从初始值逐渐降至终止温度。

二、代码核心模块解析

1. 参数设置与目标函数
% 参数设置
T_init = 100;           % 初始温度(控制初始搜索范围)
T_min = 1e-3;           % 终止温度(算法停止条件)
alpha = 0.95;           % 降温系数(控制收敛速度)
max_iter = 50;          % 每温度下的迭代次数(局部搜索深度)
bounds = [-5.12, 5.12]; % 搜索空间边界% 目标函数:Rastrigin函数(多峰复杂函数)
rastrigin = @(x, y) 20 + x.^2 - 10*cos(2*pi*x) + y.^2 - 10*cos(2*pi*y);
  • Rastrigin函数的数学表达式为:
    f(x,y)=20+x2+y2−10[cos⁡(2πx)+cos⁡(2πy)]f(x,y) = 20 + x^2 + y^2 - 10\left[\cos(2\pi x) + \cos(2\pi y)\right]f(x,y)=20+x2+y210[cos(2πx)+cos(2πy)]
    该函数在(0,0)(0,0)(0,0)处取得全局最小值0,周围分布大量局部极小值,适合测试算法的全局优化能力。
2. 初始化与可视化基础
% 初始化解(在搜索空间内随机生成)
x = (bounds(2)-bounds(1)) * rand() + bounds(1);  % x∈[-5.12,5.12]
y = (bounds(2)-bounds(1)) * rand() + bounds(1);  % y∈[-5.12,5.12]
f_current = rastrigin(x, y);  % 初始解的函数值% 初始化最优解(初始时最优解为初始解)
x_best = x; y_best = y; f_best = f_current;% 绘制目标函数曲面(可视化基础)
[X, Y] = meshgrid(bounds(1):0.2:bounds(2));  % 生成网格点
Z = rastrigin(X, Y);  % 计算网格点的函数值
h_surf = surf(X, Y, Z, 'EdgeColor', 'none', 'FaceAlpha', 0.5);  % 曲面句柄(用于图例)
  • 初始解通过随机采样生成,确保算法从搜索空间的任意位置开始;
  • 曲面可视化使用surf函数,通过h_surf保存句柄,用于后续图例关联。
3. 模拟退火主循环(核心实现)
T = T_init;  % 初始温度
iter_total = 0;  % 总迭代次数while T > T_min  % 温度未降至终止温度时循环for i = 1:max_iter  % 每个温度下迭代max_iter次iter_total = iter_total + 1;% 1. 生成新解(当前解附近随机扰动)x_new = x + 0.5*(2*rand()-1);  % 扰动范围:[-0.5,0.5]y_new = y + 0.5*(2*rand()-1);% 边界控制(确保新解在搜索空间内)x_new = max(min(x_new, bounds(2)), bounds(1));y_new = max(min(y_new, bounds(2)), bounds(1));% 2. 计算能量差ΔEf_new = rastrigin(x_new, y_new);  % 新解的函数值delta = f_new - f_current;        % ΔE = 新解能量 - 当前解能量% 3. 应用Metropolis准则接受新解if delta < 0 || rand() < exp(-delta/T)  % 新解更优 或 以概率接受劣解x = x_new;  % 更新当前解y = y_new;f_current = f_new;% 更新全局最优解if f_current < f_bestx_best = x;y_best = y;f_best = f_current;end% 可视化搜索轨迹(红点标记)plot3(x, y, f_current, 'ro', 'MarkerSize', 3, 'MarkerFaceColor', 'r');drawnow limitrate  % 实时刷新图形end% 更新标题(显示当前温度和迭代次数)title_str.String = sprintf('Simulated Annealing: Iteration %d, T = %.4f', iter_total, T);end% 温度衰减(几何降温)T = T * alpha;  % T_{k+1} = α·T_k
end

关键步骤解析

  • 新解生成:通过在当前解附近随机扰动生成新解(局部搜索),扰动范围控制在合理区间内;
  • 能量差计算δ=fnew−fcurrent\delta = f_{\text{new}} - f_{\text{current}}δ=fnewfcurrent,反映新解与当前解的优劣;
  • Metropolis准则:代码中delta < 0 || rand() < exp(-delta/T)直接实现了数学公式的逻辑——优质解必接受,劣质解按温度相关概率接受;
  • 温度衰减:通过T = T * alpha实现几何降温,确保算法从“探索”逐渐转向“收敛”。
4. 可视化与图例修正
% 绘制最终最优解(绿色五角星)
h_best = plot3(x_best, y_best, f_best, 'gp', 'MarkerSize', 10, 'MarkerFaceColor', 'g');% 图例设置(通过句柄关联图形元素与标签)
legend([h_surf, h_theory, h_traj, h_best], ...{'Rastrigin Surface', 'Theoretical Optimum', 'Search Trajectory', 'Best Found Solution'}, ...'Location', 'northeast');

图例修正逻辑

  • 代码通过保存图形句柄(h_surf曲面、h_theory理论最优解、h_traj轨迹、h_best最终最优解),在legend函数中按顺序关联,确保:
    • Rastrigin Surface对应彩色曲面;
    • Theoretical Optimum对应蓝色星号(理论最优解(0,0));
    • Search Trajectory对应红色点(搜索轨迹);
    • Best Found Solution对应绿色五角星(最终找到的最优解)。

三、结果输出与算法效果

代码最后输出理论最优解与实际找到的最优解:

fprintf('理论最优解: x = %.4f, y = %.4f, f(x,y) = %.4f\n', x_theory, y_theory, f_theory);
fprintf('实际最优解: x = %.4f, y = %.4f, f(x,y) = %.4f\n', x_best, y_best, f_best);
  • 理论最优解:Rastrigin函数的全局最小值在(0,0)(0,0)(0,0)处,函数值为0;
  • 实际最优解:模拟退火算法找到的近似最优解,通常接近(0,0)(0,0)(0,0),函数值接近0(受参数和随机性影响)。

四、算法特点与参数调优

  1. 全局优化能力:通过接受劣解的概率机制,算法能跳出局部极小值(Rastrigin函数的多峰特性对算法是重要考验);
  2. 参数影响
    • 初始温度TinitT_{\text{init}}Tinit:过大导致搜索效率低,过小易陷入局部最优;
    • 降温系数α\alphaα:接近1时降温慢(搜索更充分),但耗时更长;
    • 每温度迭代次数KaTeX parse error: Expected 'EOF', got '_' at position 15: max_{\text{max_̲iter}:次数越多,局部搜索越充分。
http://www.lryc.cn/news/598038.html

相关文章:

  • 【第五节】列表渲染
  • Flink-1.19.0源码详解8-ExecutionGraph生成-前篇
  • 【图论】倍增与lca
  • 网络编程——聊天程序实现
  • 嵌入式通信知识串讲:从同步 / 异步传输到 UART 协议 STM32F103 硬件解析
  • 换热站可视化:藏在数字里的城市温暖密码
  • 【jupyter 使用多进程方案】
  • 数据库底层索引讲解-排序和数据结构
  • 根据字符串数组的顺序重新排序 List顺序
  • 使用全局变量访问 Qt UI 组件的方法文档
  • WebRTC指纹——深度分析(中篇)
  • 5种最佳方法将iPhone语音备忘录传输到Mac
  • pycharm配conda环境
  • 阿里视频直播解决方案VS(MediaMTX + WebRTC) 流媒体解决方案
  • 基于python django的农业可视化系统,以奶牛牧场为例
  • WebRTC指纹——技术背景(上篇)
  • Apache POI 实战应用:企业级文档处理解决方案
  • 解决VSCode中“#include错误,请更新includePath“问题
  • es 和 lucene 的区别
  • 【Practical Business English Oral Scene Interpretation】入职面试No.5~7
  • 基于三维点云的智能焊缝识别系统设计与实现
  • 噪声环境下的数据驱动预测控制:提升抗测量噪声干扰能力
  • C++的虚基类?
  • Visual Studio 2010-.Net Framework 4.0项目-NPOI安装
  • 【智能协同云图库】智能协同云图库第六弹:空间模块开发
  • 2025年“创新杯”(原钉钉杯) B题 详细建模思路
  • 钉钉DingTalk完整版下载离线安装包2025
  • Webpack/Vite 终极指南:前端开发的“涡轮增压引擎“
  • 2025创新杯(钉钉杯)数学建模 AB赛题已出
  • 设置后轻松将 iPhone 转移到 iPhone