整数线性规划问题 与线性规则问题的唯一区别是, 所有变量是整数:
`min_x c^(sf T) x`
`"s.t. " A x le b`
`color(red)(x in ZZ^n_(ge 0))`.
[群友@Rei] 求解整数规划
`min 25x + 20y + 25z`
`"s.t. "350x + 260y + 370z ≥ 1800`
`x + y + z ≤ 7`
`x, y, z in ZZ_(ge 0)`.
# python 穷举 min((25*x+20*y+25*z, x, y, z) for x in range(8) for y in range(8-x) for z in range(8-x-y) if 350*x+260*y+370*z >= 1800 ) # (125, 0, 0, 5)
全单模整数规划是一类简单的整数线性规则, 我们直接求解对应的连续线性规划即可.
考虑整数线性规划 (IP) `min {c^(sf T) x: A x le b, x in ZZ_(ge 0)^n}`, 其中 `A, b, c` 的各分量均为整数. 其对应的连续规划问题 (松弛问题, LP) 为 `min {c^(sf T) x: A x le b, x in RR_(ge 0)^n}`. 回顾线性规划基本定理: 连续线性规划问题的有界最优解 (若存在) 至少在一个顶点上取得. 由此我们得到:
若连续线性规划 (LP) 的可行域的每个顶点都是整数点, 则它的最优解 (若存在) 也是整数线性规划 (IP) 的最优解.
称矩阵 `A_(m xx n)` 为全单模矩阵, 如果它满足任意子方阵的行列式取值为 `0, +-1`. 显然 `A` 的元素只能取值 `0, +-1`. 单位矩阵、零矩阵均是全单模矩阵.
若 `b` 是整数向量, `A` 是全单模矩阵, 则可行域 `{x in RR_(ge 0)^n: A x le b}` 的顶点均为整数点.
二部图 设 `G = (V, E)` 是无向图, `A` 是 `V xx E` 的关联矩阵: `a_(i j) = [顶点 i 与边 j 相连]` 则 `A` 是全单模矩阵当且仅当 `G` 是二部图. (提示: 利用行分割来判定)
指派问题
有 `n` 个任务和 `n` 个人, 第 `i` 人执行第 `j` 个任务的费用为 `c_(i j)`.
要求每人恰好指派一件任务, 使得费用最小:
`min_x sum_(i,j) c_(i j) x_(i j)`
`"s.t. " sum_k x_(k j) = sum_k x_(i k) = 1`, `quad AA i, j in [1..n]`
`x_(i j) = {0,1}`, `quad AA i, j in [1..n]`.
系数矩阵 `A` 的每行每列恰有一个 1, 因此是全单模矩阵.
这个问题也可以看作二部图: `n` 个任务和 `n` 个人组成图的 `2n` 个顶点,
图的边表示指派关系.
最小费用最大流问题
设 `G = (V, E)` 是有向图, `A` 是 `V xx E` 的关联矩阵:
`a_(i j) = {
1, if 点 i 是边 j 的起点;
-1, if 点 i 是边 j 的终点;
0, otherwise
:}`
向量 `c` 表示每条边上单位流量的费用, 向量 `b` 表示每个顶点处的净流量 (流入 - 流出).
则最小费用最大流问题可以表示为
`min_x c^(sf T) x`
`"s.t. " A x = b`
`l le x le u`.
最短路问题和最大流问题都是此题的特殊情况, 我们将在单独的一章讨论这些网络流问题.
考虑整数规划问题 `v^ast = max{c^(sf T) x: x in S sube ZZ^n}`. 分支定界法的思想是, 分别寻找最优解 `v^ast` 的上下界, 从而确定最优解的范围. 其中上界可以从原问题对应的连续规划问题 (松弛问题) 的最优解得到. 对于下界, 使用分治思想, 将原问题的可行域分解为若干集合的并 `S = S_1 uu cdots uu S_m`, 在每个小集合 `S_k` 上求解子问题 `v_k^ast = max{c^(sf T) x: x in S_k sube ZZ^n}`, 则每个子问题的最优解都是一个下界, 即 `v_k^ast le v^ast`, `quad k = 1, cdots, m`. 子问题也是整数规划, 可能难以求解. 但只要知道其上下界 `ul(v_k) le v_k^ast le bar(v_k)`, 就能得到原问题的上下界: `max(ul(v_k)) le v^ast le max(bar(v_k))`. 分支定界法的运行过程就是不断递归求解子问题, 并用子问题的界更新原问题的界.