线性规划入门

最近好像没怎么动这个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]取小数呢?

因为那个线性规划跟费用流是等价的,所以只要证明费用流是正确的就行了,而我们有强大的整流定理,因此原问题与这个线性规划是等价的.

再说了,就算整不出证明又有什么关系?你总不会真的写一个线性规划吧?很多时候,我们都可以假设线性规划的最优解是整数,反正只是分析一下的啵,没证明又不会扣分= =

按理说扯到这里就要讲一下线性规划的对偶了,不过这个东西比较麻烦,已经不能算作入门的东西了,鉴于这篇文章的目的是入门,所以就不写了.哪天有兴趣再写吧.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值