为什么Matlab的`intlinprog`返回整数的近整数?

时间:2019-04-25 17:45:18

标签: matlab integer-programming mixed-integer-programming

我的背景不是线性编程。我正在研究Matlab的混合整数线性编程(intlinprog),其目的是正确应用它而不是促进底层引擎的科学发展。

根据intlinprog页的 | parent | child | numeric_result_list | index | | voltage | 0 | xy | a | [[1.2, 1.1, 1.2], [1.1, 1.0, 1.3]] | 1 | xy | b | [[1.1, 1.0, 1.1], [1.4, 1.3, 1.5]] | 2 | xy | c | [[1.1, 1.0, 1.6], [1.4, 1.8, 1.5]] | 3 | yz | e | [[1.4, 1.2, 1.2], [1.7, 1.2, 1.0]] | 部分,该解决方案似乎在非整数空间中寻求,并且如果表面上的整数变量具有a,则认为该解满足整数约束。非常小的非整数部分。

为什么要这样做?为什么它不像整数问题那样只搜索整数空间?这样,毫无疑问,所得的解是否足够接近整数。

1 个答案:

答案 0 :(得分:2)

intlinprog的基础算法基于称为“分支和界限”(BnB)的过程。在这个算法框架中,不是从字面上“搜索”解决方案空间,而是隐式处理完整性约束。该方案已被证明是解决 general MILP问题的最有效算法。 (当然,有很多针对 问题的算法可以在不同的原理下工作,并且可以将整数视为真正的整数,例如图/网络算法)。

连续的松弛在BnB中扮演着重要角色:除去(“松弛”)变量上的完整性约束后,剩下的问题只是线性优化问题,可以非常有效地解决。在该分支定界过程中,解决了此类连续松弛的序列,每个序列在整数变量上具有不同的界限。

现在,这些子问题都可以用浮点算法解决,因此自然不能保证结果是整数。因此,大多数MILP求解器具有可设置的容差,该容差控制着“整数”的含义。

documentation中提供了intlinprog后面不同算法组成部分的概述。