【IP】整数规划及一些求解算法

整数规划

整数规划的标准模型可以由标准线性规划模型变形得到:
{ 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=cxAxbx0xiI,iJ{ 1,2,,n}

分支定界法

设整数规划问题为IP,对应松弛的线性规划问题为LP

  • 求解LP,可能得到如下几种情况
  1. LP无可行解,则IP也没有可行解.
  2. LP有最优解切解的各个分量均为整数,即已经为IP问题的最优解,停止计算.
  3. LP有最优解,但不符合IP中的整数条件的要求,设此时的目标数值为 f 0 f_0 f0, IP问题的最优目标值为 f f f,则满足 f ≥ f 0 f\geq f_0 ff0.
  • 迭代
  1. 分支:在LP的最优解中任选一个不符合整数条件的变量 x j x_j xj(一般选择最大值的非整数分量构造添加约束条件),设其为 v j v_j vj,构造两个约束条件 x j ≤ v j x_j\leq v_j xjvj x j ≥ v j + 1 x_j\geq v_j+1 xjvj+1,将这两个条件分别加入问题LP,从而将LP拆分为两个子问题LP1LP2. 在松弛整数约束的条件下分别求解LP1LP2.
  2. 定界:以每个子问题为一个分支并表明求解结果,与其他问题的解进行比较,找到最优目标函数值的最小者作为新的下界,替换 f 0 f_0 f0;从符合整数条件的分支中,找出目标函数值的最小者作为新的上界 f ∗ f^* f,则有 f 0 ≤ f ≤ f ∗ f_0\leq f\leq f^* f0ff.
  3. 剪枝:各分支的最优目标函数值中若存在大于 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算法的步骤如下:

  1. 解纯IP问题的松弛问题 P ′ P' P,如果不存在可行解,则 P P P也没有可行解,如果 P ′ P' P的最优解为 x ∗ x^* x是整数解,则 x ∗ x^* x也是 P P P问题的最优解,停止计算,否则转2.
  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+jTrijxj=bcon
    其中 T T T为非基变量的下标集合.
  3. 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+jT[rij]xj[bcon]=dˉconjTrˉijxj
  4. 将切割方程加入到约束方程中,用对偶单纯形法求解线性规划
    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=cxAx=bdˉconjTrˉijxj0x0,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=cx=i=1ncixiAxbxi=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=x127x2x1+x2124x1+4x225x1,x20xiI,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

猜你喜欢

转载自blog.csdn.net/qq_18822147/article/details/118466553