我的背景不是线性编程。我正在研究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,则认为该解满足整数约束。非常小的非整数部分。
为什么要这样做?为什么它不像整数问题那样只搜索整数空间?这样,毫无疑问,所得的解是否足够接近整数。
答案 0 :(得分:2)
intlinprog
的基础算法基于称为“分支和界限”(BnB)的过程。在这个算法框架中,不是从字面上“搜索”解决方案空间,而是隐式处理完整性约束。该方案已被证明是解决 general MILP问题的最有效算法。 (当然,有很多针对 问题的算法可以在不同的原理下工作,并且可以将整数视为真正的整数,例如图/网络算法)。
连续的松弛在BnB中扮演着重要角色:除去(“松弛”)变量上的完整性约束后,剩下的问题只是线性优化问题,可以非常有效地解决。在该分支定界过程中,解决了此类连续松弛的序列,每个序列在整数变量上具有不同的界限。
现在,这些子问题都可以用浮点算法解决,因此自然不能保证结果是整数。因此,大多数MILP求解器具有可设置的容差,该容差控制着“整数”的含义。
documentation中提供了intlinprog
后面不同算法组成部分的概述。