MATLAB实现智能优化算法

MATLAB实现智能优化算法

代码实现

分别使用了遗传算法(GA)、粒子群算法(PSO)、模拟退火算法(SA)、蚁群算法(ACO),针对函数

f(x)=x+10sin(5x)+7cos(4x);

在定义域[0,10]内寻找最大值的迭代优化,源代码如下所示:

function test(para)
%%%%  para为1
%%%%%%%%%遗传算法%%%%%%%%
if para==1

    
    %%%%%参数设置
    NP=50;
    L=20;
    G=100;
    Pc=0.8;
    Pm=0.1;
    xmax=10;
    xmin=0;
    
    prex=randi([0,1],NP,L);    %二进制编码形式
    for k=1:G
        for i=1:NP
            m=0;
            for j=1:1:L
                m=m+2^(j-1)*prex(i,j);
            end
            X(i)=m*(xmax-xmin)/(2^L-1)+xmin;             %十进制编码形式
            fit(i)=func(X(i));   %计算适应度函数
        end
        maxfit=max(fit);
        minfit=min(fit);
        rr=find(maxfit==fit);
        xbest=prex(rr(1,1),:);
        Xbest=X(rr(1,1));
       % fit=(fit-minfit)/(maxfit-minfit);
        %%%%%%%%基于轮盘赌复制操作
        sumfit=sum(fit);
        fitvalue=fit./sumfit;         %归一化处理
        fitvalue=cumsum(fitvalue);
        ms=sort(rand(NP,1));
        fiti=1;
        newi=1;
        while newi<=NP
            if (ms(newi))<fitvalue(fiti)
                nf(newi,:)=prex(fiti,:);
                newi=newi+1;
            else
                fiti=fiti+1;
            end
        end
        %%%%%%%%%基于概率交叉操作%%%%%%
        for i=1:2:NP
            p=rand;
            if p<Pc
                q=randi([0,1],1,L);
                for j=1:L
                    if q(j)==1
                        temp=nf(i+1,j);
                        nf(i+1,j)=nf(i,j);
                        nf(i,j)=temp;
                    end
                end
            end
        end
        %%%%%%%基于概率变异操作%%%%%%%%%
        i=1;
        while i<=round(NP*Pm)
            h=randi([1,NP],1,1);
            for j=1:round(L*Pm)
                g=randi([1,L],1,1);
                nf(h,g)=~nf(h,g);
            end
            i=i+1;
        end
        prex=nf;
        prex(1,:)=xbest;
        trace(k)=maxfit;
    end
    Xbest
    func(Xbest)
    figure(1)
    subplot(2,2,1)
    plot(trace)
       xlabel('iter')
       ylabel('bestfit')
    title('GA算法')

    

else if para==2
        
    %%%%%%%采用粒子群优化算法%%%%%%%%%%
    N=100;
    w=0.8;
    c1=1.5;
    c2=1.5;
    vmax=10;
    vmin=-10;
    xmax=10;
    xmin=0;
    D=1;
    iter_max=100;
    
    prex=rand(N,D)*(xmax-xmin)+xmin;
    v=rand(N,D)*(vmax-vmin)+vmin;
    
    pxbest=prex;
    for i=1:N
        pbest(i,:)=func(prex(i,:));
    end
    [gbest,index]=max(pbest);
    gxbest=prex(index,:);
    iter=1;
    while iter<iter_max
        for i=1:N
            v(i,:)=w*v(i,:)+c1*rand*(pbest(i,:)-prex(i,:))+c2*rand*(gbest-prex(i,:));
            if v(i,:)>vmax
                v(i,:)=vmax;
            end
            if v(i,:)<vmin
                v(i,:)=vmin;
            end
            prex(i,:)=prex(i,:)+v(i,:);
            if prex(i,:)>xmax
                prex(i,:)=xmax;
            end
            if prex(i,:)<xmin
                prex(i,:)=xmin;
            end
            if (func(prex(i,:))>func(pxbest(i,:)))
                pxbest(i,:)=prex(i,:);
                pbest(i,:)=func(prex(i,:));
            end
            if (func(prex(i,:))>gbest)
                gxbest=prex(i,:);
                gbest=func(prex(i,:));
            end
        end
        trace(iter)=gbest;
        iter=iter+1;
    end
    gxbest
    func(gxbest)
    figure(1)
    subplot(2,2,2)
    plot(trace)
       xlabel('iter')
       ylabel('bestfit')
    title('PSO算法')

else if para==3
       %%%%%%%采用模拟退火算法%%%%%%%%%%%
       T=100;
       K=0.998;
       L=200;
       YZ=1e-10;
       xmax=10;
       xmin=0;
       S=0.01;
       D=1;
       P=0;
       prex=rand(D,1)*(xmax-xmin)+xmin;
       prebestx=prex;
       prex=rand(D,1)*(xmax-xmin)+xmin;
       bestx=prex;
      
       deta=abs(func(bestx)-func(prebestx));
       while (deta>YZ&&T>0.01)
           T=K*T;
           for i=1:L
               nextx=prex+S*((xmax-xmin)+xmin);
               for j=1:D
                   if nextx(j,1)>xmax
                       nextx(j,i)=xmax;
                   end
                   if nextx(j,1)<xmin
                       nextx(j,1)=xmin;
                   end
               end
               fit=func(nextx);
               %%%%更新最优参数和适应度
               if fit>func(bestx)
                   prebestx=bestx;
                   bestx=nextx;
               end
               %%%%%%以算法确定是否代替旧解%%%%%%%
               if (func(bestx)-func(prebestx)<0)
                   prex=nextx;
                   P=P+1;
               else
                   changer=-(func(bestx)-func(prebestx))/T;
                   p1=exp(changer);
                   if p1>rand
                       prex=nextx;
                       P=P+1;
                   end
               end
               trace(P+1)=func(bestx);
               
           end
           deta=abs(func(bestx)-func(prebestx));
       end
       bestx
       func(bestx)
       figure(1)
       subplot(2,2,3)
       plot(trace)
       xlabel('iter')
       ylabel('bestfit')
       title('SA算法')
       
    else if para==4
            
            m=50;
            iter_max=2000;
            rho=0.9;
            P0=0.2;
            S=0.1;
            xmax=10;
            xmin=0;
            iter=1;
            x=rand(m,1)*(xmax-xmin)+xmin;
            for i=1:m
                tau(i)=func(x(i));
            end
            S=0.1;
            for NC=1:iter_max
                lamda=1/iter;
                [taumax,index]=max(tau);
                %%%%%%计算状态转移矩阵%%%%%%%%%
                for i=1:m
                    P(NC,i)=(tau(index)-tau(i))/tau(index);
                end
                %%%%%%位置更新
                for i=1:m
                    if P(NC,i)<P0
                        temp1=x(i,1)+(2*rand-1)*S*lamda;
                    else
                        temp1=x(i,1)+(xmax-xmin)*(rand-0.5);
                    end
                    if temp1<xmin
                        temp1=xmin;
                    end
                    if temp1>xmax
                        temp1=xmax;
                    end
                    if func(temp1)>func(x(i,:))
                        x(i)=temp1;
                    end
                end
                for i=1:1:m
                    tau(i)=(1-rho)*tau(i)+func(x(i));
                end
                [value,index]=min(tau);
                trace(NC)=func(x(index));
            end
            [maxval,index]=min(tau);
            maxx=x(index)
            maxval=func(maxx)
            figure(1)
            subplot(2,2,4)
            plot(trace)
        end
    end
    end
end

仿真结果验证

在这里插入图片描述

观察仿真结果可得,x参数最优值聚集于7.85附近,最优函数值为24.85附近,验证了几种算法的有效性。

  • 0
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
matlab最优化程序包括:无约束一维极值问题、进退法、黄金分割法、斐波那契法、牛顿法基本牛顿法、全局牛顿法、割线法、抛物线法、三次插值法、可接受搜索法、Goidstein法、Wolfe Powell法、单纯形搜索法、Powell法、最速下降法、共轭梯度法、牛顿法、修正牛顿法、拟牛顿法、信赖域法、显式最速下降法、Rosen梯度投影法、罚函数法、外点罚函数法、內点罚函数法、混合罚函数法、乘子法、G-N法、修正G-N法、L-M法、线性规划、单纯形法、修正单纯形法、大M法、变量有界单纯形法、整数规划、割平面法、分支定界法、0-1规划、二次规划、拉格朗曰法、起作用集算法、路径跟踪法、粒子群优化算法、基本粒子群算法、带压缩因子的粒子群算法、权重改进的粒子群算法、线性递减权重法、自适应权重法、随机权重法、变学习因子的粒子群算法、同步变化的学习因子、异步变化的学习因子、二阶粒子群算法、二阶振荡粒子群算法 (matlab optimization process includes Non-binding one-dimensional extremum problems Advance and retreat method Golden Section Fibonacci method of basic Newton s method Newton s method Newton s Law of the global secant method parabola method acceptable to the three interpolation search method Goidstein France Wolfe.Powell France Simplex search method Powell steepest descent method Conjugate gradient method Newton s method Newton s method to amend Quasi-Newton Method trust region method explicitly steepest descent method, Rosen gradient projection method Penalty function method outside the penalty function method within the penalty function method Mixed penalty function multiplier method G-N was amended in G-N method L-M method Of linear programming simplex method, revised simplex method Big M method variables bounded simplex method, Cutting Plane Method integer programming branch and bound method 0-1 programming quadratic programming )

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值