数学建模学习(9):模拟退火算法

模拟退火算法(Simulated Annealing, SA)的思想借 鉴于固体的退火原理,当固体的温度很高的时候,内能比

较大,固体的内部粒子处于快速无序运动,当温度慢慢降 低的过程中,固体的内能减小,粒子的慢慢趋于有序,最

终,当固体处于常温时,内能达到最小,此时,粒子最为 稳定。模拟退火算法便是基于这样的原理设计而成。

模拟退火算法过程

(1)随机挑选一个单元k,并给它一个随机的位移,求出系统因此而产生的能

量变化ΔEk。

(2)若ΔEk⩽ 0,该位移可采纳,而变化后的系统状态可作为下次变化的起点;

若ΔEk>0,位移后的状态可采纳的概率为

式中T为温度,然后从(0,1)区间均匀分布的随机数中挑选一个数R,若R<Pk,

则将变化后的状态作为下次的起点;否则,将变化前的状态作为下次的起点。

(3)转第(1)步继续执行,知道达到平衡状态为止。

利用模拟退火算法工具箱求解问题:

matlab 复制代码
%%
clc;clear;
%%普通的目标函数
fun = @dejong5fcn %目标函数
%[x,fval] = simulannealbnd(fun,[0,0])%[0,0]凭经验猜测的初始值,没有的话,随意写就行
options = saoptimset('PlotFcns',{@saplotbestx,@saplotbestf,@saplotx,@saplotf})
x0 = [0,0];
lb = [-64,-64];%下限
ub = [64,64];%下限
[x,fval] = simulannealbnd(fun,x0,lb,ub,options);
%%
求:
% min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2;
% 写成函数形式
% function y = simple_objective(x)
%    y = (4 - 2.1*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-4 + 4*x(2)^2)*x(2)^2;
%%
fun = @simple_objective;%注意需要将其放在最前面
X0 = [0.5 0.5];   % 初始点
lb = [-64 -64];
ub = [64 64];
[x,fval,exitFlag,output] = simulannealbnd(fun,X0,lb,ub);
fprintf('The number of iterations was : %d\n', output.iterations);
fprintf('The number of function evaluations was : %d\n', output.funccount);
fprintf('The best function value found was : %g\n', fval);
%%

%  求:
% min f(x) = (a - b*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-c + c*x2^2)*x2^2;
% 
% 写成函数形式
% function y = parameterized_objective(x,a,b,c)
%    y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-c + c*x(2)^2)*x(2)^2;
%%带有常数的目标函数
a = 4; b = 2.1; c = 4;    % define constant values
fun = @(x) parameterized_objective(x,a,b,c);
X0 = [0.5 0.5];
options = saoptimset('PlotFcns',{@saplotbestx,@saplotbestf,@saplotx,@saplotf})
[x,fval] = simulannealbnd(fun,X0,options)
%自定义目标函数1
function y = parameterized_objective(x,a,b,c)
   y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-c + c*x(2)^2)*x(2)^2;
end
%自定义目标函数2
function y = simple_objective(x)
    y = (4 - 2.1*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-4 + 4*x(2)^2)*x(2)^2;
end

运行效果

相关推荐
数模竞赛Paid answer5 小时前
2024年亚太杯APMCM数学建模大赛A题复杂场景下水下图像增强研究解题全过程文档及程序
数学建模·数据分析·亚太杯
酿情师6 小时前
yihan:一款面向连续网页学习的智能侧边栏插件
学习·学习方法·工具·学习工具
瞎某某Blinder6 小时前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法
love在水一方8 小时前
VLN 入门学习计划 —— 基于 InternNav
学习
red_redemption10 小时前
自由学习记录(175)
学习
nashane11 小时前
HarmonyOS 6学习:画中画(PiP)状态同步与场景化实战指南
学习·pip·harmonyos·harmonyos 5
_李小白11 小时前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
勤劳的进取家11 小时前
数据链路层基础
网络·学习·算法
d111111111d12 小时前
直流电机位置式 PID 控制 和 舵机的区别
笔记·stm32·单片机·嵌入式硬件·学习
y = xⁿ13 小时前
Redis八股学习日记:布隆过滤器
数据库·redis·学习