智能优化算法——模拟退火算法

模拟退火算法

简介

模拟退火算法的思想借鉴于固体的退火过程,当固体的温度很高时,内能比较大,固体内的粒子处于快速无序运动状态,当温度慢慢降低,固体的内能减小,粒子逐渐趋于有序,最终固体处于常温状态,内能达到最小,此时粒子最为稳定。

MATLAB例子(出自智能优化算法MALTAB实现)

7.1

D=10;%变量维数
Xs=20;%上限
Xx=-20;%下限
%冷却表参数
L=200;%马尔可夫链长度
K=0.998;%衰减参数
S=0.01;%步长因子
T=100;%初始温度
YZ=1e-8;%容差
P=0;%Metropolis过程中总接受点
%随机选点初值设定
PreX=rand(D,1)*(Xs-Xx)+Xx;
PreBestX=PreX;
PreX=rand(D,1)*(Xs-Xx)+Xx;
BestX=PreX;
%每迭代一次退火一次,直到满足迭代条件为止
deta=abs(func1(BestX)-func1(PreBestX));
while (deta>YZ)&&(T>0.001)
    T=K*T;
    %在当前温度T下迭代次数
    for i=1:L
        %在此点附近随机选下一点
        NextX=PreX+S*(rand(D,1)*(Xs-Xx)+Xx);
        %边界条件处理
        for ii=1:D
            if NextX(ii)>Xs|NextX(ii)<Xx
                NextX(ii)=PreX(ii)+S*(rand*(Xs-Xx)+Xx);
            end
        end
        %是否全局最优解
        if (func1(BestX)>func1(NextX))
            %保留上一个最优解
            PreBestX=BestX;
            %此为新的最优解
            BestX=NextX;
        end
        %Metropolis过程
        if(func1(PreX)-func1(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)=func1(BestX);
    end
    deta=abs(func1(BestX)-func1(PreBestX));
end
disp('最小值在点:');
BestX
disp('最小值为:');
func1(BestX)
figure
plot(trace(2:end))
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%适应度函数
function result =func1(x)
summ=sum(x.^2);
result=summ;
end

7.2

XMAX=5;%搜索变量x最大值
XMIN=-5;%搜索变量x最小值
YMAX=5;%搜索变量y最大值
YMIN=-5;%搜索变量y最小值
%冷却表参数
L=100;%马尔可夫链长度
K=0.99;%衰减参数
S=0.02;%步长因子
T=100;%初始温度
YZ=1e-8;%容差
P=0;%Metropolis过程中总接受点
%随机选点,初值设定
PreX=rand*(XMAX-XMIN)+XMIN;
PreY=rand*(XMAX-XMIN)+XMIN;
PreBestX=PreX;
PreBestY=PreY;
PreX=rand*(XMAX-XMIN)+XMIN;
PreY=rand*(XMAX-XMIN)+XMIN;
BestX=PreX;
BestY=PreY;
%每迭代一次退火一次,直到满足迭代条件为止
deta=abs(func2(BestX,BestY)-func2(PreBestX,PreBestY));
while (deta>YZ)&&(T>0.001)
    T=K*T;
    %在当前温度T下迭代次数
    for i=1:L
        %在此点附近随机选下一点
        p=0;
        while p==0
            NextX=PreX+S*(rand*(XMAX-XMIN)+XMIN);
            NextY=PreX+S*(rand*(XMAX-XMIN)+XMIN);
            if(NextX>=XMIN&&NextX<=XMAX&&NextY>+...
                    YMIN&&NextY<=YMAX)
                p=1;
            end
        end
            %是否全局最优解
            if (func2(BestX,BestY)>func2(NextX,NextY))
                %保留上一个最优解
                PreBestX=BestX;
                PreBestY=BestY;
                %此为新的最优解
                BestX=NextX;
                BestY=NextY;
            end
            %Metropolis过程
            if(func2(PreX,PreY)-func2(NextX,NextY)>0)
                %接受新解
                PreX=NextX;
                PreY=NextY;
                P=P+1;
            else
                changer=-1*(func2(NextX,NextY)-func2(NextX,NextY))/T;
                p1=exp(changer);
                %接受较差的解
                if p1>rand
                    PreX=NextX;
                    PreY=NextY;
                    P=P+1;
                end
            end
            trace(P+1)=func2(BestX,BestY);
    end
    deta=abs(func2(BestX,BestY)-func2(PreBestX,PreBestY));
end
        disp('最小值在点:')
        BestX
        BestY
        disp('最小值为:')
        func2(BestX,BestY)
        plot(trace(2:end))
        xlabel('迭代次数')
        ylabel('目标函数值')
        title('适配值进化曲线')
        %适应度函数
        function value=func2(x,y)
        value=5*cos(x*y)+x*y+y*y*y;
        end

7.3

clear all;
close all;
clc;
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
    3238 1299; 4196 1044;4312 790;4386 570;3007 1970;2562 1756;...
    2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;...
    3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...
    3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
    2370 2975];%31个省会的坐标
n=size(C,1);%TSP问题的规模,城市数目//此处返回C的行数
T=100*n;%初始温度
L=100;%马尔可夫链长度
K=0.99;%衰减参数
%城市坐标结构体
city=struct([]);
for i=1:n
    city(i).x=C(i,1);
    city(i).y=C(i,2);
end
l=1;%统计迭代次数
len(l)=func3(city,n);%每次迭代后的路线长度
figure(l);
while T>0.001%停止迭代温度
    %多次迭代扰动,温度降低之前多次实验
    for i=1:L
        %计算原路线总距离
        lenl=func3(city,n);
        %产生随机扰动
        %随机置换两个不同的城市坐标
        p1=floor(1+n*rand());
        p2=floor(1+n*rand());
        while p1==p2
            p1=floor(1+n*rand());
            p2=floor(1+n*rand());
        end
        tmp_city=city;
        tmp=tmp_city(p1);
        tmp_city(p1)=tmp_city(p2);
        tmp_city(p2)=tmp;
        %计算新路线总距离
        len2=func3(tmp_city,n);
        %新老距离的差值,相当于能量
        delta_e=len2-lenl;
        %新路线好于旧路线,用新路线代替旧路线
        if delta_e<0
            city=tmp_city;
        else 
            %以概率选择是否接受新解
            if exp(-delta_e/T)>rand()
                city=tmp_city;
            end
        end
    end
    l=l+1;
    %计算新路线距离
    len(l)=func3(city,n);
    %温度不断下降
    T=T*K;
    for i=1:n-1
        plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-');
        hold on;
    end
    plot([city(n).x,city(1).x],[city(n).y,city(1).y],'ro-');
    title(['优化最短距离:',num2str(len(l))]);
    hold off;
    pause(0.005);
end
figure(2);
plot(len)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%计算路线总长度
function len=func3(city,n)
len=0;
for i=1:n-1
    len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2);
end
len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2);
end

参考解释

深度学习 — 模拟退火算法详解(Simulated Annealing, SA)
详解模拟退火算法(含MATLAB代码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值