单目标多变量模拟退火算法

@[TOC](单目标多变量模拟退火算法)
%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%
clear all;              %清除所有变量
close all;              %清图
clc;                    %清屏
D=3;                   %变量维数
lb=[75 255 14];               %下界
ub=[90 300 20];                %上界
%%%%%%%%%%%%%%%%%%%%%冷却表参数%%%%%%%%%%%%%%%%%%%%
L=20;                  %马尔科夫链长度
K=0.998;                %衰减参数
S=0.01;                 %步长因子
T=100;                  %初始温度
YZ=1e-8;                %容差
P=0;                    %Metropolis过程中总接受点
%%%%%%%%%%%%%%%%%%%%%随机选点初值设定%%%%%%%%%%%%%%%%%%%%
for i=1:D
    PreX(i)=rand*(ub(i)-lb(i))+lb(i);
    PreBestX=PreX;
    Prex(i)=rand*(ub(i)-lb(i))+lb(i);
    BestX=Prex;
end
%%%%%%%%%%%%%%%%%每迭代一次退火一次,直到满足迭代条件%%%%%%%%%%%%%%%%
deta=abs(Fitness_Function(BestX)-Fitness_Function(PreBestX));
while (deta>YZ) && (T>0.001)
    T=K*T;
    %%%%%%%%%%%%%%%%%%%%%在当前温度T下迭代次数%%%%%%%%%%%%%%%%%%%%%
    for i=1:L
        %%%%%%%%%%%%%%%%%%%%%在此点附近随机选下一点%%%%%%%%%%%%%%%%%%%%%
        for j=1:D
            NextX(j)=PreX(j)+S*(rand*(ub(j)-lb(j))+lb(j));
        end
        %%%%%%%%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%%%
        for jj=1:D
            if NextX(jj)>ub(j) || NextX(jj)<lb(j)
                NextX(jj)=PreX(jj)+S*(rand*(ub(j)-lb(j))+lb(j));
            end
        end
    %%%%%%%%%%%%%%%%%%%%%是否全局最优解%%%%%%%%%%%%%%%%%%%%%
        if (Fitness_Function(BestX)>Fitness_Function(NextX))
        %%%%%%%%%%%%%%%%保留上一个最优解%%%%%%%%%%%%%%%%
            PreBestX=BestX;
        %%%%%%%%%%%%%%%%此为新的最优解%%%%%%%%%%%%%%%%
            BestX=NextX;
        end
    %%%%%%%%%%%%%%%%%%%%%Metropolis过程%%%%%%%%%%%%%%%%%%%%%
        if (Fitness_Function(PreX)-Fitness_Function(NextX)>0)
        %%%%%%%%%%%%%%%%接受新解%%%%%%%%%%%%%%%%
            PreX=NextX;
            P=P+1;
        else
            changer=-1*(func1(NextX)-func1(PreX))/T;
            p1=exp(changer);
        %%%%%%%%%%%%%%%%接受较差的解%%%%%%%%%%%%%%%%
            if p1>rand
                PreX=NextX;
                P=P+1;
            end
        end
    trace(P+1)=Fitness_Function(BestX);
    end
    deta=abs(Fitness_Function(BestX)-Fitness_Function(PreBestX));
end
disp(最小值在点:);
BestX
disp(最小值为:)
func1(BestX)
figure
plot(trace(2:end))
xlabel(迭代次数)
ylabel(目标函数值)

迭代结果图 参考文献 智能优化算法及其MATLAB实例(第2版)包子阳等

经验分享 程序员 微信小程序 职场和发展