跳转至

线性规划的对偶理论⚓︎

约 3691 个字 预计阅读时间 12 分钟

2.1 对偶问题⚓︎

  • 对偶:对同一个事物/问题从不同的角度(立场)提出的不同表述;

工厂利用手中资源生产两种产品,如何使得利润最大?

对偶:假定一个公司试图把工厂的生产资源全部收购,那么至少要付出多少代价才能使工厂放弃生产活动、让出全部资源?

原问题:

\[\mathop{\max} \hspace{3pt} z = \sum^{n}_{j = 1}{c_j x_j}\]
\[s.t. \sum^{n}_{j = 1}{a_{ij}x_j} \leq b_i  \hspace{12pt} ( i =1,...,m)\]
\[x_j \geq 0 \hspace{12pt} (j = 1,...,n)\]

对偶问题:

\[\mathop{\min} \hspace{3pt} w = \sum^{m}_{i = 1}{b_i x_i}\]
\[s.t. \sum^{m}_{i = 1}{a_{ij}y_i} \geq c_i  \hspace{12pt} ( j =1,...,n) \]
\[ y_j \geq 0 \hspace{12pt} (i = 1,...,m)\]
  • 对称形式(Symmetric Form),线性规划问题满足如下条件:一、决策变量均为非负数;约束条件为极大的时候均取"\(\leq\)",当目标函数取极小的取"\(\geq\)"。对于其他形式的线性规划问题,可以先转化为对称形式,然后根据上述规则写出对偶问题。
原问题 对偶问题
约束条件系数矩阵 约束条件系数矩阵的转置
约束条件右端项向量 目标函数系数向量
目标函数系数向量 约束条件右端项向量
目标函数:\(\mathop{\max} \hspace{2pt} z = \sum \limits^{n}_{j = 1}{c_j x_j}\) \(\mathop{\min} \hspace{2pt} w = \sum \limits^{m}_{i = 1}{b_i y_i}\)
约束条件数 \(= m\) 决策变量个数 \(= n\)
\(i\)个约束条件: \(\sum^{n}_{j=1}{a_{ij} x_j} \leq b_i\) \(i\)个决策变量:\(y_i \geq 0\)
\(i\)个约束条件: \(\sum^{n}_{j=1}{a_{ij} x_j} \geq b_i\) \(i\)个决策变量:\(y_i \leq 0\)
\(i\)个约束条件: \(\sum^{n}_{j=1}{a_{ij} x_j} = b_i\) \(i\)个决策变量:\(y_i\) 无约束
决策变量个数\(=n\) 约束条件数 \(= m\)
\(j\)个决策变量:\(x_j \geq 0\) \(j\)个约束条件\(\sum^{n}_{j=1}{a_{ij} y_j} \geq c_i\)
\(j\)个决策变量:\(x_j \leq 0\) \(j\)个约束条件\(\sum^{n}_{j=1}{a_{ij} y_j} \leq c_i\)
\(j\)个决策变量:\(x_j\) 无约束 \(j\)个约束条件\(\sum^{n}_{j=1}{a_{ij} y_j} = c_i\)
目标函数 max min
约束条件系数矩阵 A AT
约束条件右端项向量 b c
目标函数的系数向量 c b
函数约束与变量约束 第k个约束 <----> 第k个向量
约束个数 = 变量个数
(非)规范约束 <----> 非负(正)变量
等式约束 == 自由变量

上表中 规范约束 指的是前文对称形式下求解目标函数的性质和约束条件的大小约束对应关系,即:求解极大对应“\(\leq\)”,而求解极小对应“\(\geq\)

2.1.2 对偶问题的矩阵表示⚓︎

  • 我们考虑标准形式:
\[\min c^T x\]
\[\text{s.t.} \left\{ \begin{aligned} Ax = b \\ x \geq 0 \\ \end{aligned} \right.\]
  • 其对偶问题是:
\[\max b^T y\]
\[\text{s.t.} \left\{ \begin{aligned} A^Ty \leq c  \end{aligned} \right.\]

  • 同理,任何一种线性规划问题都可以写成标准形式并利用标准形式,写出对偶形式,比如我们考虑如下的问题。
\[\min d^T x\]
\[\text{s.t.} \left\{ \begin{aligned} Ax = b \\ x \geq 0 \\ \end{aligned} \right.\]

2.2 对偶理论⚓︎

⏰:针对的是“对称形式”的对偶问题,因为所有非对称形式都可以转化为对称形式;

2.2.1 弱对偶定理⚓︎

  • 如果\(x = (x_1, x_2, x_3,...x_n)^{T}\)是原问题的可行解,\(y = (y_1, y_2,...,y_m)^{T}\) 是对偶问题的可行解,那么 \(c^{T}x \leq b^T y\)

说人话版本:原问题最优解目标函数是对偶问题目标函数值下界,对偶问题最优问题目标函数值是原问题目标函数值上界。

推论2.1⚓︎

  • 如果原问题有可行解并且目标函数值无界,那么它的对偶问题无可行解;同理如果对偶问题有可行解并且目标函数无界,那么原问题无可行解。

2.2.2 最优性定理⚓︎

  • 如果\(x = (x_1, x_2, x_3,...x_n)^{T}\)是原问题的可行解,\(y = (y_1, y_2,...,y_m)^{T}\) 是对偶问题的可行解,并且\(c^{T}x = b^T y\),(两者的目标函数值是相等的),那么\(x\)是原问题的最优解,\(y\)是对偶问题的最优解;

2.2.3 对偶定理⚓︎

  • 在互为对偶的两个线性规划问题中,如果其中一个有最优解,那么另外一个也有最优解,并且两者最优目标函数相等

推论2.2⚓︎

  • 如果原问题有可行解而其对偶问题没有可行解,那么原问题目标函数值无界;同理如果对偶问题有可行解而原问题没有可行解,那么对偶问题目标函数值无界。

2.2.4 互补松弛性⚓︎

  • 如果\(x = (x_1, x_2, x_3,...x_n)^{T}\)是原问题的可行解,\(y = (y_1, y_2,...,y_m)^{T}\) 是对偶问题的可行解,那么它们为各自问题的最优解的充要条件是:\(y^{T}_s x = 0, x^{T}_s y = 0\)

    • 松约束、紧约束
  • 详细版本:(双最优解情况)若原问题中某一约束条件对应的对偶变量值为非0,那么该约束条件取严格等式,若约束条件取严格等式,那么对应的对偶变量一定为0.也就是

    • \(y_i > 0\),那么 \(\sum \limits^{n}_{j = 1}{a_{ij} x_j} = b_i\),松弛变量为0
    • \(\sum \limits^{n}_{j = 1}{a_{ij} x_j} < b_i\),也就是松弛变量不为0,则\(y_i = 0\)

      因为原问题的约束条件对应对偶的目标函数,原问题的松弛变量为0,意味着对应的一个约束条件取等号,也就意味着这个约束条件对应的对偶问题的一个决策变量不为0;如果原问题的松弛变量不为0,那么意味着这是一个松约束,所以对偶问题对应的决策变量就必须为0;

2.3 影子价格⚓︎

  • 影子价格:单位第\(i\)种资源在最优方案中做出的贡献,或者说是相应资源对目标总利润的边际贡献;
    • 是指依据一定原则确定的,能够反映投入物和产出物真实经济价值、反映市场供求状况、反映资源稀缺程度、使资源得到合理配置的价格。
  • 影子价格依赖于资源的利用情况

  • 影子价格的大小客观反映了资源在系统内的稀缺程度

    互补松弛型:如果生产过程中,资源\(b_i\)没有充分利用,那么影子价格为0,如果影子价格不为0意味着资源在生产中已经耗尽,也就是说这是一种稀缺资源。增加这种资源可以改善目标函数值,影子价格越高,反应资源在系统内越稀缺,增加该资源的供给对系统目标函数值的贡献越大。

  • 影子价格实际上是一种机会成本,检验数\(\sigma_j = c_j - \sum \limits^{m}_{i = 1}{a_{ij} y_i}\) 反应的是利润 - 产品消耗的各项影子价格之和。只有利润大于机会成本,才会生产它有利。
  • 在出现退化的最优解的时候,会出现资源耗尽而不稀缺,但影子价格仍然大于0的情况,这时增加\(b\)只会带来资源的剩余,不增加利润。

2.4 对偶单纯形法⚓︎

单纯形法总体而言在:1. 先找到可行性;2. 再确定最优性; 对偶单纯形法相当于反了过来(或者==可以理解成,对这个LP的对偶问题,进行单纯形法求解==),先找对偶问题的可行解(也就是原问题的“最优”解),再寻找符合对偶问题最优性(也就是原问题可行解)的解;

  • 我们知道在原问题里,最优性通过检验数\(\sigma_j\)衡量,可行性通过右端项 \(b_i\) 衡量,而对偶单纯形法,首先满足原问题最优性,然后逐渐逼近可行性,所以在第一步的时候,是允许右端项为负的。 理解这个问题有助于我们理解后面的模型变化。
  • 然后我们开始求解:

  • (1) 列出初始单纯形表,要求\(c_j - z_j\) 检验数小满足非正约束,也就是对偶问题为可行解,对\(b_i\)的值不做要求,

  • (2)最优性判断\((B^{-1}b)_{i} < 0\)

  • 确定出基变量:没有找到可行解,总存在 \(b_i < 0\),选择\(b_i\)中最小的,对应的变量\(x_r\) 就是出基变量;

  • 确定入基变量,上一步确定了出基变量,为了确保下一表中出基变量\(r\)行基变量为正值,需要找对应\(a_{rj} < 0 ( j = m + 1,...,n)\)非基变量 > 单纯形法中找的是\(a_{is} > 0\)的出基;
\[\theta = \mathop{\min}  \{ \dfrac{c_j - z_j}{a_{rj} } | a_{rj} < 0 \} = \dfrac{c_s - z_s}{a_{rs} }\]

注意,对偶单纯形是先确定出基变量,再入基,而单纯形法正相反!

这里通过 \(\theta\) 来保证每一次迭代后的\(b_i\) 都是大于等于0的,就像是单纯形法中,利用\(\theta\) 来保证每一次迭代后的检验数都是小于等于0的一样。

Tips

也就是无论怎么让基变量增大,都无法让\(x_r\)转换成非负,此时原问题一定找不到可行解,对偶问题目标函数值无界; \(\theta\),通过这个\(\theta\),保证每次迭代后都是\(\leq 0\)的。

  • 由弱对偶性,对偶问题有可行解,那么原问题可能有可行解也可能无解;

    • 对新的基检查是否所有\(b_i \geq 0\)
    • 如果是,那么原问题有可行解,\(CX = Y^{T}b\),原问题和对偶问题均取到最优解;
    • 如果不是,先检查一下\(b_r\)对应的所有的\(a_{rj}\),如果满足对任意\(a_{rj}\) 都有 \(a_{rj} \geq 0\),那么线性规划问题没有可行解(因为\(b\)要从负数变成正,变号);否则将选中变量当作入基变量,继续迭代;
  • 继续迭代。直到满足条件或者终止。

例题⚓︎

面对下面这个模型:

\[\min \hspace{4pt} 2x_1 + 3x_2 + 4x_3\]
\[\text{s.t.} \left\{ \begin{aligned} x_1 + 2x_2 + x_3  & \geq 3 \\  2x_1 + x_2 + 3x_3 &  \geq 4 \\ x_1, x_2, x_3 \geq 0  \end{aligned} \right.\]
  • 习惯性地,可以把它转化成求最大值问题的标准形式:
\[\max \hspace{4pt} -2x_1 - 3x_2 - 4x_3 \textcolor{red}{+ 0 x_4 + 0x_5}\]
\[\text{s.t.} \left\{ \begin{aligned} x_1 + 2x_2 + x_3 - & x_4 & & = 3 \\  2x_1 + x_2 + 3x_3 & & - x_5 &  = 4 \\ x_1, x_2, x_3, x_4, x_5 \geq 0  \end{aligned} \right.\]
  • 因为对偶单纯形法右端项\(\textbf{b}\)是可以为负的,所以我们统一把所有“ \(\geq\) ”的约束两边全部乘 \(- 1\) 变号成 “\(\leq\)” 。这样可以保证添加的虚拟变量都是松弛变量(系数为1,可以形成一个单位阵)。
  • 按照上面的思路,我们的模型转化后格式就成了:
\[\max \hspace{4pt} -2x_1 - 3x_2 - 4x_3 \textcolor{red}{+ 0 x_4 + 0x_5}\]
\[\text{s.t.} \left\{ \begin{aligned} -x_1 - 2x_2 - x_3 + & x_4 & & = -3 \\  -2x_1 - x_2 - 3x_3 & & + x_5 &  = -4 \\ x_1, x_2, x_3, x_4, x_5 \geq 0  \end{aligned} \right.\]
  • 和一般的单纯形不同,我们首先不看检验数,而是先看\(\textbf{b}\)那一列。首先找找这一列,所有小于 \(0\)\(b\) 里面,哪个 \(b\) 最小,算下来在下表中也就是 \(x_5\) 对应的行\((-4 < -3)\)。我们就锁定这一行。
  • 紧接着,我们只看这一行所有\(<0\)的系数用这些系数下面对应的检验数\(\sigma_i\) (也就是标蓝的数字)去除以这个系数,除下来数值最小的那个数字对应的变量就是我们要“入”的基。比如图一里,\(x_1, x_3\) 列满足要求,\(x_1\) 列运算结果是\((-2) \div (-2) = 1\)\(x_3\) 列结果是\((-4) \div (-3) = 4/3\)。毫无疑问前者更小,所以我们也确定了选择\(x_1\)入基。
\[\def\arraystretch{1.5}
   \begin{array}{c|c|c|c|c|c|c|c}
   \hline
   \hline
   & & & -2 & -3 & -4 & 0 & 0  \cr \hline
   \textbf{c}_{\textbf{B}} & \textbf{x}_{\textbf{B}} & \textbf{b} & x_1 & x_2 & x_3 & x_4 & x_5 \cr \hline
   0 & x_4 & \textcolor{red}{-3} & -1 & -2 & -1 & 1 & 0  \cr \hline
   0 & x_5 & \textcolor{red}{-4}  & \textcolor{green}{[-2 ]} & 1 & \textcolor{green}{-3} & 0 & 1  \cr \hline
    &  &  & \textcolor{blue}{-2} & -3 & \textcolor{blue}{-4} & 0 & 0  \cr \hline
    \hline
\end{array}\]
  • 上述一通操作最终的结果是确定了换入的基和换出的基(也就是\(x_5\)\(x_1\)。接下来运用单纯形法里的“换基”操作进行变换。你可以参考我的运筹学第一篇笔记。如果你熟悉修正单纯形法,你可以直接利用矩阵行变换完成这一操作。
  • 变化后的单纯形表如下图所示。此时你发现 \(\textbf{b}\) 仍然有负数。继续去重复第一次迭代的步骤(确认换入的基),然后进行换基操作。所有需要比较的元素我用相同颜色标记好了。我们发现\(-4 \div (-5/2) = 8/5\),小于\(-1 / (-1/2) = 2\)。所以把\(x_2\)换入。
\[\def\arraystretch{1.5}
   \begin{array}{c|c|c|c|c|c|c|c}
   \hline
   \hline
   & & & -2 & -3 & -4 & 0 & 0  \cr \hline
   \textbf{c}_{\textbf{B}} & \textbf{x}_{\textbf{B}} & \textbf{b} & x_1 & x_2 & x_3 & x_4 & x_5 \cr \hline
   0 & x_4 & \textcolor{red}{-1} & 0 & \textcolor{green}{[-5/2]} & 1/2 & 1 & \textcolor{green}{-1/2}  \cr \hline
   -2 & x_1 & 2  & 1 & -1/2 & 3/2 & 0 & -1/2  \cr \hline
    &  &  & 0 & \textcolor{blue}{-4} & -1 & 0 & \textcolor{blue}{-1}  \cr \hline
    \hline
\end{array}\]
  • 对上面的表换基后,新的表如下图所示。此时欣喜地发现,所有的\(b\) 都是正的了,同时所有的检验数依然保持不为正。意味着我们当前状态的表,既满足了最优,又满足了可行性。这个表就是最终的结果。我们的最优解是\((\dfrac{11}{5}, \dfrac{2}{5}, 0)\)。目标函数\(\dfrac{28}{5}\) .
\[\def\arraystretch{1.5}
   \begin{array}{c|c|c|c|c|c|c|c}
   \hline
   \hline
   & & & -2 & -3 & -4 & 0 & 0  \cr \hline
   \textbf{c}_{\textbf{B}} & \textbf{x}_{\textbf{B}} & \textbf{b} & x_1 & x_2 & x_3 & x_4 & x_5 \cr \hline
   -3 & x_2 & 2/5 & 0  & 1 & -1/5 & -2/5 & 1/5  \cr \hline
   -2 & x_1 & 11/5  & 1 & 0 & 7/5 & -1/5 & -2/5  \cr \hline
    &  &  & 0 & 0 & -9/5 & -8/5 & -1/5  \cr \hline
    \hline
\end{array}\]

什么时候使用对偶单纯形方法⚓︎

一个比较经典的例子是,当对偶问题的基本可行解已经求好的时候。比如对某个线性规划问题,我们求得了最优基,希望求解同样的问题在不同的右端向量下的解。此时,原问题的最优基在新的 \(\bold{b}\) 下可能是原始不可行的,不过,由于 \(\bold{b}\) 的取值不影响检验数,这意味着我们即使换了一个 \(\bold{b}\),解依然是对偶可行的。所以,与其从零开始,把右端项代入用单纯形法,不如直接把原最优解作为对偶单纯形开始迭代的最优基,从而计算。

来源: Bertsimas “Introduction to Linear Optimization” P156