基于复合形法的有约束单局部最优问题求解-Matlab编程


前言


**本文内容分为三个方面:**

1. 复合形法以及单局部最优问题的概念简介
2. 针对方程实例编写复合形法程序,求解该实例
3. 对求解结果进行后处理与分析

一、复合形法简介

1965年Box将求解无约束优化问题的单形替换法用到求解约束优化问题中,形成了求解约束优化问题的复合形法。复合形法也是先构造复合形,然后根据复合形顶点的特征进行反射、延伸、压缩等运算,最终找到满足条件的最优解。与求解无约束问题的单形替换法不同的是,约束问题有一组约束方程,使变量的取值范围受到了限制,因此复合形法需要检验顶点是否在可行区域内。复合形法的数学模型如下图所示。
复合形法数学模型
复合形法的主要步骤包括:产生初始可行点、产生初始复合形、判断xi是否可行、比较函数值的大小并计算复合形形心、反射计算、延伸计算、收敛计算、重新计算复合形等八个步骤。计算步骤的程序框图如下图所示(图片是用手机扫描的啦,将就看下~)
在这里插入图片描述
复合形法具体的理论,概念在这里咱们就不详细介绍辽,网上和各种教材的解释有很多,本文主要针对具体的单局部最优问题亲手编写一个复合形法的matlab程序进行求解,ok!下面我们开始介绍单局部最优问题以及具体的实例!

二、单局部最优问题简介

1.概念

简而言之,有约束的单局部最优问题,就是指在约束条件下,目标方程仅具有一个最优解,不存在局部最优问题,只要编写的优化算法是正确的,方程将收敛到唯一的最优解,不会出现局部收敛,是的!

2.本文实例

本文采用的单局部最有问题如下:(又是在教材上拍下来的)
在这里插入图片描述
该单局部最优问题为二维优化问题,存在一个线性约束和一个非线性约束。在matlab中绘制该约束问题的三维图像以及等高线图象如下图所示(不要问我怎么画图:-))
单局部最优三维图像
单局部最优等高线图

三、Matlab复合形法程序编写与分析

1. 总览一下改善排版

OK!接下来我们根据问题具体分析复合形法的程序!
我们先来总览一下我写的几个M文件,如图所示
在这里插入图片描述

复合形法主要包含两个函数,复合形迭代函数Fuhexing()以及初始复合形生成函数initalpoint()。其中初始复合形生成函数,根据要求的上下限,初始点以及复合形的顶点数,生成满足等式约束与不等式约束的初始复合形;复合形迭代函数,根据生成的初始复合形,按照复合形迭代算法,依次进行复合性的迭代更新。复合形迭代函数根据输入的目标函数、等式约束、不等式约束、上下限、初始值以及复合形顶点数和误差要求,分三层循环进行迭代,最终生成满足精度要求的复合形,通过函数输出最优值及其函数值、迭代次数,函数中将输出plot_x1,plot_x2,两个向量跟踪记录在迭代过程中自变量的变化,用于后期图像的绘制与分析。
minf.m,Eq.m以及Ineq.m这两个函数分别是目标函数以及等式与不等式约束的定义,textbook3_main.m函数是求解的主函数,定义了复合形法中的几个初始变量的值以及求解精度等。
最后一个函数通过调用主函数,获得求解过程中我们感兴趣的变量并进行了后处理(迭代次数,迭代精度,迭代时间以及自变量的变化等)

2. 初始复合形生成函数initalpoint

主要完成生成复合形初始顶点,根据约束条件求解,循环判断初始复合型是否满足约束条件,返回随机生成的满足条件的复合形。

// 初始复合形生成函数
Xk(:,1)=x0;
    i=1;
    while(i<k)
        i=i+1;
        for j=1:length(x0)
            Xk(j,i)= a(j)+rand().*(b(j)-a(j));%生成复合形顶点
        end       
        ydeng = Eq(Xk(:,i));                  %等式约束求解
        ybdeng = Ineq(Xk(:,i));               %不等式约束求解
        while(ydeng~=1||ybdeng~=1)            %约束条件成立性判断
            Xc=zeros(length(x0),1);
            for j=1:i-1
                Xc=Xc+Xk(:,j);
            end
            Xc=(1/i)*Xc;
            if(Eq(Xc)~=1||Ineq(Xc)~=1)
                i=i-1;
                break;
            else
                while(ydeng~=1||ybdeng~=1) 
                    Xk(:,i)=Xc+0.5*(Xk(:,i)-Xc);%成功生成顶点
                    ydeng = Eq(Xk(:,i));
                    ybdeng = Ineq(Xk(:,i));
                end
            end      
        end

3. 复合形迭代函数

从初始复合形出发,根据变量的上下限,以及我们设置的迭代精度,分三层循环迭代运算,更新复合形参数,在满足迭代精度的条件下,设置迭代结束的标志位,并退出循环,返回迭代过程的优化结果,迭代次数,最优值,自变量的变化向量等参数。

// 第一层循环
while(LLL)
    num=num+1;
    for j=1:k
        Yvalue(j) = minf(Xk(:,j));
    end
    [SXPL,XBZ] = sort(Yvalue);
    plot_x1(num)=Xk(1,XBZ(1));
    plot_x2(num)=Xk(2,XBZ(1));
    plot_value(num)=minf( Xk(:,XBZ(1)) );
    sum1=0;
    for m=1:k
        sum1 = sum1+( minf(Xk(:,m))-minf( Xk(:,XBZ(1)) ) ).^2;
    end
    if ( (sum1/(k-1))^(1/2)<=e )          %复合形精度判断
        X=Xk(:,XBZ(1));
        Minvaule = minf( Xk(:,XBZ(1)) );
        LLL=0;
        break;            
    end
//第二层循环
while(1)
        sum2 = zeros(length(x0),1);
        for m=1:k
            sum2 = sum2+Xk(:,m);
        end
        sum2 = sum2-Xk(:,XBZ(length(XBZ)));
        Xc2 = sum2/(k-1);
        if (Eq(Xc2)~=1||Ineq(Xc2)~=1)
            a=Xk(:,XBZ(1));                 %更新上限
            b=Xc2;                          %更新下限
            Goinitalpoint=1;                %生成复合形顶点标志
           break; 
        end

//最内层循环
alph=1.3;
        while(1)
            Xr=Xc2+alph.*(Xc2-Xk(:,XBZ(length(XBZ))));
            if (Eq(Xr)~=1||Ineq(Xr)~=1)
                alph=0.5*alph;
                continue;
            else
                if( minf(Xr)<minf( Xk(:,XBZ(length(XBZ))) ) )
                    Xk(:,XBZ(length(XBZ)))=Xr;
                    Gofuhexingdiedai=1;
                    break;
                else
                    if(alph<=10^(-10))
                        Xk(:,XBZ(length(XBZ))) = Xk(:,XBZ(length(XBZ)-1)); 
                        break;
                    else
                        alph=0.5*alph;
                        continue;
                    end
                end
            end
        end

4. 设定好目标函数与约束条件

编写好我们待求解的目标函数以及其约束条件,如下

//目标函数
function Y= minf(x)
Y = (x(1)-2)^2+(x(2)-1)^2;
end
//等式约束
function EN = Eq(X)
EN=1;
end

因为我们求解的目标函数不存在等式约束,因此这里把等式约束直接设定为1

//不等式约束
function IN = Ineq(x)
IN=0;
if(((x(1)^2-x(2))<=0)&&((x(1)+x(2)-2)<=0))
   IN=1;
end
end

以上就是目标函数啦,很简单,大家可以尝试更改为其他目标函数进行求解验证效果如何~

四、求解结果后处理与分析

在复合形法求解的过程中,我在程序运行过程中,采用一个全局的变量依次记录下了在迭代过程中,自变量以及目标函数值的变化等其他信息,所以这里我们可以直接编写程序以自己喜欢的方式输出这些变量,并分析求解的效果!这里给出我做的相关的后处理工作~
自变量变化曲线
收敛等高线
函数值曲线
相关计算结果
根据主函数返回迭代过程中自变量以及函数值的变化向量,可以绘制出整个变化走势如下图所示。在给定初值下,函数以较快的收敛速度收敛到稳定值,在第20次迭代中开始趋于稳定,整个计算过程完成了50次迭代达到精度要求。
当然,每次运行求解过程,由于初始复合形的不同,会有求解过程中的细微差异,但是最终求解结果是保证收敛的~

五、总结

总体而言,复合形算法的思路并不难,这篇文章的程序思路也是我查资料看教材总结编写的,程序完全可以顺利运行。
但是我得承认对于刚接触复合形算法的的盆友,文章中在很多细节上的解释并不多,其实只要在理解复合形法的基础上,慢慢耐心阅读一遍程序,就会发现算法的思路是很简单的,需要注意的是程序中对矩阵,向量的一些运算处理,注意自变量与因变量的维度,细心地处理好矩阵和向量的运算问题,就能很快掌握复合形算法!
所有的代码我已经上传了,而且代码中给出了必要的注释,直接运行fun_plot.m文件,就可以完成对该实例的求解与后处理。
复合形法求解单局部最优matlab代码
希望本篇文章能对大家理解复合形法,掌握单局部最优问题的求解有所帮助!
之后我也会整理复合形法求解多局部最优问题的实例,以及拉格朗日乘子法,遗传算法的文章
最最后,如果文章中有什么不足或错误,希望大家指正!
peace&love

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小辛学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值