matlab-模拟退火算法

跟着《matlab数学建模》学,一边做的笔记。代码都在后面。

原理:

由初始解 i 和控制参数初值 t 开始,对当前解重复 “产生新解、计算目标函数差、接收或舍弃”的迭代。

并逐步衰减t值,算法终止时的当前解即为近似的最优解。

新解的产生和接受:

1.由产生函数,由当前解产生位于解空间的新解。注意,产生新解的方式决定了新解的领域结构,因而对冷却进度表选取有影响。

2.计算与新解对应的目标函数差。最好按增量计算。

3.判断新解是否被接受。最常用的接受依据是Metropolis准则。

4.新解被确定接受后用新解代替当前解,将当前解中对应于产生新解是的变换部分实现,再修正目标函数值。

模拟退火算法与初始值无关,具有收敛性,以概率1收敛于全局最优解的全局优化算法。具有并行性。

代码跟前面的步骤直接能对上:

function [xm,fv] = PS0_lamda(fitness,N,c1,c2,lamda,M,D)
format long;
%N初始化群体个体数目
%c1学习因子1
%c2学习因子2
%lamda退火常数惯性权重
%M最大迭代次数
%D搜索空间维数
%%%%%%%初始化种族的个体%%%%%%%
for i=1:N
    for j=1:D
        x(i,j)=randn;
        v(i,j)=randn;
    end
end
%%%%先计算各个粒子的适应度,初始化pi和pg %%%%%%%
for i=i:N
    p(i)=fitness(x(i,:));
    y(i,:)=x(i,:);
end
pg=x(N,:);
for i=1:(N-1)
    if fitness(x(i,:))<fitness(pg)
        pg=x(i,:);
    end
end
%%%%%%%%主循环,按公式以此迭代%%%%%%%%%
T=-fitness(pg)/log(0.2);
for t=1:M
    groupFit = fitness(pg);
    for i=1:N
        Tfit(i)=exp(-(p(i)-groupFit)/T);
    end
    SumTfit=sum(Tfit);
    Tfit=Tfit/SumTfit;
    pBet=rand();
    for i=1:N
        Comfit(i)=sum(Tfit(i,:));
        if pBet<=Comfit(i)
            pg_plus=x(i,:);
            break;
        end
        C=c1+c2;
        ksi=2/abs(2-C-sqrt(C^2-4*C));
        for i=i:N
            %%计算粒子目标值更新P-best和g-best
            v(i,:)=ksi*(v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg_plus-x(i,:)));
            x(i,:)=x(i,:)+v(i,:);
            if fitness(x(i,:))<p(i)
                p(i)=fitness(x(i,:));
                y(i,:)=x(i,:);
            end
            if p(i)<fitness(pg)
                pg=y(i,:);
            end
        end
        T=T*lamda;
        Pbest(t)=fitness(pg);
    end
    xm=pg';
    fv=fitness(pg);
end

案例:

 定义一个函数,然后脚本里面调用:

函数:

function y = lamdaFunc(x)
y=0;
for i=1:5
    y=y+(i+2)/(((x(i)-1)^2)+0.5);
end
y=1/(0.7+y);
end

脚本:

[xm,fv]=PS0_lamda(@lamdaFunc,50,2,2,0.5,100,5)

matlab数学建模系列我会持续更新,也是我的学习笔记。

猜你喜欢

转载自blog.csdn.net/qq_54508596/article/details/127062911
今日推荐