非线性规划 订阅
非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。20世纪50年代初,库哈(H.W.Kuhn) 和托克 (A.W.Tucker) 提出了非线性规划的基本定理,为非线性规划奠定了理论基础。这一方法在工业、交通运输、经济管理和军事等方面有广泛的应用,特别是在“最优设计”方面,它提供了数学基础和计算方法,因此有重要的实用价值。 [1] 展开全文
非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。20世纪50年代初,库哈(H.W.Kuhn) 和托克 (A.W.Tucker) 提出了非线性规划的基本定理,为非线性规划奠定了理论基础。这一方法在工业、交通运输、经济管理和军事等方面有广泛的应用,特别是在“最优设计”方面,它提供了数学基础和计算方法,因此有重要的实用价值。 [1]
信息
外文名
nonlinear programming
基本概念
具有非线性约束或目标的数学规划
意    义
为最优设计提供了有力的工具
中文名
非线性规划
应    用
工程、管理、经济
所属学科
运筹学
非线性规划发展历史
非线性规划是20世纪50年代才开始形成的一门新兴学科。1951年H.W.库恩和A.W.塔克发表的关于最优性条件(后来称为库恩-塔克条件)的论文是非线性规划正式诞生的一个重要标志。在50年代还得出了可分离规划和二次规划的n种解法,它们大都是以G.B.丹齐克提出的解线性规划的单纯形法为基础的。50年代末到60年代末出现了许多解非线性规划问题的有效的算法。20世纪80年代以来,随着计算机技术的快速发展,非线性规划方法取得了长足进步,在信赖域法、稀疏拟牛顿法、并行计算、内点法和有限存储法等领域取得了丰硕的成果。
收起全文
精华内容
下载资源
问答
  • 非线性规划

    2018-12-10 01:02:28
    学习机器学习的入门知识,基础知识,非线性规划是很重要的一门课程
  • 数学建模学习——线性规划 非线性规划
  • 用MonteCarlo求解非线性规划问题-用Monte carlo求解非线性规划.rar 用Monte Carlo求解非线性规划问题 用Monte carlo求解非线性规划.rar 蒙特卡洛
  • 关于运筹学的PPt,里面有关于线性规划,非线性规划,图论的一些详细介绍
  • 线性规划与非线性规划问题线性规划与非线性规划问题
  • 非线性规划ppt

    2018-12-06 20:13:07
    运筹学,非线性规划ppt,包含无条件限制的线性规划与条件限制的线性规划
  • 实例 matlab- 非线性规划 - 作业 现代设计方法 -工程优化理论方法与设计 姓名 学号 班级 研 问题 某厂向用户提供发动机合同规定第一二三季度末分别交货 40 台 60 台 80 台 每 季 度 的 生 产 费 用 为 f x ax bx 2 ...
  • 最优化方法优化问题的分类线性规划问题非线性规划问题非约束优化问题约束优化问题基本概念最优性条件线性规划问题的求解非线性规划问题的求解最优化问题的数学模型最优化问题的数学模型)最优化问题的基本概念全局极...
  • 线性规划 + 非线性规划 + 01规划线性规划代码结果非线性规划代码结果01规划代码结果 线性规划 代码 %%%%%%%%%%% % min % [x, fval] = linprog(f,a,b,aeq,beq,lb,ub); % max = 2*x1 + 3*x2 % x1 + 2*x2 <=8 % 4*...

    线性规划

    代码

    %%%%%%%%%%%
    % min
    % [x, fval] = linprog(f,a,b,aeq,beq,lb,ub);
    
    %  max = 2*x1 + 3*x2
    %  x1 + 2*x2 <=8
    %  4*x1 <= 16
    %  4*x2 <= 12
    %  x1, x2 >=0
    %%%%%%%%%%
    
    f = [-2 -3]';
    a = [1 2; 4 0;0 4];
    b = [8 16 12]';
    [x,z] = linprog(f, a, b, [],[],zeros(2,1));
    x, z=-z
    %因为题目要求是求最大值,而linprog为求最小值,所以要把f变为[-2 ;-3];而且在最后结果的时候要把z = -z
    

    结果

    在这里插入图片描述

    非线性规划

    代码

    %%%%%%%%%%%%%%%%%%%
    % minf(x) = x1^2 + x2^2 + x3^2 + 8
    % 
    % x1^2 - x2 + x3^2 >=0
    % x1 + x2^2 + x3^3 <=20
    % -x1 -x2^2 + 2 = 0
    % x2 + 2x3^2 = 3
    % x1, x2, x3 >=0
    %%%%%%%%%%%%%%%%%%%%
    [x, y] = fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
    
    
    
    %相关函数如下
    fun1.m
    function f = fun1(x)
    f = sum(x.^2) + 8;
    end
    
    
    
    
    fun2.m
    function [g,h] = fun2(x)
    g = [-x(1)^2 + x(2) - x(3)^2
        x(1) + x(2)^2 + x(3)^3 - 20];  %非线性不等式约束
    
    h = [-x(1) - x(2)^2 + 2
        x(2) + 2*x(3)^2 - 3];  %非线性等式约束
    
    

    结果

    在这里插入图片描述

    01规划

    就是变量只能取0 or 1
    指派矩阵的含义:比如4个人做4件事情,这4个人都会做这4件事情。但是每个人做不同事情花费的时间不一样。要求:每个人只能做一件事,每件事都必须要有人做,如何分配任务,才能使总的花费时间最少?
    在这里插入图片描述
    在这里插入图片描述

    代码

    clc,clear
    disp('输入指派矩阵');
    c = input('c = ');
    % c = [8 13 18 23; 10 14 16 27;2 10 21 26; 14 22 26 28];
    %c = [3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];
    [m, n] = size(c);
    %把c转为按列项排列为列矩阵
    c = c(:);
    a = zeros(m+n,m*n); % 1025%表示从第1个变量到第25个变量都是必须是整数
    intcon = 1:m*n;  
    for i = 1:m
        a(i,(i-1)*m+1:m*i) = 1;
        a(m+i, i:m:m*n) = 1;
    end
    b = ones(m+n,1);
    lb = zeros(m*n, 1);
    ub = ones(m*n,1);
    [x,z] = intlinprog(c, intcon,[],[],a,b, lb, ub);
    x = reshape(x,[m,n])
    z
    

    结果

    在这里插入图片描述
    输入指派矩阵为: [3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10]
    结果如下:
    在这里插入图片描述

    展开全文
  • 最优化 机器学习 线性规划 非线性规划
  • Python之建模规划篇--非线性规划

    万次阅读 2021-01-22 10:40:32
    Python之建模规划篇--非线性规划非线性规划基本介绍线性规划与非线性规划的区别非线性规划的Matlab解法Python 解决非线性规划1、等式约束下的拉格朗日乘子法2、Python实现对带约束的非线性规划求解Python编程实现...

    基本介绍

    如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问
    题。一般说来,解非线性规划要比解线性规划问题困难得多。而且,也不象线性规划有
    单纯形法这一通用方法,非线性规划目前还没有适于各种问题的一般算法,各个方法都
    有自己特定的适用范围。
    这是一个非线性规划问题的一般形式
    在这里插入图片描述

    对于一个实际问题,在把它归结成非线性规划问题时,一般要注意如下几点:
    (i)确定供选方案:首先要收集同问题有关的资料和数据,在全面熟悉问题的基础上,确认什么是问题的可供选择的方案,并用一组变量来表示它们。
    (ii)提出追求目标:经过资料分析,根据实际需要和可能,提出要追求极小化或极大化的目标。并且,运用各种科学和技术原理,把它表示成数学关系式。
    (iii)给出价值标准:在提出要追求的目标之后,要确立所考虑目标的“好”或“坏”的价值标准,并用某种数量形式来描述它。
    (iv)寻求限制条件:由于所追求的目标一般都要在一定的条件下取得极小化或极大化效果,因此还需要寻找出问题的所有限制条件,这些条件通常用变量之间的一些不等式或等式来表示。

    线性规划与非线性规划的区别

    如果线性规划的最优解存在,其最优解只能在其可行域的边界上达到(特别是可行域的顶点上达到);而非线性规划的最优解(如果最优解存在)则可能在其可行域的任意一点达到。

    非线性规划的Matlab解法

    在这里插入图片描述
    它的返回值是向量x,其中 FUN 是用M 文件定义的函数 f (x);X0是x的初始值;A,B,Aeq,Beq 定义了线性约束 A* X ≤ B, Aeq * X = Beq ,如果没有线性约束,则A=[],B=[],Aeq=[],Beq=[];LB 和UB 是变量x 的下界和上界,如果上界和下界没有约束,则LB=[],UB=[],如果x 无下界,则LB 的各分量都为-inf,如果x 无上界,则UB的各分量都为 inf;NONLCON 是用M 文件定义的非线性向量函数C(x),Ceq(x);OPTIONS定义了优化参数,可以使用Matlab 缺省的参数设置。

    下面给一个例子
    在这里插入图片描述
    多余的我就不多说了,matlab的可以详细看书
    现在我们来看看再仔细看看非线性规划问题的解法到底有什么

    Python 解决非线性规划

    • 非线性规划可以简单分两种,目标函数为凸函数or非凸函数
    • 凸函数的非线性规划,比如fun= x2 +y2 +xy,有很多常用库完成,比如cvxpy
    • 非凸函数的非线性规划(求极值),可以尝 试以下方法:
      • 纯数学方法,求导求极值
      • 神经网络、深度学习(反向传播算法中链式求导过程)
      • scipy. opt imize. minimize

    scipy . optimize .minimize (fun, x0, args= () , method=None,jaC=None, hess=None, hes sp=None, bounds=None, constaints= (),tol =None, callback=None, options=None)
    fun:求最小值的目标函数
    args:常数值
    method:求极值方法,一般默认。
    constraints:约束条件
    x0:变量的初始猜测值,注意minimize是局部最优

    1、等式约束下的拉格朗日乘子法

    <font size=3公式推导:这里只是简单的放了一张图片对等式约束下拉格朗日乘子法的求解步骤进行了讲解。
    在这里插入图片描述

    2、Python实现对带约束的非线性规划求解

    <font size=3求解实际例题
    在这里插入图片描述

    Python编程实现求解

    #导入sympy包,用于求导,方程组求解等等
    from sympy import *
    #设置变量
    x1 = symbols("x1")
    x2 = symbols("x2")
    alpha = symbols("alpha")
    #beta = symbols("beta")
    
    #构造拉格朗日等式
    L = 60 - 10*x1 - 4*x2 + x1*x1 + x2*x2 - x1*x2 - alpha * (x1 + x2 - 8)
    
    #求导,构造KKT条件
    difyL_x1 = diff(L, x1) #对变量x1求导
    difyL_x2 = diff(L, x2) #对变量x2求导
    difyL_alpha = diff(L, alpha) #对alpha求导
    #求解KKT等式
    aa = solve([difyL_x1, difyL_x2, difyL_alpha], [x1, x2, alpha])
    print(aa)
    

    在这里插入图片描述

    python使用SciPy库实现求解问题

    from scipy.optimize import minimize
    import numpy as np
    #目标函数:
    def func(args):
        fun = lambda x: 60 - 10*x[0] - 4*x[1] + x[0]**2 + x[1]**2 - x[0]*x[1] 
        return fun
    
    #约束条件,包括等式约束和不等式约束
    def con(args):
        cons = ({'type': 'eq', 'fun': lambda x: x[0]+x[1]-8})
        return cons
    
    if __name__ == "__main__":
        args = ()
        args1 = ()
        cons = con(args1)
        x0 = np.array((2.0, 1.0)) #设置初始值,初始值的设置很重要,很容易收敛到另外的极值点中,建议多试几个值
    
        #求解#
        res = minimize(func(args), x0, method='SLSQP', constraints=cons)
        print(res.fun)
        print(res.success)
        print(res.x)
    

    在这里插入图片描述

    结果对比

    1.普通法求结果
    在这里插入图片描述
    2.scipy库求结果
    在这里插入图片描述
    通过两个Python程序的求解结果对比分析,两个的求解结果相差不大,并且误差都在一定范围内,所以可以认为两个的求解结果是一致的。

    样例1

    计算1/x+x的最小值
    如果我们足够熟悉这个函数的性质,我们可以很容易得出来,在x>0的时候,他的最小值为2,因为这是一个双勾函数,为奇函数,可以由基本不等式得到他的最小值,但是我们怎么用程序去实现呢

    from scipy.optimize import minimize
    import numpy as np
    #计算 1/x+x 的最小值
    def fun(args):
        a=args
        v=lambda x:a/x[0] +x[0]
        return v
    if __name__ == "__main__":
        args = (1) #a
        x0 = np.asarray((2)) # 初始猜测值
        res = minimize(fun(args), x0, method='SLSQP')
        print(res)
    #     print(res.fun)
    #     print(res.success)
    #     print(res.x)
    

    可以得到如下结果,我们可以得到函数的最小是为2点多,可以看出minimize求的局部最优
    在这里插入图片描述

    样例2

    计算(2+x1)/ (1+x2) - 3x1 + 4x3的最小值,其中x1、x2、x3范围在0.1到0.9之间

    from scipy.optimize import minimize
    import numpy as np
    
    # 计算(2+x1)/ (1+x2) - 3x1 + 4x3的最小值,其中x1、x2、x3范围在0.1到0.9之间
    
    def fun(args):
        a,b,c,d = args
        v = lambda x: (a+x[0])/(b+x[1]) - c*x[0] + d*x[2]
        return v
    
    def con(args):
        # 约束条件 分为eq 和ineq
        #eq表示 函数结果等于0 ; ineq 表示 表达式大于等于0
        x1min,x1max,x2min,x2max,x3min,x3max = args
        cons = ({'type':'ineq','fun':lambda x:x[0]-x1min},\
        {'type':'ineq','fun': lambda x:-x[0]+x1max},\
        {'type':'ineq','fun': lambda x:x[1]-x2min},\
        {'type':'ineq','fun': lambda x:-x[1]+x2max},\
        {'type':'ineq','fun': lambda x:x[2]-x3min},\
        {'type':'ineq','fun': lambda x:-x[2]+x3max})
        return cons
    if __name__ == "__main__":
        #定义常量值
        args = (2,1,3,4) #a,b,c,d
        #设置参数范围/约束条件
        args1 = (0.1,0.9,0.1,0.9,0.1,0.9) #x1min, x1max, x2min, x2max
        cons = con(args1)
        #设置初始猜测值
        x0 = np.asarray((0.5,0.5,0.5))
        res = minimize(fun(args),x0,
        method='SLSQP',constraints=cons)
        print(res)
        print(res.fun)
        print(res.success)
        print(res.x)
    

    可以看出对于这类简单函数,局部最优解与真实最优解相差不大,但是对于复杂的函数,x0的初始值设置,会很大程度影响最优解的结果。
    在这里插入图片描述
    ADD:
    全局最优的函数: scipy.optimize.basinhopping
    有一个缺点是无法设置约束,求全局的最优解的函数
    https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.basinhopping.html

    每日一句
    Don’t try so hard, the best things come when you least expect them to.
    (不要着急,最好的总会在最不经意的时候出现)

    展开全文
  • 例题建模 典型的优化问题 三大要素 目标种植AB两种作物获得最大利润 ... 2x1+5x2 100 4x1+2x2 120 Matlab优化工具箱 线性规划linprog 非线性规划fminbndfminsearchfmincon Matlab求解线性规划模型 函数linprog linprog
  • 然后,对线性和非线性等式约束非线性规划问题用Lagrange乘子法,将非线性约束部分和目标函数构成增广的Lagrange函数,并保留线性等式约束,这样便得到一个线性等式约束非线性规划序列,从而,又将问题转化为求解只含...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,754
精华内容 1,501
关键字:

非线性规划