关于模拟退火matlab的内置函数

关于模拟退火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);

希望可以帮助到大家哦,注释应该写得很详细了

上一篇:秋招笔试(其四)CVTE笔试:求20的阶乘末尾位数为0的个数


下一篇:leetcode刷题笔记-739. 每日温度(java实现)