单纯形
一般形式
单纯形有如下形式:
max
∑
i
=
1
n
a
i
x
i
∀
1
≤
i
≤
m
,
∑
j
=
1
n
b
i
,
j
x
j
≤
c
i
∀
1
≤
i
≤
n
,
x
i
≥
0
\max \sum_{i=1}^{n} a_ix_i\\ \forall 1\le i\le m,\sum_{j=1}^{n}b_{i,j}x_j\le c_i\\ \forall 1\le i\le n,x_i \ge 0
maxi=1∑naixi∀1≤i≤m,j=1∑nbi,jxj≤ci∀1≤i≤n,xi≥0
不妨引入
m
m
m个变量
x
n
+
1
,
…
,
x
n
+
m
x_{n+1},\dots,x_{n+m}
xn+1,…,xn+m来完成第二个限制,于是变成:
max
∑
i
=
1
n
a
i
x
i
∀
1
≤
i
≤
m
,
x
n
+
i
=
c
i
−
∑
j
=
1
n
b
i
,
j
x
j
∀
1
≤
i
≤
n
+
m
,
x
i
≥
0
\max \sum_{i=1}^{n} a_ix_i\\ \forall 1\le i\le m,x_{n+i}=c_i-\sum_{j=1}^{n}b_{i,j}x_j\\ \forall 1\le i\le n+m,x_i \ge 0
maxi=1∑naixi∀1≤i≤m,xn+i=ci−j=1∑nbi,jxj∀1≤i≤n+m,xi≥0
基本思想
定义 max \max max后面的那 n n n个 x i x_i xi叫做非基变量,用于表示限制的 m m m个 x n + i x_{n+i} xn+i叫做基变量。我们发现,其实基变量和非基变量之间是可以互相替换的,定义一个过程 pivot ( N , B ) \text{pivot}(N,B) pivot(N,B)表示将非基变量 x N x_N xN和基变量 x B x_B xB互相替换,可以理解为把下面的方程变形,用 x B x_B xB表示 x N x_N xN,然后把每一条方程以及 max \max max中的 x N x_N xN带入替换,这样 x B , x N x_B,x_N xB,xN就交换了身份,当然 max \max max中可能会出现常数,不过可以直接提出,这样还是满足那个形式。
这么做的目的是想让所有的 a i ≤ 0 a_i\le0 ai≤0,且所有的 c i ≥ 0 c_i\ge 0 ci≥0,这样所有的 x i = 0 x_i=0 xi=0就是最优解了。
关于
pivot
\text{pivot}
pivot,如下:
pivot(N,B)
:
x
N
=
c
B
−
∑
j
=
1
∧
j
≠
N
n
b
B
,
j
x
j
−
x
B
b
B
,
N
\text{pivot(N,B)}:x_N=\frac{c_B-\sum_{j=1 \land j\not =N}^{n}b_{B,j}x_j-x_B}{b_{B,N}}
pivot(N,B):xN=bB,NcB−∑j=1∧j=NnbB,jxj−xB
具体内容
不过事情并没有那么简单,有各种情况是要特殊处理的,以及 pivot(N,B) \text{pivot(N,B)} pivot(N,B)中的 N , B N,B N,B怎么选取也还没有解决,上面的都是一个比较好的假设。
操作步骤
如何 pivot \text{pivot} pivot
先来考虑 pivot(N,B) \text{pivot(N,B)} pivot(N,B)。首先 a i ≤ 0 a_i\le 0 ai≤0的 x i x_i xi是不用 pivot \text{pivot} pivot的,因为它已经符合我们的期望,那么挑选出一个 a N > 0 a_N>0 aN>0的 x N x_N xN作为非基变量。接着挑选 x B x_B xB,我们找到一个 c i b i , N \frac{c_i}{b_{i,N}} bi,Nci最小的 i i i并且 b i , N > 0 b_{i,N}>0 bi,N>0,这就是对于 x B x_B xB最紧的一个限制,令 B = i B=i B=i,然后进行一次 pivot(N,B) \text{pivot(N,B)} pivot(N,B),观察上面的式子,变换后方程中的常数依然是一个非负值,所以这样的变换也是满足我们对 c i c_i ci的期望的。
当然,有可能存在这样的 N N N,但是没有符合的 B B B,这说明 x N x_N xN可以任取,故答案为 + ∞ +\infin +∞。
如果有 c i < 0 c_i<0 ci<0
如果 ∃ i , c i < 0 \exist i,c_i<0 ∃i,ci<0,那么我们要找一个 j j j使得 b i , j < 0 b_{i,j}<0 bi,j<0,那么进行一次 pivot(j,i) \text{pivot(j,i)} pivot(j,i)就能让 x j x_j xj变成基变量后 c > 0 c>0 c>0;假如找不到那么说明 x i < 0 x_i<0 xi<0,则无解。
对偶形式
假如我们人为的根据上面的形式再构造一个新的线性规划,如下:
min
∑
i
=
1
m
c
i
y
i
∀
1
≤
i
≤
n
,
∑
j
=
1
m
b
j
,
i
y
j
≥
a
i
∀
1
≤
i
≤
m
,
y
i
≥
0
\min \sum_{i=1}^{m}c_iy_i\\ \forall 1\le i\le n,\sum_{j=1}^{m}b_{j,i}y_j\ge a_i\\ \forall 1\le i\le m,y_i\ge 0
mini=1∑mciyi∀1≤i≤n,j=1∑mbj,iyj≥ai∀1≤i≤m,yi≥0
其实就是给上面的每条不等式都配上一个系数
y
i
y_i
yi,然后分别乘上系数后相加,最后再去逼近各项系数
a
i
a_i
ai,有大佬证明了这两个问题是等价的,但是我不会,不过可以感性理解。