用途:
解线性规划问题。
什么是线性规划?
一般式:
求解一个max(c[1]*x[1]+c[2]*x[2]+……+c[n]*x[n]),其中c为给定系数,x为一组解,并有约束
a[i][1]*x[1]+a[i][2]*x[2]+……+a[i][n]*x[n]<=b[i]
(1<=i<=m)
且x[j]>=0 (1<=j<=n)
可以把a看作一个像高斯消去法的矩阵。
标准式:
a[i][1]*x[1]+a[i][2]*x[2]+……+a[i][n]*x[n]=b[i]
(1<=i<=m)
且x[j]>=0 (1<=j<=n)
求max(c[1]*x[1]+c[2]*x[2]+……+c[n]*x[n])
注意:仅仅把大于等于变为等于,怎么变?加一个系数。
举个例子:
约束:
x+y<=4
x+3y<=6
x>=0 y>=0
求max(3x+5y)
那我们可以变为
x+y+u=4
x+3y+v=6
x,y,u,v>=0
求max(3x+5y+0u+0v)
如果是大于等于,可以改写为减去一个u,v,且u,v>=0.
假设x没有x>=0的约束,可以改写成x=x’-x”,其中x’,x”>=0.
这样就转化成了标准式。当然不可能仅是大于或小于,这样则不存在最大值。
如果求最小值显然可以把每个系数取反,求的解后把结果反过来。
解的范围:
显然,如果是二维的,我们可以建立直角坐标系,我们只考虑小于的情况,那么,一个解的范围为直角坐标系的坐标轴,与直线围成的一定的范围。这个不想多解释。对于上述例子来说,解在(0,0),(0,2),(3,1),(4,0)顺序围成的一个凸四边行中。显然不可能总是四边形,但是这个多边形满足两个性质。
性质一:这个多边形一定是凸多边形。
性质二:我们的答案总在极点上。
多维依然有该性质。
那么相当于枚举每个极点,暴力求解。我们可以先取一个基点,就是凸多边形上的任意一个点,很显然可以取(0,0,4,6),这个组为标准式的解,其实质为x=0,y=0的解。然后判断相邻的两个点(0,2)或者(4,0),然后判断判断答案是否能增加,如果一个点比相邻两个点都大,这个点就是解,其实与暴力区别不大,后面说的单纯形法其实就是在换点。而主要是列出一个单纯形表,以及在表示进行一系列的操作,
我们的代码也就是在模拟这些操作。
真的有点多,打字贼慢,还有去玩,未完待续……
相关资料:
算法设计与分析基础 清华大学出版社 原著 (美)Anany Levitin
讲解:https://www.bilibili.com/video/av7847726/
相关题目:bzoj 1061