IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数学】整数线性规划问题与对偶单纯形法 -> 正文阅读

[数据结构与算法]【数学】整数线性规划问题与对偶单纯形法

我们此前探讨过了一般的单纯形法(传送门),这次则来研究所谓“对偶单纯形法”。

线性规划的对偶问题

原始的线性规划问题:
max ? c T x \max c^T x maxcTx
A x ≤ b Ax \leq b Axb
x ≥ 0 x \geq 0 x0

它的对偶问题:
min ? b T y \min b^Ty minbTy
A T y ≥ c A^Ty \geq c ATyc
y ≥ 0 y \geq 0 y0

容易看出,对偶的对偶就是它自身。

定理1 c T x ≤ ( A T y ) T x = y T ( A x ) ≤ y T c = c T y c^T x \leq (A^Ty)^T x=y^T(Ax)\leq y^Tc=c^Ty cTx(ATy)Tx=yT(Ax)yTc=cTy

定理2:若原始问题有一组可行解 x x x,对偶问题有一组可行解 y y y,且 c T x = b T y c^Tx=b^Ty cTx=bTy,则两个解分别是它们的最优解。(由定理1确定的上下界知,显然)

定理3:若原问题有最优解,则对偶问题有最优解。
证明:
先按照单纯形的流程做一下,在原问题引入松弛变量 u u u后转化为 A x + E u = b Ax+Eu=b Ax+Eu=b。我们找到了一组基本最优解,基向量为 x B = B ? 1 b x_B=B^{-1}b xB?=B?1b
还记得最优解的条件码?对,检验数。由于这个原问题是最大化问题,所以检验数此时应该全部小于等于0。
还记得检验数的公式吗? λ T = c T ? c B T B ? 1 A \lambda^T=c^T-c_B^TB^{-1}A λT=cT?cBT?B?1A,不过由于我们加了变量没有扩展 A A A,所以松弛变量 u u u这一块要额外考虑考虑。考虑的结果就是:
λ T = ( c T ? c B T B ? 1 A , ? c B T B ? 1 E ) \lambda^T = (c^T-c_B^TB^{-1}A, -c_B^TB^{-1}E) λT=(cT?cBT?B?1A,?cBT?B?1E)
因此 c T ? c B T B ? 1 A ≤ 0 c^T-c_B^TB^{-1}A \leq 0 cT?cBT?B?1A0 c T ≤ c B T B ? 1 A c^T \leq c_B^TB^{-1}A cTcBT?B?1A。两边同时取反一下得: c ≤ A T ( ( B ? 1 ) T c B ) c \leq A^T((B^{-1})^Tc_B) cAT((B?1)TcB?)
对比一下对偶问题的条件 A T y ≥ c A^Ty \geq c ATyc,发现 y = ( B ? 1 ) T c B y=(B^{-1})^Tc_B y=(B?1)TcB?是一组可行解。
y T b = c B T B ? 1 b = c B T x B y^Tb=c_B^TB^{-1}b=c_B^Tx_B yTb=cBT?B?1b=cBT?xB?,即 b T y = c T x b^Ty=c^Tx bTy=cTx,根据定理2, y y y是最优解。

对偶单纯形法

由以上证明过程可以看出,如果认为 y T = c B B ? 1 y^T=c_BB^{-1} yT=cB?B?1,对偶问题的一组可行解,能够保证原问题 λ ≥ 0 \lambda \geq 0 λ0,虽然此时它不一定是原问题的可行解。我们定义这样的解叫做正则解

普通的单纯形法,是可行解保证了可行性后,我们再将其逐步变为正则解保证最优性。

交换后,要让 λ j ′ = λ j ? λ k α l j / α l k ≥ 0 \lambda_j' = \lambda_j-\lambda_k \alpha_{lj}/\alpha_{lk} \geq 0 λj?=λj??λk?αlj?/αlk?0,即正则性依然成立。

α l j ≥ 0 \alpha_{lj} \geq 0 αlj?0等式自然成立,则只需要对于 α l j < 0 \alpha_{lj} < 0 αlj?<0的,有 λ j α l j ≤ λ k α l k \frac{\lambda_j}{\alpha_{lj}} \leq \frac{\lambda_k}{\alpha_{lk}} αlj?λj??αlk?λk??即可。

故对偶单纯形法的流程如下:

  1. 先找到正则解和正则基
  2. 判断 β = B ? 1 b ≥ 0 \beta=B^{-1}b \geq 0 β=B?1b0是否成立,也就是是否可行。若可行则结束。
  3. 否则取 β l < 0 \beta_l < 0 βl?<0,若 α i j ≥ 0 \alpha_{ij} \geq 0 αij?0则无可行解。
  4. 否则找 λ k α l k = max ? { λ j α l j ∣ α l j < 0 } \frac{\lambda_k}{\alpha_{lk}}=\max\{\frac{\lambda_j}{\alpha_{lj}} |\alpha_{lj} < 0\} αlk?λk??=max{αlj?λj??αlj?<0} x k x_k xk? x π ( l ) x_{\pi(l)} xπ(l)?交换做基变换。
  5. 重复2

整数线性规划问题

你可能要问,既然我们已经有了普通的单纯形算法,为什么需要对偶单纯形算法?这就要提整数线性规划问题了。

整数线性规划问题,指的是添加了条件“变量必须是整数”的线性规划问题,视具体的约束条件不同,又分了很多种,就不细说了。

算分书中的例题:

min ? z = ? 3 x ? 5 y \min z = -3x-5y minz=?3x?5y
? x + y ≤ 1.5 -x+y \leq 1.5 ?x+y1.5
2 x + 3 y ≤ 11 2x+3y \leq 11 2x+3y11
x , y ≥ 0 x,y \geq 0 x,y0且它们都是整数。

同样,本文不作数学证明,只说解法:

先去掉整数条件,做线性规划求最优解。比方说例题,两个条件添加松弛变量 u 1 u_1 u1? u 2 u_2 u2?,去掉整数条件做完单纯形算法,最终单纯形表如下:

? 3 ? 5 0 0 \begin{matrix}-3 & -5 & 0& 0 \end{matrix} ?3??5?0?0?
c B c_B cB? x B x_B xB? b b b x y u 1 u 2 \begin{matrix}x & y & u_1& u_2 \end{matrix} x?y?u1??u2??
? 5 ? 3 \begin{matrix}-5 \\ -3 \end{matrix} ?5?3? y x \begin{matrix}y \\ x \end{matrix} yx? 2.8 1.3 \begin{matrix}2.8 \\ 1.3 \end{matrix} 2.81.3? 0 1 0.4 0.2 1 0 ? 0.6 0.2 \begin{matrix}0 & 1 & 0.4 & 0.2\\ 1& 0 & -0.6& 0.2\end{matrix} 01?10?0.4?0.6?0.20.2?
? z -z ?z 17.9 17.9 17.9 0 0 0.2 1.6 \begin{matrix}0 & 0& 0.2 & 1.6 \end{matrix} 0?0?0.2?1.6?

如果解都是整数,很好。但是我们得到的 x = 1.3 , y = 2.8 x=1.3, y=2.8 x=1.3,y=2.8,解都不是整数!所以我们得继续。

有若干变量不是整数,任选一个,比如 x i = s x_i=s xi?=s,将这个问题分裂成两个子问题,分别添加条件 x i ≤ ? s ? x_i \leq \lfloor s \rfloor xi??s? x i ≥ ? s ? x_i \geq \lceil s \rceil xi??s?两个条件,分别求解。然后选择得到的最优解值更优的,再继续重复分裂,直到所有解都变成整数为止。

一个 x i ≤ a x_i \leq a xi?a的条件相当于 x i + u = a x_i + u =a xi?+u=a
一个 x i ≥ a x_i \geq a xi?a的条件相当于 ? x i + u = a -x_i +u=a ?xi?+u=a

比方说例题,我们先来解决添加了 x ≤ 1 x \leq 1 x1条件的子问题吧。

我们需要给 A A A添加一行(一个新条件)和一列(一个新变量u),并且基变量也要增加一个 u u u

? 3 ? 5 0 0 0 \begin{matrix}-3 & -5 & 0& 0 & 0 \end{matrix} ?3??5?0?0?0?
c B c_B cB? x B x_B xB? b b b x y u 1 u 2 u \begin{matrix}x & y & u_1& u_2 & u \end{matrix} x?y?u1??u2??u?
? 5 ? 3 0 \begin{matrix}-5 \\ -3 \\ 0 \end{matrix} ?5?30? y x u \begin{matrix}y \\ x \\ u \end{matrix} yxu? 2.8 1.3 1 \begin{matrix}2.8 \\ 1.3 \\ 1 \end{matrix} 2.81.31? 0 1 0.4 0.2 0 1 0 ? 0.6 0.2 0 1 0 0 0 1 \begin{matrix}0 & 1 & 0.4 & 0.2 & 0\\ 1& 0 & -0.6& 0.2 & 0 \\ 1 & 0 & 0 & 0 & 1\end{matrix} 011?100?0.4?0.60?0.20.20?001?
? z -z ?z 17.9 17.9 17.9 0 0 0.2 1.6 0 \begin{matrix}0 & 0& 0.2 & 1.6 & 0 \end{matrix} 0?0?0.2?1.6?0?

而由于 x x x已经是一个基变量的,所以应该把 u u u这一行的那个1给消掉(严格证明略,即我不会),也就是说要这样:

? 3 ? 5 0 0 0 \begin{matrix}-3 & -5 & 0& 0 & 0 \end{matrix} ?3??5?0?0?0?
c B c_B cB? x B x_B xB? b b b x y u 1 u 2 u \begin{matrix}x & y & u_1& u_2 & u \end{matrix} x?y?u1??u2??u?
? 5 ? 3 0 \begin{matrix}-5 \\ -3 \\ 0 \end{matrix} ?5?30? y x u \begin{matrix}y \\ x \\ u \end{matrix} yxu? 2.8 1.3 ? 0.3 \begin{matrix}2.8 \\ 1.3 \\ -0.3 \end{matrix} 2.81.3?0.3? 0 1 0.4 0.2 0 1 0 ? 0.6 0.2 0 0 0 0.6 ? 0.2 1 \begin{matrix}0 & 1 & 0.4 & 0.2 & 0\\ 1& 0 & -0.6& 0.2 & 0 \\ 0 & 0 & 0.6 & -0.2 & 1\end{matrix} 010?100?0.4?0.60.6?0.20.2?0.2?001?
? z -z ?z 17.9 17.9 17.9 0 0 0.2 1.6 0 \begin{matrix}0 & 0& 0.2 & 1.6 & 0 \end{matrix} 0?0?0.2?1.6?0?

可以看到,现在 u ≥ 0 u \geq 0 u0的条件并没有满足,但 λ ≥ 0 \lambda \geq 0 λ0的条件还是满足的,也就是说这是一组基本正则解。

所以此时应用对偶单纯形算法,就可以继续求解了。

此时我们把 θ \theta θ写最上面,值为 ∣ λ j α l j ∣ |\frac{\lambda_j}{\alpha_{lj}} | αlj?λj??,其中这个 l = 3 l=3 l=3

θ \theta θ ? ? ? ? 8 ? \begin{matrix}- & - & -& -8 & -\end{matrix} ???????8???
c B c_B cB? x B x_B xB? b b b x y u 1 u 2 u \begin{matrix}x & y & u_1& u_2 & u\end{matrix} x?y?u1??u2??u?
? 5 ? 3 0 \begin{matrix}-5 \\ -3 \\ 0 \end{matrix} ?5?30? y x u \begin{matrix}y \\ x \\ u \end{matrix} yxu? 2.8 1.3 ? 0.3 \begin{matrix}2.8 \\ 1.3 \\ -0.3 \end{matrix} 2.81.3?0.3? 0 1 0.4 0.2 0 1 0 ? 0.6 0.2 0 0 0 0.6 ? 0.2 1 \begin{matrix}0 & 1 & 0.4 & 0.2 & 0\\ 1& 0 & -0.6& 0.2 & 0 \\ 0 & 0 & 0.6 & -0.2 & 1\end{matrix} 010?100?0.4?0.60.6?0.20.2?0.2?001?
? z -z ?z 17.9 17.9 17.9 0 0 0.2 1.6 0 \begin{matrix}0 & 0& 0.2 & 1.6 & 0 \end{matrix} 0?0?0.2?1.6?0?

α l j ≥ 0 \alpha_{lj}\geq0 αlj?0,那这一列就直接忽略,所以只有 u 2 u_2 u2?是我们心仪的换入变量。将其换入,消元如出一辙,将第3行第4列消成1,其他行第4列都消成0:

c B c_B cB? x B x_B xB? b b b x y u 1 u 2 u \begin{matrix}x & y & u_1& u_2 & u\end{matrix} x?y?u1??u2??u?
? 5 ? 3 0 \begin{matrix}-5 \\ -3 \\ 0 \end{matrix} ?5?30? y x u 2 \begin{matrix}y \\ x \\ u_2 \end{matrix} yxu2?? 2.5 1 1.5 \begin{matrix}2.5 \\ 1 \\ 1.5 \end{matrix} 2.511.5? 0 1 1 0 1 1 0 0 0 1 0 0 ? 3 1 ? 5 \begin{matrix}0 & 1 & 1 & 0 & 1\\ 1& 0 & 0& 0 & 1 \\ 0 & 0 & -3 & 1 & -5\end{matrix} 010?100?10?3?001?11?5?
? z -z ?z 15.5 15.5 15.5 0 0 5 0 0 \begin{matrix}0 & 0& 5& 0& 0 \end{matrix} 0?0?5?0?0?

可喜可贺可喜可贺。加 x ≥ 1 x \geq 1 x1的子问题也类似,我也没有算,按算分书的说法,那个子问题的解更优,应该从它开始继续分裂。要分好几次才能找到最优解 x = 4 , y = 1 , z = ? 17 x=4,y=1,z=-17 x=4,y=1,z=?17

这个算法被称为分支限界算法

总结

讨论了线性规划的对偶单纯形法,以及它在整数线性规划问题中的应用。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:36:03  更:2022-04-04 12:40:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:02:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码