非线性规划

一、背景

  非线性规划在工业界和学术界中应用非常普遍,譬如交通运输中的路径优化、金融领域中的资产配置、5G网络切片中VNF的放置等。很多时候,我们对复杂问题进行提炼和抽象后,发现可以建模成某一种非线性规划。然而,由于非线性规划多是NP难的问题,并不容易得到最优的可行解。比如非线性规划中的整数规划,就存在着指数爆炸的问题,往往是结合近似算法、启发式算法甚至利用强化学习等方式以在短时间内给出一个较好的可行解。
  鉴于非线性规划的普遍性和重要性,以下,我们将就非线性规划中最为常见和重要的两类问题——整数规划(IP)和混合整数(MIP)问题进行介绍。

二、定义及概念

  1. 整数规划:
      所谓整数规划(Integer Programming)是指模型中所有决策变量都取整数值,可行解的区域离散。一般来说,整数规划多指线性整数规划,可用如下表达式来表征:
    min ⁡ x c T x s . t . A x ≤ b x ≥ 0 x ∈ Z n \min\limits_x c^Tx \\s.t. \quad Ax \le b \\ x \ge 0 \\ x \in Z^n xmincTxs.t.Axbx0xZn
      实际中整数规划之所以重要,就是因为生活中很多东西都是离散的,或者是仅有“yes”或“no”的二值选择。以手机制造的例子来看,由于生产出的手机数量限制在整数,这在采用线性规划的方式下很少得到的最优解恰为整数,下图就是一个典型的例子。
    在这里插入图片描述
      上图中深蓝色框内为可行解区域,而浅蓝色点为可选择的方案(整数点取值)。很明显的,最优解并不是整数,这就需要在已有的LP方案上加以限制来得到整数规划方法。

  2. 混合整数规划:
       混合整数规划(Mixed Integer Programming)是指模型中部分决策变量取值为整数,部分决策变量取值连续。相比于整数规划,区别仅仅是存在有取值连续的决策变量,其总体求解方法和整数规划相差不大。

三、主要求解方法

  那么,如何对整数规划问题进行求解呢?目前主要有以下4大类方法:
  1)精确算法:主要有割平面法,分支定界法等。其特点在于处理问题规模相对较小,且得到的解一定是最优解。
  2)近似算法:只能针对特定问题求解,采用一些特殊的技巧(贪婪、松弛等)进行设计,求解规模相对放宽,但得到的最终结果未必是最优解。
  3)启发式算法:没有严格的理论分析,通过设计经验或者观察到的性质设计出来的,得到的最终结果未必是最优解,但是能够更加适应大规模问题的情况。
  在上述求解方法中,最为基本的就是分支定界法,在此基础上结合不同的优化技巧(预处理、割平面、启发式、并行)变形得到其它的方法。其中,预处理主要是通过在分支界定前采取一些预判操作以减小问题规模和化简约束条件,而切割平面通过去除一些非整数解来进一步化简约束条件,启发式则是在搜索树的某些节点上做一些额外的工作以找到更好的当前最优解,并行计算则是针对不同子树相互独立的特性来实现并行加速。因而可以说分支界定法是整数规划最为核心的方法,以下将详细介绍这一基础方法。

四、分支定界法介绍

  分支定界法是一种利用搜索不断迭代的方法,每次选择不同的分支变量和子问题进行分支。所谓分支,是将全部可行空间分割成若干个子集;定界则是利用松弛化方法,将整形松弛化成连续变量,求得目标下界(对于最小问题而言)。对于界限超过可行解集目标值的分支则可以提前砍掉,以达到优化的效果。以下将结合一个示例来讲解一下具体的执行流程,目标函数及约束如下:

m a x i m i z e x + y + 2 z s . t . 7 x + 2 y + 3 z < = 36 5 x + 4 y + 7 z < = 42 2 x + 3 y + 5 z < = 28 x , y , z ∈ N maximize \quad x+y+2z \\s.t. \quad 7x+2y+3z<=36 \\5x+4y+7z<=42 \\2x+3y+5z<=28 \\x,y,z \in N maximizex+y+2zs.t.7x+2y+3z<=365x+4y+7z<=422x+3y+5z<=28x,y,zN
在这里插入图片描述
  由于优化目标为 m a x ( x + y + 2 z ) max(x+y+2z) max(x+y+2z),且 x , y , z ∈ N x,y,z \in N x,y,zN,所以最终值 v ≥ 0 v \ge 0 v0,现取 v = 0 v = 0 v=0。首先对求解目标进行松弛化,即,让原式中3个变量取值范围都松弛化为连续,求得目标值 11.4545 > v 11.4545>v 11.4545>v,此时obj为目标上界,而x和z都非整数,显然不符合x、y、z都为整数的要求,需要进一步分支。
  以考虑x值范围为例(也可以先考虑z的范围,这回导致生成的树形状不同,求取最优解速度也不一样),由于松弛条件下x=1.273,以此为分界线找到最近的2个整数,即考虑 x ≤ 1 x \le 1 x1 x ≥ 2 x \ge 2 x2两种情况。在Node1条件下分别加入这两个新的约束条件,解得结果分别为Node2和Node3,二者 o b j > v obj>v obj>v,说明可能存在可行的整数解,需要继续分支。
  以Node2和Node3继续下去,得到Node4~7,由于Node5和Node7无解,可以砍掉这俩分支。而Node6的解恰好都为整数,可以更新 v = 11 v=11 v=11。然而,此时Node4的解仍存在非整数,需要继续分支下去,最终得到的结果是 m a x ( x + y + 2 z ) = 11 max(x+y+2z)=11 max(x+y+2z)=11
  一些总结经验:
  1)松弛化后没有可行解,则原问题也无可行解
  2)松弛化后解恰好符合整数约束条件,则该解为子问题最优解
  3)如果子问题X松弛化后解恰好符合整数约束条件,而另一个子问题Y松弛化后解得的目标值 < X松弛化后解得的目标值 + 1,则可以直接将X剪枝掉。

参考链接

整数规划经典方法漫谈
Beyond_Linear_Programming
Branch-and-Cut 解混合整数规划(MIP)
branch and bound(分支定界)算法

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非线性规划是一类优化问题,旨在寻找目标函数在给定约束条件下的最优解,其中目标函数或约束条件中包含非线性项。在Python中,可以使用不同的库来求解非线性规划问题,包括SciPy、CVXPY、Pyomo等。 下面我将介绍两种常用的Python库来求解非线性规划问题:SciPy和CVXPY。 1. 使用SciPy库进行非线性规划: ```python from scipy.optimize import minimize # 定义目标函数和约束条件 def objective(x): return (x[0]-1)**2 + (x[1]-2.5)**2 def constraint1(x): return x[0]**2 + x[1]**2 - 1 # 定义初始点 x0 = [0, 0] # 定义约束条件 constraints = {'type': 'ineq', 'fun': constraint1} # 求解非线性规划问题 result = minimize(objective, x0, constraints=constraints) print(result) ``` 在上述代码中,我们使用minimize函数来求解非线性规划问题。首先定义了目标函数objective和约束条件constraint1。然后,定义了初始点x0和约束条件constraints。最后使用minimize函数求解非线性规划问题,并将结果存储在result对象中。 2. 使用CVXPY库进行非线性规划: ```python import cvxpy as cp # 定义变量 x = cp.Variable(2) # 定义目标函数和约束条件 objective = cp.Minimize((x[0]-1)**2 + (x[1]-2.5)**2) constraints = [x[0]**2 + x[1]**2 <= 1, x[0] >= 0] # 定义问题 problem = cp.Problem(objective, constraints) # 求解非线性规划问题 result = problem.solve() print(result) print(x.value) ``` 在上述代码中,我们使用CVXPY库来求解非线性规划问题。首先定义了变量x,然后定义了目标函数objective和约束条件constraints。接下来,定义了问题problem,并使用solve方法求解非线性规划问题。最优解存储在变量x.value中。 这里只是简单介绍了使用SciPy和CVXPY库进行非线性规划的方法,实际应用中可能还涉及到更复杂的问题和约束条件。你可以根据具体需求选择合适的库和方法来求解非线性规划问题。如果有更多问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值