zoukankan      html  css  js  c++  java
  • Matlab随笔之线性规划

     
    LP(Linear programming,线性规划)是一种优化方法,在优化问题中目标函数和约束函数均为向量变量的线性函数,LP问题可描述为:
    min x
    s.t.
    A·x b
    Aeq·x=beq
    vlb x vub
    其中 ,b,beq均为向量,A,Aeq为矩阵,x为向量变量.矩阵A和向量b是线性不等式约束条件的系数,

    Aeq和beq是等式约束条件的系数.

    在MATLAB中,用于LP的求解函数为linprog.其调用格式为:
    [x,fval,lambda]=linprog(f,A,b,Aeq,beq,vlb,vub,x0,options)
    其中f,A,b,是不可缺省的输入变量,x是不可缺省的输出变量,它是问题的解.vlb,vub均是向量,分别表示x的下界和上界,x0为x的起始点,options为optimset函数中定义的参数的值,fval是目标函
    数在解x处的值,lambda为在解x处的lagrange乘子.lambda.lower对应于vlb,lambda.upper对应于ulb,lambda.ineqlin是对应于线性不等式约束的,lambda.eqlin是对应于线性等式约束的.

    例子1

    >>% 求解下列线性规划问题 
    % max z=2x1+3x2-5x3 
    % s.t. x1+x2+x3=7 
    %      2x1-5x2+x3>=10 
    %      x1+3x2+x3<=12 
    %      x1,x2,x3>=0
    
    f=[2;3;-5];%目标函数列矩阵 
    A=[-2,5,-1;1,3,1];%不等矩阵 
    b=[-10;12]; 
    Aeq=[1,1,1];%相等矩阵 
    beq=7; 
    x=linprog(-f,A,b,Aeq,beq,zeros(3,1)); 
    %zeros(m,n)产生m×n的double类零矩阵,zeros(n)产生n×n的全0方阵 
    value=f'*x%目标值,其值等于[x,y]=linprog(-f,A,b,Aeq,beq,zeros(3,1))的-y 
    Optimization terminated.
    
    value =
    
       14.5714
    
    >> x
    
    x =
    
        6.4286 
        0.5714 
        0.0000
    
    >>

    例子2

    >> % 求解下列线性规划问题 
    % min z=2x1+3x2+x3 
    % s.t. x1+4x2+2x3>=8 
    %      3x1+2x2>=6 
    %      x1,x2,x3>=0 
    f=[2;3;1]; 
    A=[-1,-4,-2;-3,-2,0]; 
    b=[-8;-6]; 
    x=linprog(f,A,b,[],[],zeros(3,1))%无等式,用[]代替 
    value=f'*x %其值等于[x,y]=linprog(f,A,b,[],[],zeros(3,1))的y 
    Optimization terminated.
    
    x =
    
        0.8066 
        1.7900 
        0.0166
    
    
    value =
    
        7.0000
    
    >>

    例子3

    % min  z=|x1|+2|x2|+3|x3|+4|x4|;
    % s.t.   x1-x2-x3+x4=0;
    %        x1-x2+x3-3*x4=1;
    %        x1-x2-2*x3+3*x4=-0.5
    %目标函数 
    objfun=@(x)abs(x(1))+2*abs(x(2))+3*abs(x(3))+4*abs(x(4)) 
    %等式约束 
    Aeq=[1 -1 -1 1 
         1 -1 13 
         1 -1 -2 3];
    beq=[0 1 -0.5]'; 
    x0=[0 0 0 0];%给一个初值 很关键
    x=fmincon(objfun,x0,[],[],Aeq,beq)
    
    %下面是根据的需要改进的程序
    依据:|x|=u+v,x=u-v(u,v>=0) min z
    =[1 2 3 4 1 2 3 4]*[u1 u2 u3 u4 v1 v2 v3 v4]; s.t. A=[1 -1 -1 1 -1 1 1 -1 1 -1 1 -3 -1 1 -1 3 1 -1 -2 3 -1 1 2 -3] x=[u1 u2 u3 u4 v1 v2 v3 v4]' b=[0 1 -0.5]' Ax=b x>=0 %目标函数 f=[1 2 3 4 1 2 3 4]; %等式约束

      Aeq=[1 -1 -1 1
      1 -1 1 -3
      1 -1 -2 3];
      Aeq=[Aeq,-Aeq];

    beq=[0 1 -0.5]';
    %边界条件
    lb=zeros(8,1);
    %调用linprog
    x=linprog(f,[],[],Aeq,beq,lb)
    
    Optimization terminated.

    x =

    
    

        0.2500
        0.0000
        0.0000
        0.0000
        0.0000
        0.0000
        0.0000
        0.2500

  • 相关阅读:
    Nacos深入浅出(四)
    Nacos深入浅出(三)
    Nacos深入浅出(二)
    Nacos深入浅出(一)
    Mycat(1)
    redis事务
    git常用的方式
    redis主从复制
    redis持久化RDB和AOF
    Quartz
  • 原文地址:https://www.cnblogs.com/vanker/p/4247701.html
Copyright © 2011-2022 走看看