线性规划是什么
我想这个问题高中课本也给出了比较详细的定义了
用向量来解释的话就是构造一个n维向量x,满足
其中c是给出的n维向量,A是n*m的矩阵,B是m维向量
这是线性规划的标准型
我们可以知道,任意一个线性规划都是可以转化为标准型的
对于目标值取min的我们可以取反之后取max
对于
Aix≥Bi
的我们可以变成
−Aix≤−Bi
对于无限制的x我们可以拆成x=x0-x1,然后
x0≥0,x1≥0
松弛型/约束型
松弛型也就是存在i,使得
Aix≤Bi
,而不是一定要等于
约束型同理
那么我们可以通过添加基本变量
xn+i
来把松弛型线性规划转化成约束型
∑nj=1Ai,jxj≤Bi
变成
xn+i=Bi−∑nj=1Ai,jxj,xn+i≥0
单纯形
如果我们用向量来理解线性规划的话,我们会发现
每个约束定义了n维空间中的一个半空间(超平面),交集形成的可行域是一个凸区域称为单纯型
目标函数是一个超平面,最优解在凸区域顶点处取得
也就是说我们需要找到每一个凸区域的顶点,然后更新答案
定义基本解为所有非基本变量为0的解
基本可行解为所有
Bi≥0
的解
我们可以构造出一组基本可行解,然后我们需要沿着凸区域的边来转移到下一个顶点
这就是转轴操作(pviot)
转轴操作的基本思想就是交换一个基本变量和非基本变量,从而使答案更优
具体来说我们选择一个
ce≥0
的非基本变量e,再选择一个
blal,e
最小且
al,e≥0
的l,交换
xn+l
和
xe
为什么要比值最小?
因为要一步步来,不能贪心。
为了防止循环,根据Bland规则,选择下标最小的变量。
当我们找不到合法的e的时候算法就结束了。
如果我们找到合法的e但找不到合法的l,那么证明对于任意的M,都存在一组解使得目标的值大于M
但是我们会发现,这样做的基础是满足
Bi≥0
如果不满足呢?
那么我们就需要一个初始化
初始化
正规的初始化是引进一个辅助线性规划,增加一个变量x0,目标是最大化-x0
然而为了方便,许多dalao们用的都是随机初始化的黑科技
也就是每次随机一个
Bl<0
,再随机一个
Al,e<0
,然后pivot(l,e)
这样随机完之后就能保证所有的
Bi≥0
了
如果找得到l但找不到e说明该线性规划无解
应用
待UPD,博主最近要中考,考完有时间再写吧