对偶问题及对偶单纯形法(完整)
- 格式:ppt
- 大小:2.18 MB
- 文档页数:61
应⽤运筹学基础:线性规划(4)-对偶与对偶单纯形法这⼀节课讲解了线性规划的对偶问题及其性质。
引⼊对偶问题考虑⼀个线性规划问题:$$\begin{matrix}\max\limits_x & 4x_1 + 3x_2 \\ \text{s.t.} & 2x_1 + 3x_2 \le 24 \\ & 5x_1 + 2x_2 \le 26 \\ & x \ge0\end{matrix}$$ 我们可以把这个问题看作⼀个⽣产模型:⼀份产品 A 可以获利 4 单位价格,⽣产⼀份需要 2 单位原料 C 和 5 单位原料 D;⼀份产品 B 可以获利 3 单位价格,⽣产⼀份需要 3 单位原料 C 和 2 单位原料 D。
现有 24 单位原料 C,26 单位原料 D,问如何分配⽣产⽅式才能让获利最⼤。
但假如现在我们不⽣产产品,⽽是要把原料都卖掉。
设 1 单位原料 C 的价格为 $y_1$,1 单位原料 D 的价格为 $y_2$,每种原料制定怎样的价格才合理呢?⾸先,原料的价格应该不低于产出的产品价格(不然还不如⾃⼰⽣产...),所以我们有如下限制:$$2y_1 + 5y_2 \ge 4 \\ 3y_1 + 2y_2 \ge3$$ 当然也不能漫天要价(也要保护消费者利益嘛- -),所以我们制定如下⽬标函数:$$\min_y \quad 24y_1 + 26y_2$$ 合起来就是下⾯这个线性规划问题:$$\begin{matrix} \min\limits_y & 24y_1 + 26y_2 \\ \text{s.t.} & 2y_1 + 5y_2 \ge 4 \\ & 3y_1 + 2y_2 \ge 3 \\ & y \ge 0\end{matrix}$$ 这个问题就是原问题的对偶问题。
对偶问题对于⼀个线性规划问题(称为原问题,primal,记为 P) $$\begin{matrix} \max\limits_x & c^Tx \\ \text{s.t.} & Ax \le b \\ & x \ge 0\end{matrix}$$ 我们定义它的对偶问题(dual,记为 D)为 $$\begin{matrix} \min\limits_x & b^Ty \\ \text{s.t.} & A^Ty \ge c \\ & y \ge 0\end{matrix}$$ 这⾥的对偶变量 $y$,可以看作是对原问题的每个限制,都⽤⼀个变量来表⽰。
1.对偶问题模型2.对偶例子,总结特点3.对偶的相关性质定理4.对偶单纯形法1.对偶问题模型例:某化工厂利用R1、R2、R3三种原料,生产Q1、Q2两种产品,生产每公斤产品所需的各单位原料、工厂所拥有的个资源最大量及每公斤产品销售利润如下表所示,问每天应生产多少公斤Q1、Q2才能使利润最大。
原料-产品-利润表设每天生产Q1、Q2的产品量为x1,x2,可得到约束方程Max s=0.7 x1 +1.2 x23x+ 10x2≤3004x1 + 5x2≤2009x1 + 4x2≤360x1≥0, x2≥0现在的问题是,如果另一个化工厂想全部购买该厂R1、R2、R3三种原料,那么该厂在什么条件下出售这三种原料,才能使该厂在经济收入上不低于用等量的三种原料生产Q1、Q2产品获得的最大利润。
设三种原料出售单价分别为u1, u2, u3, 可得到约束方程Min W= 300 u1 +200u2 +360 u3+4u2 +9 u3≥0.73 u10 u1 +5 u2 +9u3≥ 1.2u1≥0, u2≥0, u3≥0一半钱这问题成为L,后者为其对偶问题成为D比较两个线性规划模型,其特征有目标函数的要求上两者相反,s求max,w求min右端向量和目标函数的价值系数两者对调约束方程两者符号相反,s是“≤”,w是“≥”由s的约束方程书引入了同等数量的另一组非负变量u=( u1, u2, u3)T,且作为w的决策变量,约束方程数由m个变为n个2.对偶问题及其转化方对偶问题在理论和实践方面有着广泛的应用在某些情况下线性规划的对偶问题比原解问题更容易对偶变量对原问题的解提供了重要的经济意义在处理一般型初始模型时可以不引入人工变量而采用对偶单纯形法直接处理,减少计算量推证出若干重要性质和定理作为线性规划灵敏度分析的重要工具例:求下列线性规划的对偶问题:Max s= x1 +2 x2s.t. x1 -2x2≤2x1≤9-x1 + x2≤5x1≥0, x2≥0解:其对偶问题为:min w=2y1+9y2+5y3s.t. y1+y2-y3≥1-2y2+y3≥2y1≥0, y2≥0, y3≥0需要注意的是,如果原问题的目标函数为求极小,其目标函数的系数需要乘-1变成求极大,如果某些约束为“≥”,则这些约束需乘-1,变成“≤”,才能产生相应的对偶问题。
单纯形法与对偶定理单纯形法⼀般oi 中遇到的线性规划问题都长这样⽐如某⼀些⽹络流问题,以及⼆分图最⼤权匹配啥的,结合对偶定理,可以有很多很强的结论以及⼀个最⼩费⽤流的线性规划式⼦现在考虑怎么做这类问题不妨先引⼊⼀个基变量(松弛变量)⽐如说现在的系数矩阵是⽐如说现在的系数矩阵是x 11x 12x 13x 14...x 1n +1x 21x 22x 23x 24...x 2n +1x 31x 32x 33x 34...x 3n +1x 41x 42x 43x 44...x 4n +1...x m 1x m 2x m 3x m 4...x mn +1对于第i ⾏x i ,n +1=b i −n∑j =1x i ,j ∗a i ,j 不妨将第x i ,k 表⽰出来x i ,k =x i ,n +1+∑j != k x i ,j ∗a i ,j −b i−a i ,k给你要最⼤化的式⼦带来的价值是这样可以吧x i ,n +1的值给去x i ,k ,这样的操作叫做转轴之后就可以⽤这个过程来时⽬标函数有最⼤值有⼀个例题吧很容易列出线性规划式⼦max :c 1∗x 1+c 2∗x 2+...+c n ∗x n a 11∗x 1+a 12∗x 2+...+a 1n ∗x n <=b 1..a m 1∗x 1+a m 2∗x 2+...+a mn ∗x n <=b m就是⼀个板⼦题#include<bits/stdc++.h>#define MAXN 500#define eps 1e-7typedef double ll;const ll inf = 1e18;using namespace std;int n,m;ll a[MAXN][MAXN];int id[MAXN];void out(){for(int i = 1 ; i <= n ; i++)printf("%.2f " , a[0][i]); puts("");for(int i = 1 ; i <= m ; i++){ for(int j = 1 ; j <= n ; j++){ printf("%.2f " , a[i][j]); }printf("%.2f " , a[i][0]); puts(""); }}void plot(int x , int y){ swap(id[x + n] , id[y]);double t = a[x][y]; a[x][y] = 1;for(int j = 0 ; j <= n ; j++)a[x][j] /= t; for(int i = 0 ; i <= m ; i++){if(i == x || a[i][y] < eps)continue; t = a[i][y] , a[i][y] = 0;for(int j = 0 ; j <= n ; j++)a[i][j] -= a[x][j] * t; }}bool simplex(){for(int i = 1 ; i <= n ; i++)id[i] = i; int x = 0, y = 0; int cnt = 0; ll minl; while(1){x = y = 0 , minl = inf; cnt++;for(int i = 1 ; i <= n ; i++)if(a[0][i] > eps){x = i;break;} if(!x)break;for(int i = 1 ; i <= m ; i++)if(a[i][x] > eps && minl > a[i][0] / a[i][x])minl = a[i][0] / a[i][x] , y = i; if(!y) {puts("Unbounded"); return false;} plot(y , x); }return true;}int main(){while(scanf("%d%d",&n,&m) == 2){ memset(a , 0 ,sizeof(a));for(int i = 1 ; i <= n ; i++)cin>>a[0][i]; for(int i = 1 ; i <= m ; i++){for(int j = 1 ; j <= n ; j++)cin>>a[i][j]; cin>>a[i][0]; }simplex();printf("Nasa can spend %d taka.\n",(int)ceil(-a[0][0]*m)); }}对偶定理考虑⼀个基本的线性规划模型{}{max :c 1∗x 1+c 2∗x 2+...+c n ∗x n a 11∗x 1+a 12∗x 2+...+a 1n ∗x n <=b 1..a m 1∗x 1+a m 2∗x 2+...+a mn ∗x n <=b mx i >=0其系数矩阵为a 11a 12...a 1n a 21a 22...a 2n a 31a 32...a 3n..a m 1a m 2...a mn那么上⾯这个线性规划模型的对偶问题的系数矩阵为上述系数矩阵的转置矩阵a 11a 12...a 1n a 21a 22...a 2n a 31a 32...a 3n..a m 1a m 2...a mnT 即:a 11a 21...a m 1a 12a 22...a m 2a 13a 32...a m 3..a 1n a 2n ...a nm那么线性规划模型对偶过来就是max :b 1∗y 1+b 2∗y 2+...+b m ∗y m a 11∗x 1+a 21∗x 2+...+a m 1∗x n <=c 1..a 1n ∗y 1+a 2n ∗y 2+...+a nm ∗y m <=c my i >=0基本上⼤多数的线性规划模型都可以通过对x i 的转换化成标准形式不过还是应该列个表:并且注意:原问题有⽆界解等价于对偶问题⽆可⾏解但是对偶问题⽆可⾏解时,原问题可能为⽆界解或者⽆可⾏解线性规划在⽹络流中的应⽤全⼳模矩阵(任何⼀个⾏数列数相同的⼦矩阵的值都是+1/-1)有⼀个很好的性质,对于⼀个线性规划模型的系数矩阵是⼀个全⼳模矩阵,那么有每⼀个单纯形法的调整系数都应当为(-1,0,1)线性规划对偶性--->>可以通过很显然的式⼦推导推导出---->>(最⼤流 = 最⼩割)部分题⽬没有很显然的建图,⼀般是转线性规划,然后看⼀看是不是⼀个全⼳模矩阵,如果是,就可以使⽤⽹络流解决有⼀个可以判断是否是全⼳模矩阵的⽅法直接考虑差分,对于每⼀个约束 + 表⽰⼊,-表⽰出,直接建图,跑⼀个最⼩最⼩费⽤流就好了也可以直接对偶掉,做⼀个单纯形法线性规划与特殊的整数规划前40分可以直接dp 掉还有⼀道题Codeforces 375E,有O (n 3)的dp 做法,但是线性规划可以很快的做掉。