0

目前,我正在研究 python 上的 docplex。

我刚刚发现 IBM cplex Ilog 和 docplex 的结果完全不同。

尽管它们的约束条件、目标函数等一切都是相同的,但它们的解决方案却大不相同。

在某些情况下,docplex 说不可行,即使它在 Ilog 中是可行的。

我试图限制 docplex 容差的完整性和最小差距,但同样的问题发生了。

有谁知道为什么会这样?以及如何解决这个问题?

4

3 回答 3

1

为了补充 Alex 的回答:在 Docplex 中,Model.export_as_lp(path'c:/temp/mymodel.lp') 是从 Docplex 模型生成 LP 文件的方法。在 Cplex 的 Python API 中,您有一个 Cplex 实例,使用 cpx.write('c:/temp/mymodel_cplex.lp') 生成 LP 文件。

如果您的模型相同,那么两个 LP 文件也应该相同(除了变量排序方面的一些差异,例如 x2+x1 而不是 x1+x2)。如果您需要在两个 API 中使用相同的模型,那么您必须先达到这种相等性,然后再进一步。

DOcplex 有工具来调查不可行的模型,但在确保两个模型相同之前没有意义。

于 2020-07-10T08:01:03.207 回答
1

为了了解有什么不同,您可以在 lp 文件中导出模型。

mdl.export("c:\\temp\\buses.lp")

from docplex.mp.model import Model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()

mdl.export("c:\\temp\\buses.lp")

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)


"""
which gives
nbBus40  =  6.0
nbBus30  =  2.0
"""
于 2020-07-10T06:24:43.807 回答
0

两个版本之间必须有所不同。您可以使用refine_conflict 来了解不可行的来源

于 2020-07-10T00:09:28.580 回答