关于模拟退火matlab的内置函数
simulannealbnd
有兴趣折磨英文的小伙伴可以直接看官方文档。
>> help simulannealbnd
simulannealbnd - Find minimum of function using simulated annealing algorithm
This MATLAB function finds a local minimum, x, to the function handle fun that
computes the values of the objective function.
x = simulannealbnd(fun,x0)
x = simulannealbnd(fun,x0,lb,ub)
x = simulannealbnd(fun,x0,lb,ub,options)
x = simulannealbnd(problem)
[x,fval] = simulannealbnd(___)
[x,fval,exitflag,output] = simulannealbnd(___)
另请参阅 ga, optimoptions, patternsearch
simulannealbnd 的文档
模拟退火
关于什么是模拟退火网上已经有很多大佬发文章了,这里不赘述了。
内置函数
matlab提供了模拟退火解方程的内置函数,但是我看网上关于函数的中文说明或者例子很少,这里直接贴我写的代码,希望可以帮助到大家,其中函数的options
实在没看懂大部分意思想表示什么,欢迎相互指点。
一元函数的计算
% 渡边自己手打的
% 模拟退火解一元函数
clc,clear;close all;
% 设置区间
x = -10:1:10;
f = @(x)(...
x.^4 ... % 定义函数,求最小值
);
fun = x.^2 + 2*x; % 再定义一次
% f = @(x)f_xy(x(1),x(2));
x0 = rand(1,1); % 退火开始点
lb = [];
ub = []; % 退火实施范围,可以不设置
% 实时观测
options = saoptimset('MaxIter',20,... % 迭代次数
'StallIterLim',300,... % 最高温度
'TolFun',1e-100,... % 最低温度
'AnnealingFcn',@annealingfast,'InitialTemperature',...
100,'TemperatureFcn',@temperatureexp,'ReannealInterval',500,'PlotFcns',...
{@saplotbestx, @saplotbestf, @saplotx, @saplotf,@saplottemperature});
[jie,fval] = simulannealbnd(f,x0,lb,ub,options);
fprintf('最优解为 x = %.10f, y = %.10f\n', jie, fval );
figure;
plot(x,fun);
hold on;
plot(jie,fval,'ko', 'linewidth', 2);
二元函数
% 渡边自己手打的
% 模拟退火解二元函数
clc,clear;close all;
% 设置区间
xx = -10:1:10;
yy = -10:1:10;
[x, y]=meshgrid(xx, yy);
f_xy = @(x,y)(...
x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20 ... % 定义函数,求最小值
);
fun = x.^2 + y.^2 - 10*cos(2*pi*x) - 10*cos(2*pi*y) + 20; % 再定义一次
f = @(x)f_xy(x(1),x(2));
x0 = rand(1,2); % 退火开始点
lb = [];
ub = []; % 退火实施范围,可以不设置
% 实时观测
options = saoptimset('MaxIter',20,... % 迭代次数
'StallIterLim',300,... % 最高温度
'TolFun',1e-100,... % 最低温度
'AnnealingFcn',@annealingfast,'InitialTemperature',...
100,'TemperatureFcn',@temperatureexp,'ReannealInterval',500,'PlotFcns',...
{@saplotbestx, @saplotbestf, @saplotx, @saplotf,@saplottemperature});
[jie,fval] = simulannealbnd(f,x0,lb,ub,options);
fprintf('最优解为 x = %.10f, y = %.10f\n', jie(1),jie(2) );
fprintf('最优值为 z = %.10f\n',fval);
figure;
surf(x,y,fun);
hold on;
plot3(jie(1),jie(2),fval,'ko', 'linewidth', 3);
希望可以帮助到大家哦,注释应该写得很详细了