单纯形法与对偶定理


给自己挖坑

单纯形法

一般oi中遇到的线性规划问题都长这样

比如某一些网络流问题,以及二分图最大权匹配啥的,结合对偶定理,可以有很多很强的结论

以及一个最小费用流的线性规划式子

现在考虑怎么做这类问题

不妨先引入一个基变量(松弛变量)

比如说现在的系数矩阵是
比如说现在的系数矩阵是

\[\left\{ \begin{matrix} x_{11} & x_{12} & x_{13} & x_{14} & ... &x_{1n + 1}\\ x_{21} & x_{22} & x_{23} & x_{24} & ... &x_{2n + 1}\\ x_{31} & x_{32} & x_{33} & x_{34} & ... &x_{3n + 1}\\ x_{41} & x_{42} & x_{43} & x_{44} & ... &x_{4n + 1}\\ . ..\\ x_{m1} & x_{m2} & x_{m3} & x_{m4} & ... &x_{mn + 1}\\ \end{matrix} \right\}\\ 对于第i行\\ x_{i,n+1} = b_i - \sum_{j = 1}^nx_{i , j} * a_{i , j}\\ 不妨将第x_{i , k}表示出来\\ x_{i , k} = \frac{x_{i , n + 1} + \sum_{j\ !=\ k}x_{i , j} * a_{i , j} - b_i}{-a_{i , k}}\\ 给你要最大化的式子带来的价值是\\ \frac{x_{i , n + 1} + \sum_{j\ !=\ k}x_{i , j} * a_{i , j} - b_i}{-a_{i , k}} * val_k\\ \]

这样可以吧\(x_{i , n + 1}\)的值给去\(x_{i , k}\),这样的操作叫做转轴

之后就可以用这个过程来时目标函数有最大值

有一个例题吧

很容易列出线性规划式子

\[\left\{ \begin{matrix} 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_{m1} * x_1 + a_{m2} * x_2 + ... + a_{mn} * x_n <= b_m\\ \end{matrix} \right. \]

就是一个板子题

#include<bits/stdc++.h>
#define MAXN 500
#define eps 1e-7
typedef 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));	
	}
}

对偶定理

考虑一个基本的线性规划模型

\[\left\{ \begin{matrix} 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_{m1} * x_1 + a_{m2} * x_2 + ... + a_{mn} * x_n <= b_m\\ x_i >= 0 \end{matrix} \right. \]

其系数矩阵为

\[\left[ \begin{matrix} a_{11} & a_{12} & ... & a_{1n}\\ a_{21} & a_{22} & ... & a_{2n}\\ a_{31} & a_{32} & ... & a_{3n}\\ .\\ .\\ a_{m1} & a_{m2} & ... & a_{mn}\\ \end{matrix} \right] \]

那么上面这个线性规划模型的对偶问题的系数矩阵为上述系数矩阵的转置矩阵

\[\left[ \begin{matrix} a_{11} & a_{12} & ... & a_{1n}\\ a_{21} & a_{22} & ... & a_{2n}\\ a_{31} & a_{32} & ... & a_{3n}\\ .\\ .\\ a_{m1} & a_{m2} & ... & a_{mn}\\ \end{matrix} \right] ^ T\\即: \\ \left[ \begin{matrix} a_{11} & a_{21} & ... & a_{m1}\\ a_{12} & a_{22} & ... & a_{m2}\\ a_{13} & a_{32} & ... & a_{m3}\\ .\\ .\\ a_{1n} & a_{2n} & ... & a_{nm}\\ \end{matrix} \right]\\ \]

那么线性规划模型对偶过来就是

\[\left\{ \begin{matrix} max:b_1 * y_1 + b_2 * y_2 + ... + b_m *y_m\\ a_{11} * x_1 + a_{21} * x_2 + ... + a_{m1} * x_n <= c_1\\ .\\ .\\ a_{1n} * y_1 + a_{2n} * y_2 + ... + a_{nm} * y_m <= c_m\\ y_i >= 0 \end{matrix} \right. \]

基本上大多数的线性规划模型都可以通过对\(x_i\)的转换化成标准形式

不过还是应该列个表:

并且注意:

原问题有无界解等价于对偶问题无可行解

但是对偶问题无可行解时,原问题可能为无界解或者无可行解

线性规划在网络流中的应用

全幺模矩阵(任何一个行数列数相同的子矩阵的值都是+1/-1)

有一个很好的性质,对于一个线性规划模型的系数矩阵是一个全幺模矩阵,那么有每一个单纯形法的调整系数都应当为(-1,0,1)

线性规划对偶性--->>可以通过很显然的式子推导推导出---->>(最大流 = 最小割)

部分题目没有很显然的建图,一般是转线性规划,然后看一看是不是一个全幺模矩阵,如果是,就可以使用网络流解决

有一个可以判断是否是全幺模矩阵的方法


直接考虑差分,对于每一个约束 + 表示入,-表示出,直接建图,跑一个最小最小费用流就好了

也可以直接对偶掉,做一个单纯形法



线性规划与特殊的整数规划

前40分可以直接dp掉

还有一道题Codeforces 375E,有\(O(n^3)\)的dp做法,但是线性规划可以很快的做掉。。。


感觉对于这种约束很多的题,是一个不二的骗分通解


线性规划与博弈问题

纳什均衡:没有人可以通过该表自己的决策得到更多的利益

之后的都挺不可做的吧


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM