知识库 > 数学方法 > 优化方法

非线性规划    

  • 线性规划问题,其目标函数和约束条件都是自变量的一次函数。但是还有一类问题:其目标函数或约束条件中含有非线性函数,我们称这样的规划问题为非线性规划。
    非线性规划问题远比线性规划问题复杂,可分为无约束的非线性规划问题和有约束的非线性规划问题两大类。非线性规划间历的求解方法大体可分为两类:一类是将非线性规划问题化为线性问题来求解,另一类是直接求解。
     
    以上是有约束的非线性规划问题,如果我们将约束条件去掉:

    就变成了无约束的非线性规划问题。

    定义: Prog_N (Fun:string,x0:array,A:array,B:array,Aeq:array,Beq:array,Lb:array,Ub: array, nlc:string,options):array;
    说明:采用拟牛顿下山方法求解非线性规划求解。
    参数:
    Fun : 目标函数,目标函数名字符串类型,不可缺省
    x0 : 初始值,一维数字数组,不可缺省
    A : 不等式约束,二维数组,缺省为空
    B : 不等式约束,一维数组,缺省为空
    Aeq : 等式约束,二维数组,缺省为空
    Beq : 等式约束,一维数组,缺省为空
    Lb : 下界,一维数组,缺省为空
    Ub : 上界,一维数组,缺省为空
    Nlc : 非线性约束,函数名,字符串
    Options:算法参数设置

    非线性规划option字段介绍
    字段含义取值
    'maxiter'最大迭代次数400
    'maxfunevals'目标回调最大次数'100*numberofvariables'
    'tolcon'约束容忍误差1.0e-6
    'tolfun'目标最小误差1.0e-6
    'tolx'变量最小变化1.0e-6
    'diffmaxchange'差分时最大步长1e-1
    'diffminchange'差分时最小步长1e-8

    例:非线性优化(参见平台下的Prog_N_Demo函数)


    Function Prog_N_Demo();
    Begin
      A :=ARRAY((1,1),(4,1));
      B := array(3,9);
      AEQ := ARRAY();
      BEQ := ARRAY();
      lb:= array(0,0);
      ub := array(5,5);
      x0:=array(1,1);//初始值
      options:=array('tolx':1.0e-6,'tolcon':1.0e-6,'tolfun':1.0e-6);
      return prog_n('Prog_N_Demo.obj',x0,a,b,aeq,beq,lb,ub,'Prog_N_Demo.constr',options);
    End;
    Function obj(x);
    Begin
      //目标函数
      Return 2*x[0]^2-4*x[0]*x[1]+4*x[1]^2-6*x[0]-3*x[1];
    End;
    Function constr(x);
    begin
      //非线性约束函数
      ne := array();
      e := array() ;
      ne[0]:= x[0]+x[1]^2-5;
      e[0]:=x[1]^2+x[0]^2-4;
      return array(ne,e);
    end

    下面我们再来介绍两个无约束非线性规划的公用函数。

    定义: NonLP_Fminsearch (Fun:string,x0:array,methods:integer):array;
    说明:无约束最小值求解,求解模型如下:
    min fun(x)
    参数:
    Fun : 目标函数,函数名字符串
    X0 : 初始值,一维数字数组
    Methods : 方法选择
    0 单纯形法
    1 转轴法
    2 模式搜索法
    3 拟牛顿下山法 (默认方法,推荐使用)

    例:无约束最小值求解(参见平台下的NonLP_Fminsearch_Demo函数)

    Function NonLP_Fminsearch_Demo();
    Begin
      x0 := array(1,1) ;//初始值;
      methods :=3;//
      Return NonLP_Fminsearch ('NonLP_Fminsearch_Demo.obj',x0,methods);
    End;
    function obj(x); //目标函数
    begin
     return 3*x[0]^2+x[1]^2-2*x[0]*x[1]+4*x[0]+3*x[1];
    end

    结果:
    array("x":(-1.75,-3.25),"opt":-8.375,"iter":4)

    定义: NonLP_Fminbnd (Fun:string,a:real,b:real,Methods:Integer):array;
    说明:一维最小值搜索,求解模型如下:
    min fun(x)
    参数:
    Fun : 目标函数(函数名字符串)
    A : 下界,实数
    B : 上界,实数
    Methods : 方法选择
    0 : 黄金分割法+抛物线法(默认)
         1 : 盲人收索法
         2 : 黄金分割法
         3 : 斐波那契法

    例:一维最小值搜索(参见平台下的NonLP_Fminbnd_Demo函数)

    Function NonLP_Fminbnd_Demo();
    Begin
      A := 1 ;//下界;
      B := 7;//上界;
      methods :=0;//
      return ret := NonLP_Fminbnd ('NonLP_Fminbnd_Demo.obj',a,b,methods);
    End;
    function obj(x); //目标函数
    begin
      return x^2-5*x+8;
    End;

    结果:
    array("x":2.49999998509884,"opt":1.75,"iter":2)