PuLP中的LpStatus=Undefined实际是什么意思?
当我给我的问题添加一个特定的限制条件后,解决这个问题的状态变成了“未定义”(在没有这个限制条件时,它的状态是“最优”)。在这个页面的顶部,有关于返回状态的可能性说明,但似乎没有解释它们的意思。有没有人能解释一下“未定义”状态是什么意思?这是不是类似于在指定限制条件时出现的语法错误?
2 个回答
3
“未定义”意味着PuLP不知道如何理解求解器的输出,但这通常发生在某些混合整数程序无法解决时。
你看到“未定义”还是“不可行”,取决于PuLP使用的是哪个求解器,比如CBC、GLPK、COIN等。这些求解器有一个“预处理”步骤和一个求解步骤;如果在预处理阶段发现了不可行性,它会返回“未定义”,如果在求解阶段发现了不可行性,它会返回“不可行”。
我只使用过CBC和GLPK求解器,只有在使用CBC求解器时遇到过这个问题。这个讨论串提到GLPK求解器中的同样错误在GLPK版本4.53中被修复了。
这里有一些额外的技术信息,解释“未定义”是怎么来的:
我的猜测是,‘未定义’状态意味着CBC以某种奇怪的方式终止,留下了PuLP一个松弛子问题的中间解。(因为当PuLP的readsol_MPS方法在CBC解决文件中找不到任何其他PuLP状态时,‘未定义’就是默认状态。我在PuLP的solver.py中发现了这一点。)
这里是关于预处理问题的来源。
当不可行性被混合整数预处理器检测到(而不是混合整数求解器),这可能会发生,这种情况错误地没有改变混合整数解的状态,因此它仍然保持未定义。