整数规划
整数规划的标准模型可以由标准线性规划模型变形得到:
{ min z = c ′ x s . t . A x ≤ b x ≥ 0 x i ∈ I , i ∈ J ⊂ { 1 , 2 , … , n } \left\{ \begin{aligned} \min & z=c'x\\ s.t.& Ax\leq b\\ &x\geq 0 & x_i\in I, i\in J\subset \{1,2,\dots, n\} \end{aligned} \right. ⎩⎪⎨⎪⎧mins.t.z=c′xAx≤bx≥0xi∈I,i∈J⊂{
1,2,…,n}
分支定界法
设整数规划问题为IP
,对应松弛的线性规划问题为LP
。
- 求解
LP
,可能得到如下几种情况
LP
无可行解,则IP
也没有可行解.LP
有最优解切解的各个分量均为整数,即已经为IP
问题的最优解,停止计算.LP
有最优解,但不符合IP
中的整数条件的要求,设此时的目标数值为 f 0 f_0 f0,IP
问题的最优目标值为 f f f,则满足 f ≥ f 0 f\geq f_0 f≥f0.
- 迭代
- 分支:在
LP
的最优解中任选一个不符合整数条件的变量 x j x_j xj(一般选择最大值的非整数分量构造添加约束条件),设其为 v j v_j vj,构造两个约束条件 x j ≤ v j x_j\leq v_j xj≤vj和 x j ≥ v j + 1 x_j\geq v_j+1 xj≥vj+1,将这两个条件分别加入问题LP
,从而将LP
拆分为两个子问题LP1
和LP2
. 在松弛整数约束的条件下分别求解LP1
和LP2
. - 定界:以每个子问题为一个分支并表明求解结果,与其他问题的解进行比较,找到最优目标函数值的最小者作为新的下界,替换 f 0 f_0 f0;从符合整数条件的分支中,找出目标函数值的最小者作为新的上界 f ∗ f^* f∗,则有 f 0 ≤ f ≤ f ∗ f_0\leq f\leq f^* f0≤f≤f∗.
- 剪枝:各分支的最优目标函数值中若存在大于 f ∗ f^* f∗的,则剪去该分支,如果小于 f ∗ f^* f∗,且不符合整数条件,则重复分支步骤,直到最优目标函数值 f = f ∗ f=f^* f=f∗为止,得到最优整数解 x j ∗ ( j = 1 , 2 , … , n ) x_j^*(j=1,2,\dots, n) xj∗(j=1,2,…,n).
割平面法
Gormory割平面法的基本原理是在整数线性规划的松弛问题中附加线性约束,以割去松弛问题最优解附近的非整数解,得到整数解的顶点.
Gormory算法的步骤如下:
- 解纯
IP
问题的松弛问题 P ′ P' P′,如果不存在可行解,则 P P P也没有可行解,如果 P ′ P' P′的最优解为 x ∗ x^* x∗是整数解,则 x ∗ x^* x∗也是 P P P问题的最优解,停止计算,否则转2. - 求割平面方程,任选 x ∗ x^* x∗的一个非整数分量 x p x_p xp( x p x_p xp为基变量),定义包含该基变量的切割约束方程
x p + ∑ j ∈ T r i j x j = b c o n x_p+\sum_{j\in T}r_{ij}x_j=b_{con} xp+j∈T∑rijxj=bcon
其中 T T T为非基变量的下标集合. - 令 r ˉ i j = r i j − [ r i j ] \bar{r}_{ij}=r_{ij}-[r_{ij}] rˉij=rij−[rij], d ˉ c o n = b c o n − [ b c o n ] \bar{d}_{con}=b_{con}-[b_{con}] dˉcon=bcon−[bcon],将切割约束表示为
x p + ∑ j ∈ T [ r i j ] x j − [ b c o n ] = d ˉ c o n − ∑ j ∈ T r ˉ i j x j x_p+\sum_{j\in T}[r_{ij}]x_j-[b_{con}]=\bar{d}_{con}-\sum_{j\in T}\bar{r}_{ij}x_j xp+j∈T∑[rij]xj−[bcon]=dˉcon−j∈T∑rˉijxj - 将切割方程加入到约束方程中,用对偶单纯形法求解线性规划
min z = c ′ x s . t . A x = b d ˉ c o n − ∑ j ∈ T r ˉ i j x j ≤ 0 x ≥ 0 , i = 1 , 2 , … , n \begin{aligned} \min& z=c'x\\ s.t.& Ax=b\\ &\bar{d}_{con}-\sum_{j\in T}\bar{r}_{ij}x_j\leq 0\\ &x\geq 0, i=1,2,\dots, n \end{aligned} mins.t.z=c′xAx=bdˉcon−j∈T∑rˉijxj≤0x≥0,i=1,2,…,n
如果其最优解为整数解,则为问题 P P P的最优解,否则将该解重新记为 x ∗ x^* x∗,返回2。
隐枚举法
隐枚举法是求解0-1
规划常用的方法,0-1
规划的标准形式如下:
min z = c ′ x = ∑ i = 1 n c i x i s . t . A x ≤ b x i = 0 o r 1 , i = 1 , 2 , … , n \begin{aligned} \min &z=c'x=\sum_{i=1}^nc_ix_i\\ s.t. & Ax\leq b\\ &x_i=0 \quad or \quad 1, i=1,2,\dots, n \end{aligned} mins.t.z=c′x=i=1∑ncixiAx≤bxi=0or1,i=1,2,…,n
Demo: 割平面法求解IP问题
max z = − x 1 − 27 x 2 s . t . − x 1 + x 2 ≤ 1 24 x 1 + 4 x 2 ≤ 25 x 1 , x 2 ≥ 0 x i ∈ I , i = 1 , 2 \begin{aligned} \max & z=-x_1-27x_2\\ s.t. & -x_1+x_2\leq 1\\ &24x_1+4x_2\leq 25\\ &x_1, x_2\geq 0 x_i\in I, i=1,2 \end{aligned} maxs.t.z=−x1−27x2−x1+x2≤124x1+4x2≤25x1,x2≥0xi∈I,i=1,2
code
function [x, val] = gomory(A, b, c)
[minx, val, A2, b1] = mysimplex(A, b, c);
eps = 1.0e-7;
while 1
n = length(b1);
y = zeros(1, n);
for i=1:n
if abs(round(b1(i))-b1(i))>eps
y(i)=1;
end
end
a = find(y==1);
if ~isempty(a)
A = A2(1:end-1, 1:end-1);
[r, c1]=size(A);
b = A2(1:end-1,end);
m = findeye(A);
[fk, id]=max(mydec(b(a)));
id = a(id);
nbase = redu(1:c1, m(:, 2), 'c');
B = A(:, nbase);
nbaL = length(nbase);
y1 = zeros(1, nbaL);
for i=1:nbaL
y1(i)=-mydec(B(id, i));
end
A = [A zeros(r, 1)];
A1 = zeros(1, r+1);
A1(nbase)=y1;
A = [A; A1 1];
b=[b; -fk];
c=[c 0];
[minx, b1]=dualsimplex(A, b, c);
A2 = minx.A;
val = minx.f;
else
break;
end
end
x=minx;
end