模拟退火算法对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可视化展示了优化过程。
代码分析
一、核心数学原理与算法框架
模拟退火算法的核心思想源于固体退火过程,通过温度控制和概率接受准则实现全局优化,关键数学模型包括:
-
Metropolis接受准则
对于新解与当前解的能量差ΔE=fnew−fcurrent\Delta E = f_{\text{new}} - f_{\text{current}}ΔE=fnew−fcurrent,接受新解的概率为:
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 ΔE≥0(以概率接受劣解)
其中TTT为当前温度,温度越高,接受劣解的概率越大(利于全局搜索);温度越低,概率越小(利于局部收敛)。 -
温度衰减策略
采用几何降温: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+y2−10[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}}δ=fnew−fcurrent,反映新解与当前解的优劣;
- 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(受参数和随机性影响)。
四、算法特点与参数调优
- 全局优化能力:通过接受劣解的概率机制,算法能跳出局部极小值(Rastrigin函数的多峰特性对算法是重要考验);
- 参数影响:
- 初始温度TinitT_{\text{init}}Tinit:过大导致搜索效率低,过小易陷入局部最优;
- 降温系数α\alphaα:接近1时降温慢(搜索更充分),但耗时更长;
- 每温度迭代次数KaTeX parse error: Expected 'EOF', got '_' at position 15: max_{\text{max_̲iter}:次数越多,局部搜索越充分。