单纯形法与对偶定理

给自己挖坑

单纯形法

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

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

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

现在考虑怎么做这类问题

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

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

{x11x12x13x14...x1n+1x21x22x23x24...x2n+1x31x32x33x34...x3n+1x41x42x43x44...x4n+1...xm1xm2xm3xm4...xmn+1}ixi,n+1=bij=1nxi,jai,jxi,kxi,k=xi,n+1+j != kxi,jai,jbiai,kxi,n+1+j != kxi,jai,jbiai,kvalk

这样可以吧xi,n+1的值给去xi,k,这样的操作叫做转轴

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

有一个例题吧

很容易列出线性规划式子

{max:c1x1+c2x2+...+cnxna11x1+a12x2+...+a1nxn<=b1..am1x1+am2x2+...+amnxn<=bm

就是一个板子题

#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));	
	}
}

对偶定理

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

{max:c1x1+c2x2+...+cnxna11x1+a12x2+...+a1nxn<=b1..am1x1+am2x2+...+amnxn<=bmxi>=0

其系数矩阵为

[a11a12...a1na21a22...a2na31a32...a3n..am1am2...amn]

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

[a11a12...a1na21a22...a2na31a32...a3n..am1am2...amn]T:[a11a21...am1a12a22...am2a13a32...am3..a1na2n...anm]

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

{max:b1y1+b2y2+...+bmyma11x1+a21x2+...+am1xn<=c1..a1ny1+a2ny2+...+anmym<=cmyi>=0

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

不过还是应该列个表:

并且注意:

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

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

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

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

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

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

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

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


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

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



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

前40分可以直接dp掉

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


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


线性规划与博弈问题

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

之后的都挺不可做的吧

posted @   After_rain  阅读(375)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示