zoukankan      html  css  js  c++  java
  • matlab练习程序(二次规划-路径跟踪法)

    这一篇可以说是之前拉格朗日方法的后续,拉格朗日方法能够计算等式约束的二次规划。

    这里的路径跟踪法能够计算不等式约束的二次规划或线性规划。至于等式和不等式混合约束的线性规划我以后会用单纯形方法来求解。

    推导方法依然如《最优化理论与算法(第2版)》书上所述:

    这里代码如下(代码中给了六个例子):

    clear all;
    close all;
    clc;
    warning off;
    
    %%以下给了六组例子,该方法能解纯不等式约束的一次与二次规划问题。
    %min x1^2+x2^2-2*x1+2*x2+2
    %s.t. -x1+x2>=-1
    %     x2>=-2
    H = [2 0;
         0 2];
    c = [-2;2];
    A=[-1 1;
        0 1];
    b=[-1;-2];
    m=2;
    delta = 0.1;
    p = 0.9;
    x = [-1;1];
    y = [1;1];
    w = [1;1];
    
    %{
    %min 9*x1^2+9*x2^2-30*x1-72*x2
    %s.t. -2*x1-x2>=-4;
    %      x1>=0
    %      x2>=0
    H=[18 0;
       0  18];
    c=[-30;-72];
    A=[-2 -1;
        1  0;
        0  1];
    b=[-4;0;0];
    m=2;
    delta = 0.1;
    p = 0.9;
    x = [-1;1];
    y = [1;1;1];
    w = [1;1;1];
    %}
    
    %{
    %min x1^2-x1*x2+x2^2-3*x1
    %s.t. -x1-x2>=-2
    %     x1>=0
    %     x2>=0
    
    H=[2 -1;
       -1 2];
    c=[-3;0];
    A=[-1 -1;
        1 0;
        0 1];
    b=[-2;0;0];
    m=2;
    delta = 0.1;
    p = 0.9;
    x = [-1;1];
    y = [1;1;1];
    w = [1;1;1];
    %}
    
    %{
    %min 2*x1^2+x2^2-2*x1*x2-6*x1-2*x2
    %s.t. -x1-x2>=-2
    %     -2x1+x2>=-2
    %     x1>=0
    %     x2>=0
    H=[4 -2;
       -2 2];
    c=[-6;-2];
    A=[-1 -1;
        -2 1;
        1 0;
        0 1];
    b=[-2;-2;0;0];
    m=2;
    delta = 0.1;
    p = 0.9;
    x = [-1;1];
    y = [1;1;1;1];
    w = [1;1;1;1];
    %}
    
    %{
    %min 2*x1^2+2*x2^2+x3^2+2*x1*x2+2*x1*x3-8*x1-6*x2-4*x2+9
    %s.t.  -x1-x2-3>=-3
    %      x1>=0
    %      x2>=0
    %      x3>=0
    
    H=[4 2 2;
       2 4 0;
       2 0 2];
    c=[-8;-6;-4];
    A=[-1 -1 -1;
        1  0  0;
        0  1  0;
        0  0  1];
    b=[-3;0;0;0];
    m=9;
    delta = 0.1;
    p = 0.9;
    x = [-1;-1;-1];
    y = [1;1;1;1];
    w = [1;1;1;1];
    %}
    
    %{
    %min -2*x1+3*x2-x3
    %s.t. x1+x2+x3<=10
    %     2*x1-x2-2*x3<=8
    %     0<=x1<=4
    %     0<=x2<=4
    %     -1<=x3<=2
    H=zeros(3,3);
    c=[-2;3;-1];
    A=[-1 -1 -1;
       -2 1 2;
       1 0 0 ;
       -1 0 0;
       0 1 0;
       0 -1 0;
       0 0 1;
       0 0 -1];
    
    b=[-10;-8;0;-4;0;-4;-1;-2];
    m=2;
    x= rand(3,1);
    y = rand(8,1);
    w = rand(8,1);
    delta = 0.1;
    p = 0.9;
    %}
    
    %%路径跟踪法解线性或二次规划
    while 1
      
        rou = b - A*x + w;
        sigma = c + H*x - A'*y;
        gama = y'*w;
        mu = delta*gama/m;
        
        dxy = inv([-H A';A diag((1./y).*w)])*[sigma;[b-A*x+mu*(1./y)]];
        
        dx = dxy(1:length(x));
        dy = dxy(end-length(y)+1:end);  
        dw = 1./y.*(mu-y.*w-w.*dy);
        
        lambda = min([p*(1/max([-(dy./y);-(dw./w)])) 1]);
        
        x = x + lambda * dx;
        y = y + lambda * dy;
        w = w + lambda * dw;
        
        if norm(dx)<1e-10
            x
            break;
        end
    end
    
    %%将结果绘制出来
    [x1,x2]=meshgrid(-1:0.02:1.5,-2.5:0.02:0);
    z1 = x1.^2+x2.^2-2*x1+2*x2+2;
    mesh(x1,x2,z1);
    hold on;
    
    z = -x1+x2;
    ind = z>=-1;
    X1 = x1.*ind;
    X2 = x2.*ind;
    scatter1 = scatter(X1(:),X2(:),'r.','MarkerFaceColor','r','MarkerEdgeColor','r');       %画半透明图形
    scatter1.MarkerFaceAlpha = .1;
    scatter1.MarkerEdgeAlpha = .1;
    
    z = x2;
    ind = z>=-2;
    X1 = x1.*ind;
    X2 = x2.*ind;
    scatter2 = scatter(X1(:),X2(:),'b.','MarkerFaceColor','b','MarkerEdgeColor','b');
    scatter2.MarkerFaceAlpha = .1;
    scatter2.MarkerEdgeAlpha = .1;
    
    plot3(x(1),x(2),x(1)^2+x(2)^2-2*x(1)+2*x(2)+2,'r*')

    结果如下:

    其中红色区域为:-x1+x2>=-1,蓝色区域为:x2>=-2,红色点为问题的解。

  • 相关阅读:
    MySQL-keepalived做高可用
    Linux-服务管理
    MySQL-CentOS7上安装Mysql5.7
    MySQL-查看DB文件位置
    游戏编程与游戏种类
    计算机
    python
    python中的构造函数
    IndentationError:expected an indented block错误解决
    python程序的pdb调试方法
  • 原文地址:https://www.cnblogs.com/tiandsp/p/12153900.html
Copyright © 2011-2022 走看看