数学建模学习(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

运行效果

相关推荐
学长毕设7 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
小小de风呀11 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习
李某学编程11 小时前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
Song_RsHt11 小时前
Redis 与微服务,什么场景下无可替代
java·redis·后端·学习·微服务
~kiss~14 小时前
PRO-LONG: Programmatic Memory Enables Long-Horizon Reasoning 程序式记忆赋能长程推理
学习
程序猿编码14 小时前
不依赖 vLLM/llama.cpp:一套面向学习的 DeepSeek-R1 CUDA 推理实现
c++·学习·语言模型·llama·vllm·大模型推理
Chensf202115 小时前
杉数求解器COPT安装及在python中使用
数学建模
ms72wx15 小时前
Docker 命令学习笔记:从入门到进阶的实战指南
笔记·学习·docker
外收内放16 小时前
FastAPI猜字谜实战(4):让AI主持人开口
开发语言·python·学习·fastapi
叶子野格16 小时前
《JAVA学习:前置知识》
学习