调整整数线性规划
改变遗留选项以改进求解过程
注意
通常,您可以更改 MILP 的表示以使其更易于求解。有关如何更改表示的建议,请参阅 Williams [1]。
运行 'legacy' intlinprog 算法一次后,您可能需要更改一些选项并重新运行它。您可能希望看到的变化包括:
运行时间更短
较低的最终目标函数值(更好的解)
最终间隙较小
更多或不同的可行点
以下是最有可能有助于解过程的选项变更的一般建议。按以下顺序尝试这些建议:
为了获得更快更准确的解,请将
CutMaxIterations选项从默认的10增加到更高的数字,例如25。这可以加快解的速度,但也可能减慢求解问题的速度。为了获得更快、更准确的解,请将
CutGeneration选项更改为'intermediate'或'advanced'。这可以加快解的速度,但会占用更多的内存,并会使解的速度变慢。为了获得更快、更准确的解,请将
IntegerPreprocess选项更改为'advanced'。这会对解过程产生很大的影响,无论有益还是有害。为了获得更快、更准确的解,请将
RootLPAlgorithm选项更改为'primal-simplex'。通常这种变化是没有好处的,但偶尔也会有好处。为了尝试找到更多或更好的可行点,请将
HeuristicsMaxNodes选项从其默认的50增加到更高的数字,例如100。为了尝试找到更多或更好的可行点,请将
Heuristics选项更改为'intermediate'或'advanced'。为了尝试找到更多或更好的可行点,请将
BranchRule选项更改为'strongpscost',或者,如果该选择无法改善解,则更改为'maxpscost'。为了更快地解,请将
ObjectiveImprovementThreshold选项从其默认值零增加为正值,例如1e-4。然而,这种变化可能导致intlinprog找到更少的整数可行点或不太准确的解。为了尝试更快地停止求解器,请将
RelativeGapTolerance选项更改为比默认1e-4更高的值。类似地,为了尝试获得更准确的答案,请将RelativeGapTolerance选项更改为较低的值。这些改变并不总能改善结果。
有些“整数”解不是整数
通常,解 x(intcon) 中一些假定为整数值的分量并不是精确的整数。intlinprog 将整数 IntegerTolerance 范围内的所有解值视为整数。
要将所有假定整数四舍五入为精确整数,请使用 round 函数。
x(intcon) = round(x(intcon));
小心
四舍五入可能会导致解变得不可行。舍入后检查可行性:
max(A*x - b) % see if entries are not too positive, so have small infeasibility max(abs(Aeq*x - beq)) % see if entries are near enough to zero max(x - ub) % positive entries are violated bounds max(lb - x) % positive entries are violated bounds
大型分量不是整数值
当解分量的绝对值超过 2.1e9 时,intlinprog 并不强制要求其值为整数。当您的解包含此种分量时,intlinprog 会发出警告。如果您收到此警告,请检查该解,确认该解中应为整数值的分量是否接近整数。
不允许使用较大的系数
intlinprog 不允许问题的分量(例如 f 或 ub 中的系数)的绝对值超过 1e20(对于 1e25 算法则为 "legacy"),或者 A 或 Aeq 的分量的绝对值超过 1e15。如果您尝试对这样的问题运行 intlinprog,intlinprog 会出错。
如果出现此错误,有时您可以扩展问题以获得较小的系数:
对于
f中过大的系数,尝试将f乘以一个小的缩放因子。对于过大的约束系数,尝试将所有边界和约束矩阵乘以相同的小缩放因子。
参考
[1] Williams, H. Paul. Model Building in Mathematical Programming, 5th Edition. Wiley, 2013.