最近好像没怎么动这个blog了,不能这么堕落了...
也就是一时兴起想写一下,看不懂别怪我...
首先明确一下线性规划的定义,就是所有约束条件以及目标函数中未知数的次数都是1,因此线性规划的一个约束条件表示在n维空间上是"平"(自己意会一下吧)的.
接着,线性规划的可行域在n维空间上看起来是"凸"的(因为约束函数是"平"的),我们把这个东西叫做单纯形.
求解线性规划的算法,一般用单形法或者内点法,关于单形法的实现我之前已经搞了一篇文章了,总之实际应用起来还是很快的.
好像有一个叫"整流定理"的东西,说的是只要网路流的变容量都是整数,那么一定存在一个最优解使得所有边的容量是整数.所以网路流就可以palapala转成线性规划乱搞了.
但是我们平常见到的裸线性规划的题目好像不多,总不能用一个单形法来跑网路流吧,搞这个东西有什么用啊?
的确,我们平常几乎用不到单形法或内点法来解题,但是.很多图论模型可以用线性规划来刻画,很多特殊的线性规划也可以转化为图论模型.线性规划可以作为实际问题与图论模型的桥梁,对我们分析问题有着巨大的帮助.
还是先看一个例子吧,这道题是鬼子WC时YY的,虽然很简单,但还是可以想一下的.
[题目描述]
给你一个n*n的矩阵A,定义一个长度为n的排列B的权值为sigma(A[i,B[i]]).要你求出权值最大的排列.
因为目标函数里出现了数组的嵌套,所以我们把"排列"换个说法:在n*n的棋盘上放n个车,使他们互相之间不能攻击.
定义X[i,j]表示第i行第i个格子有没有放车(1表示放,0表示不放).原问题可以描述为:
Max sigma(A[i,j]*X[i,j])
s.t. sigma(X[i,j])=1,1<=j<=n,对所有的i
sigma(X[i,j])=1,1<=i<=n,对所有的j
这里有一个常量1,为了消除这个东西,我们把它换成另一种形式:
Max sigma(A[i,j]*X[i,j])
s.t. sigma(X[i,j])-F[i]=0 1<=j<=n,对所有的i
sigma(X[i,j])-G[j]=0 1<=i<=n 对所有的j
F[i]<=1,G[i]<=1
其中F[i]和j的取值为0或1.
这东西就是一个费用流的模型,我们对每行每列都建一个点,从源点向每行连一条流量为1,费用为0的边,从每列向汇点连一条流量为1,费用为0的边,从第i行向第i列连一条流量为1,费用为A[i,j]的边,跑一边最大费用最大流即可.
你可能会问:问什么原问题可以用那个线性规划来描述?如果X[i,j]取小数呢?
因为那个线性规划跟费用流是等价的,所以只要证明费用流是正确的就行了,而我们有强大的整流定理,因此原问题与这个线性规划是等价的.
再说了,就算整不出证明又有什么关系?你总不会真的写一个线性规划吧?很多时候,我们都可以假设线性规划的最优解是整数,反正只是分析一下的啵,没证明又不会扣分= =
按理说扯到这里就要讲一下线性规划的对偶了,不过这个东西比较麻烦,已经不能算作入门的东西了,鉴于这篇文章的目的是入门,所以就不写了.哪天有兴趣再写吧.