PuLP中的LpStatus=Undefined实际是什么意思?

15 投票
2 回答
9828 浏览
提问于 2025-04-18 09:27

当我给我的问题添加一个特定的限制条件后,解决这个问题的状态变成了“未定义”(在没有这个限制条件时,它的状态是“最优”)。在这个页面的顶部,有关于返回状态的可能性说明,但似乎没有解释它们的意思。有没有人能解释一下“未定义”状态是什么意思?这是不是类似于在指定限制条件时出现的语法错误?

2 个回答

3

“未定义”意味着PuLP不知道如何理解求解器的输出,但这通常发生在某些混合整数程序无法解决时。

你看到“未定义”还是“不可行”,取决于PuLP使用的是哪个求解器,比如CBC、GLPK、COIN等。这些求解器有一个“预处理”步骤和一个求解步骤;如果在预处理阶段发现了不可行性,它会返回“未定义”,如果在求解阶段发现了不可行性,它会返回“不可行”。

我只使用过CBC和GLPK求解器,只有在使用CBC求解器时遇到过这个问题。这个讨论串提到GLPK求解器中的同样错误在GLPK版本4.53中被修复了。

这里有一些额外的技术信息,解释“未定义”是怎么来的:

我的猜测是,‘未定义’状态意味着CBC以某种奇怪的方式终止,留下了PuLP一个松弛子问题的中间解。(因为当PuLP的readsol_MPS方法在CBC解决文件中找不到任何其他PuLP状态时,‘未定义’就是默认状态。我在PuLP的solver.py中发现了这一点。)

这里是关于预处理问题的来源

当不可行性被混合整数预处理器检测到(而不是混合整数求解器),这可能会发生,这种情况错误地没有改变混合整数解的状态,因此它仍然保持未定义。

16

PuLP中,求解器可以返回五种状态码:

  1. 最优
  2. 未解决
  3. 不可行
  4. 无界
  5. 未定义

最优

找到了一个最优的解决方案。

未解决

这是在问题还没有被解决之前的默认状态。

不可行

这个问题没有可行的解决方案。

无界

成本函数是无界的,也就是说没有限制。

未定义

还没有找到可行的解决方案(但可能存在)。

这些状态码似乎是来自GPLK的映射。

大部分信息来自于阅读源代码和这个资源

撰写回答