Operations Research课程之线性规划对偶(对偶理论|影子价格|单纯形法|对偶单纯形法)

目录

1.对偶问题

1.1 原始和对偶

1.1.1 确定对偶形式

 1.1.2 对偶约束符号

  1.1.2 对偶变量符号

1.2 通用规则

2.对偶理论

2.1 对偶定理

2.1.1 弱对偶性

2.1.2 最优性定理

2.1.3 对偶最优解

2.1.4 强对偶性

2.1.5 互补松弛性

 2.2 为什么需要对偶

3.影子价格

3.1 为什么需要影子价格

3.2 影子价格定义

3.3 影子价格与对偶 

3.4 Gurobi求影子价格

4.对偶单纯形法

4.1 单纯形法

4.2 单纯形法矩阵形式

4.3 为什么要对偶单纯形法 

4.4 对偶单纯形法


来源:Coursera课程Operations Research (3): Theory Week2/3

之前已在博客线性规划及其对偶问题(单纯形法|人工变量|对偶理论)​​​​​​​中写过相关内容,但是Operations Research课程的解释更容易懂,提供了不同的学习视角

课程前言:

运筹学包括三个部分:模型,算法和理论,大部分场景下,理论(theory)是关于最优性条件(optimality conditions),求解实际问题需要建立模型,求解模型需要使用算法,而理论能帮助开发更好的算法

(1)最优性条件

  • 线性规划:对偶性✅
  • 整数规划:全单模矩阵
  • 非线性规划:KKT条件

(2)应用

敏感性分析,分支定界算法加速,网络流模型,线性回归,支持向量机

1.对偶问题

1.1 原始和对偶

1.1.1 确定对偶形式

假设有一个LP问题很难求解,有一个解\hat{x}的目标值是\hat{z},现在想要评估\hat{x}的质量,就要将\hat{z}与最优值z^{*}比较。如果能找到z^{*}的上界(下界),当\hat{z}足够接近这个边界时,\hat{x}就是比较好的解。如何找到一个LP问题的最优值边界?下面例子中目标函数可以直接通过约束条件得到一个上界16。

但是16可能不是一个比较紧的上界,还有更好的,那如何改善我们找到的上界呢?按照同样的思路,给每个约束条件赋值一个系数,不同的系数组合有不同的线性组合,也能提供不同的上界。

 1.1.2 对偶约束符号

假设上述问题中变量符号发生变化,x_{2}<0 ,x_{3}无限制,那么step2也会变化,对偶LP就变成如下所示,可见对偶问题中约束条件的符号取决于原始问题中变量的符号

  1.1.2 对偶变量符号

假设上述问题中第一个约束变成>,第二个约束变成等于=,那么step1也会变化,对偶LP就变成如下所示,可见对偶问题中变量的符号取决于原始问题中约束的符号

1.2 通用规则

如果原始LP是最小化问题,那么对偶LP是最大化问题,即最大化下界,那么所有变量和约束的符号规则都反过来。下面是找到对偶LP的通用规则,原始LP是最大化,就从左到右;原始LP是最小化,就从右到左;实际上这些规划不需要死记硬背,更重要的是理解1.1节中的原因,知道怎么决定对偶形式,约束及变量的符号。

2.对偶理论

2.1 对偶定理

前面提到是为了找到原始LP的最优值上下界,因此开发了对偶问题,实际上对偶问题的用处不仅于此,还有更多相关的理论。理论证明均是基于下面的primal-dual形式

2.1.1 弱对偶性

弱对偶性(weak duality)

2.1.2 最优性定理

最优性定理(sufficiency of optimality)

如果知道一个原始可行解,根据单纯形法要判断其最优性,还要计算检验数reduced cost等,但是根据最优性定理,如果找到了一个对偶可行解并且两者目标函数一致,那么原始可行解就是最优的。

2.1.3 对偶最优解

对偶最优解(dual optimial solution)

2.1.4 强对偶性

强对偶性(strong duality)

  • 弱对偶性:对偶LP提供bound
  • 强对偶性:bound比较紧

根据强对偶性定理,可知原始对偶问题解之间的一些关系

2.1.5 互补松弛性

互补松弛性(Complementary slackness)

 假设对于下面的原始对偶问题,找到了原始LP的最优解(x,s)=(3,2,0,0,1),那么根据互补松弛性,由于x1>0,x2>0,s3>0,因此v1=0,v2=0,y3=0。带入对偶LP可得2y_{1}+2y_{2}=1,以及-y_{1}+y_{2}=0,求得y_{1}=y_{2}=\frac{1}{4},对偶目标值为3,和原始目标值一致,符合强对偶性。

 2.2 为什么需要对偶

对偶理论在学习线性规划问题时一定会遇到到,但是对偶到底有什么用?

来源:Some Uses of Duality in Linear Programming

  • 提供bound:任何对偶问题的可行解都能为原始问题的最优目标函数值提供一个界限 
  • 设计算法:理解对偶问题有助于为某些重要类别的线性规划问题设计专门的算法,某些优化算法(如内点法)在解决线性规划问题时同时考虑原始和对偶问题,这些方法利用原始-对偶的互补松弛性和其他性质来加速收敛到最优解。
  • 敏感性分析:如果原始LP的RHS值改变或新增了一个约束,那原始LP的最优解会不可行,但是对应到对偶LP,这个变化体现在目标函数或新增一个变量,对约束没有影响,因此对偶LP之前的最优解还是可行,通过衡量对偶LP的影响,来判断原始LP对某个约束的敏感程度
  • 初始解:有时找到对偶问题的初始可行解比找到原始问题的初始可行解要容易得多
  • 影子价格:对偶变量为原始约束提供了影子价格。比如原始LP是带资源约束i的利润最大化问题,那对偶变量y(i)表示:每增加一个单位的资源i,最大利润将增加的y(i)
  • 求解更容易有时对偶问题更容易求解,一个具有多个约束和少量变量的原始问题可以转化为一个具有少量约束和多个变量的对偶问题。线性规划中较少的约束是有利的,因为基矩阵是一个 n×n矩阵,其中 n 是约束的数量。因此,约束越少,基矩阵的规模越小,每次单纯形迭代所需的计算量也越少。
  • 判断可行性:对偶问题还可以用来检测原始问题的不可行性,通过弱对偶性可知,如果对偶LP是一个最小化问题,而对偶目标值无边界,意味着无穷小,那么原始LP一定不可行

3.影子价格

3.1 为什么需要影子价格

在学习影子价格时都会遇到一类很经典的问题:假设公司要生产桌子和椅子,需要消耗木材和劳动力,总共有6个木材和6小时劳动力,每个桌子售价3元,需要2个木材和1小时劳动力,每个椅子售价1元,需要1个木材和2个劳动力。通过建模来最大化销售收入。这个问题很容易求解。但是在实际生产中,管理者需要回答很多what-if类的问题:如果椅子售价变成2元呢?如果每个桌子需要3个木材呢?如果我们有10个木材呢?这些问题是因为市场变动导致模型中的参数可能会波动,或者参数的预估不准确,需要寻找方法来改善生意。

对于现实问题,解决what-if问题是比较困难的,模型原始变量和约束可能有上万个,而一个参数的小微浮动,都可能会导致最优解改变,重新建模求解太耗费时间,因此为了解决what-if问题,引入了敏感性分析工具(sensitivity analysis)

  • 原始最优表能提供一些有用的信息
  • 只需要从原始最优基解再迭代几次就能到达新的最优解
  • 对偶性也能提供理论背景

此处只关注一类what-if问题:如果增加了某个特定资源的数量,会发生什么变化。比如有其他人以1元的价格卖给你一个木材,是接受还是拒绝?对每种资源,我们都有一个愿意收购该资源的最大价格,这个价格就是该资源的影子价格。

3.2 影子价格定义

影子价格(shadow price)

对于一个有最优解的LP,一个约束的影子价格是当这个约束的RHS增加1时,目标函数值增加的量,此处假设当前最优基保持不变

注意在影子价格定义中 ,有一个重要假设:当前最优基保持不变。用下面的例子说明这个情况。在旧LP中,最优解是(4,0),最优值是12,最优解与约束1绑定,在增加约束1的RHS后,重新求解这个新LP,最优解是(4.5,0),最优值是13.5,最优解与约束2绑定,影子价格计算为1.5,但是这是不对的,因此前后最优基发生了变化,因此新LP要选择点(5,0)来计算,依旧与约束1绑定,影子价格是15-12=3。这样要求的原因是:影子价格考虑的是约束右端值(资源的数量)微小变化下目标函数值的变化率(rate of improvment),重点关注在一个局部范围内或者最优解附近的变化,在这种情况下,最优基不变确保了这种局部变化的稳定性。

3.3 影子价格与对偶 

影子价格代表目标值的增量,其符号取决于可行域的变化,下面是对于任何LP,一个影子价格的符号所遵循的规律。

非紧约束(Non-binding Constraints,不是严格成立)的影子价格为0,与互补松弛性一致,非紧约束意味着原始松弛变量不为0,因此对偶变量为0,即影子价格为0。用简单的例子描述:因为是非紧约束,意味着该资源还有多余的,那么我就不需要花钱购入更多的资源,这对我能实现的最大收益没有帮助。

紧约束(Binding Constraints,严格成立)的影子价格不一定不为0,这个紧约束可能是冗余的或在最优解处对目标函数的值没有边际影响,同时互补松弛性中可以出现原始松弛变量和对偶变量都为0的情况。如何找到所有的影子价格呢?使用对偶性

影子价格与对偶

对于任何LP,约束影子价格等于其对偶变量在对偶最优解中的取值

下面是一个例子,求解对偶LP得到对偶最优解为(4,0),因此原始LP的影子价格分别为4和0

评估RHS值变化的影响,不需要求解m个LP问题,只需要求解一个对偶LP

3.4 Gurobi求影子价格

Gurobi在求解原始模型时,调用Pi属性可以得到影子价格

shadow_price = model.getAttr('Pi', model.getConstrs())
shadow_price = model.getAttr(GRB.Attr.Pi)

这是3.3中的问题代码 

model = gp.Model()
x1=model.addVar(vtype=GRB.CONTINUOUS,lb=0.0,name='x1',)
x2=model.addVar(vtype=GRB.CONTINUOUS,lb=0.0,name='x2')

model.addConstr(x1+x2>=2)
model.addConstr(3*x1+x2>=1)

model.setObjective(6*x1+4*x2, GRB.MINIMIZE)
model.optimize()

shadow_price = model.getAttr(GRB.Attr.Pi)
shadow_price

 输出结果为

[4.0, 0.0]

4.对偶单纯形法

4.1 单纯形法

单纯形法(simplex method)是线性规划问题中比较经典的求解方法,在教材和网络上有非常多介绍,但是通过学习国外的教材和课程,发现对于单纯形法的解释更清楚,比如怎么选择换入换出变量,设置最小比例是为什么等等,而且单纯形表格式也不同,以下内容参考:

教材:Operations ResearchApplications and Algorithms Book by Wayne L. Winston

课程Operations Research (2): Optimization Algorithms week2 the simplex method

对于一个Ax=b的线性系统,有m个线性等式和n个变量(n>m),变量可分为两类

  • 基变量(basic variables):选择其中m个变量
  • 非基变量(nonbasic variables):剩余n-m个变量

将非基变量赋值为0,得到基变量的值就得到了一个基解,如果基解中变量取值均非负,则为基本可行解。单纯形法是一个有方向的搜索基本可行解的过程,通过不停的变换基变量集合和非基变量集合来找到最优的基本可行解,这个思路和邻域搜索很相似:初始可行解—>判断是否最优—>找到邻域解。

(1)初始可行解

首先将线性系统转化为标准形式,大部分情况下松弛变量能组成单位矩阵,因此可选择为基变量得到一个初始可行基。举例说明单纯形表如下,其中目标函数可以写成z-x1=0,称为Row 0。初始可行基为(0,0,4,8,3),其中x1和x2为非基变量,x3,x4,x5为松弛变量,也是基变量。

(2)判断是否最优 

单纯形法在迭代过程中要保证row 0是由非基变量组成的,z+row 0=目标值,非基变量取值为0。对于最大化问题,如上表所示,如果row 0中某个非基变量系数为负,增加这个非基变量的取值,只会对基变量取值造成影响,而其它非基变量依旧是0,目标函数z值也会增加,说明当前的基解还有改进空间,不是最优的。

(3)找到邻域解

已经判断了当前解不是最优的,就要继续搜索邻域解,将某个非基变量变成基变量,将某个基变量变成非基变量。涉及三个操作:

  • 换入操作:选择row 0中系数为负(根据问题最大化最小化决定)的,如果有多个非基变量系数为负,选择最小的,因为要尽可能增加目标值
  • 换出操作:假设选定了x1作为换入的基变量,意味着x1的取值会从0增加到某个正数,而某个原来的基变量要从正数减小到0,由于约束的存在,x1增加的幅度是有限制的,对每行计算x1可以增加的最大值ratio,即ratio test,选择最小的那一行对应的基变量换出,当x1逐渐增加时,ratio最小的那个基变量最先变成0。单纯形法是沿着遍从一个点移动到另一个点,选择ratio最小的基变量换出意味着最先到达这个点。
  • 列单位化:完成以上两步操作后会对应到矩阵的某个单元格,需要将所在列变成单位向量,即其它元素都为0,如果不执行此步操作,在下一次迭代时,增加某个非基变量的取值,可能会同时对多个基变量造成影响,在问题规模较大的情况下,变量和约束上万,这样难以决策,而基变量变成单位矩阵,每一个约束(每行)一个非基变量的变化只会影响到一个基变量,方便下一次的换入换出,同时row 0行也要更新再次用非基变量表示便于判断最优。

如下所示,经过两次的置换后找到了最优解(3,2),z=3

  • 第一次:换入x1,计算每行比例,4/2=2,8/2=4,第3行x1系数为0,意味着增加x1对基变量x5没有影响,选择换出x3,并且列中其它元素转化为0
  • 第二次:换入x2,计算每行比例,第1行x2系数为负,意味着增加x2不会导致x1减少,x1不会变成非基变量,4/2=2,3/1=1,选择换出x4,并且列中其它元素转化为0

整个搜索过程(0,0,4,8,3)—>(2,0,0,4,3)—>(3,2,0,0,1) 

row 0行中的系数就是每个变量的检验数,也就是reduced cost,用来衡量增加该变量的取值时对目标函数值造成的影响。 

4.2 单纯形法矩阵形式

前后对应的单纯形表如下: 

单纯形法的矩阵表达形式能帮助处理what-if类问题 

4.3 为什么要对偶单纯形法 

在3.1节中描述过现实存在很多what-if类问题,对于资源增加类问题,可以计算影子价格来处理,接下来再处理两类问题:

(1)新增变量

假设生产两类产品需要用到两类资源,要求确定生产数量在资源约束下实现利润最大化,模型如下图左所示,容易求解得到单纯形表和最优解。现在问题发生改变,可以用同样的资源生产第3类产品,即新增一个变量,模型如下图右所示,最简单的处理方法就是重新求解,但是实际上新问题与旧问题是非常相似的,能不能利用旧问题的求解信息快速得到新问题的解呢?

现在决策变量集合从(x1,x2)变成了(x1,x2,x3),假设原始最优解为(x1*,x2*),那么 (x1*,x2*,0)一定是新问题的一个可行解,放在单纯形法就是新增了一行,如何计算新增列在迭代结束时的系数和reduced cost?也就是下图中?的一列

通过矩阵形式可知: 

然后再次更新迭代找到最优解(0,0,6),和重新计算新问题相比,减少了计算量 

 (2)新增约束

同样的问题,现在的变化是新增了一个约束,对第一种产品的数量有约束,要求不大于1,而原先的最优解(2,2)是不可行的

计算完新增约束后的单纯形表,会发现RHS有一个值为-1,这表明原来的最优解在新增约束后变得不可行,也不能在这个表上继续迭代了。

 但是如果primal LP新增约束,就意味着dual LP新增变量,这样就回到了问题(1)新增变量,就能继续在原始最优单纯形表上迭代求解,这就是对偶单纯形法的思想

4.4 对偶单纯形法

对偶单纯形法(用于最大化问题)维护对偶可行性和修正原始不可行

  • 换出操作:找到一个负RHS值的基变量作为换出变量(行)
  • ratio test:对于换出行中值为负的非基变量列执行ratio test,reduced cost为分子,负非基变量绝对值为分母,选择值为负的非基变量才能保证迭代后RHS值变为正
  • 换入操作:选择比例最小的非基变量列换入,这样能保证在把换入的非基变量reduced cost变成0时,其余的reduced cost不为负

下面举例说明该过程 

对偶单纯形法dual simplex method主要用于解决额外的约束,比如用branch bound求解整数规划问题时,在一个节点处会拆分成两个部分,同时增加约束,就可以用对偶单纯形法快速求解 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值