模擬退火算法(MATLAB實現)

function [xo,fo] = Opt_Simu(f,x0,u,l,kmax,q,TolFun)
% 模擬退火算法求函數 f(x)的最小值點, 且 l <= x <= u
% f爲待求函數,x0爲初值點,l,u分別爲搜索區間的上下限,kmax爲最大迭代次數
% q爲退火因子,TolFun爲函數容許誤差
%%%%算法第一步根據輸入變量數,將某些量設爲缺省值
if nargin < 7
    TolFun = 1e-8;
end
if nargin < 6
    q = 1;
end
if nargin < 5
    kmax = 100;
end
%%%%算法第二步,求解一些基本變量
N = length(x0); %自變量維數
x = x0;
fx = feval(f,x); %函數在初始點x0處的函數值
xo = x;
fo = fx;
%%%%%算法第三步,進行迭代計算,找出近似全局最小點
for k =0:kmax
    Ti = (k/kmax)^q;
    mu = 10^(Ti*100); % 計算mu
    dx = Mu_Inv(2*rand(size(x))-1,mu).*(u - l);%步長dx
    x1 = x + dx; %下一個估計點
    x1 = (x1 < l).*l +(l <= x1).*(x1 <= u).*x1 +(u < x1).*u; %將x1限定在區間[l,u]上
    fx1 = feval(f,x1);
    df = fx1- fx;
    if df < 0||rand < exp(-Ti*df/(abs(fx) + eps)/TolFun) %如果fx1<fx或者概率大於隨機數z
        x = x1;
        fx = fx1;
    end
    if fx < fo
        xo = x;
        fo = fx1;
    end
end
function x = Mu_Inv(y,mu)
x = (((1+mu).^abs(y)- 1)/mu).*sign(y);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章