直接求解
这是 下料问题 的整数规划模型。
接下来对它进行求解。
精确解
最直接的办法,就是用整数规划求解器。但是有个问题,当问题规模较大时,求解器可能算不出来。
简单分析一下。令 $m$ 代表产品类型数量,$n$ 代表可行切割方式的数量。在上面的规划中,约束的个数是 $m$,变量的个数是 $n$。在最坏的情况下,$n$ 随着 $m$ 的增大呈指数增长,即 $n\geq 2^m$。
换句话说,变量的数量以及可行切割的数量随 $m$ 指数增长。即便只是枚举所有的可行切割,需要的时间也随 $m$ 指数增长。
在这个例子中 $m=4$,我们可以尝试精确求解。
近似解
另一个思路是求近似解。目标是求一个可行解,尽可能地靠近最优解,但是计算计算效率要高。思路是先计算松弛问题的最优解,再把这个解转化成一个可行解。
具体来说,有四个步骤。
第一步,求解松弛问题
它的最优解记作 $x^*$。
第二步,向下取整
把最优解 $x^*$ 向下取整,得到整数解记作 $\bar{x}= \lfloor x^* \rfloor$。但是取整后,可能导致需求不满足,即
$$ \sum_{j=1}^n a_{ij}\bar{x}_j < d_i,\quad \exists~ i $$
因此,需要计算没有被满足的需求量。为了方便描述,用 $r_i$ 来表示
$$ r_i = d_i - \sum_{j=1}^n a_{ij}\bar{x}_j, \quad \forall i $$
接下来满足剩余的需求。
第三步,满足需求
考虑所有 $\set{r_i \mid r_i > 0}$,然后满足这些需求。例如每次选一个最大的 $r_i$,从 $\bar{x}$ 对应的基列中选一列,然后满足需求 $r_i$。重复这样的步骤,直到剩余的需求被满足。具体细节这里不多讲,感兴趣可以看 编程实现。
问题
求近似解的过程中,求解松弛问题虽然比整数规划容易,但是仍然不能处理大规模的情形。即,当 $m$ 较大时,$n$ 是 $m$ 的指数关系,导致系数矩阵 $A$ 非常大。在这种情况下,计算系数矩阵 $A$ 就已经超出我们能接受的时间。因此,直接求解的办法不能应对大规模情形。
Last updated 24 Apr 2025, 15:18 +0800 .