【问题标题】:CPLEX cannot solve an .lp file that Gurobi canCPLEX 无法解决 Gurobi 可以解决的 .lp 文件
【发布时间】:2019-02-22 02:48:11
【问题描述】:

我正在使用 CPLEX 12.8.0、Python API 上的混合整数二次规划 (MIQP)。我为 .lp 文件生成了一个模型。事实证明,该模型是整数不可行的。这很奇怪,因为我之前用 Gurobi 产生了完全相同的问题并且它是可以解决的。

我在此处附加了指向 .lp 文件的链接以及使用 CPLEX 和 Gurobi 求解的结果。我声明了一些半连续变量。我的目标函数是二次的,但我认为这不是导致整数不可行的原因,不是吗?最后,我真的很想在工作中使用 CPLEX,因为 CPLEX 可以做一些功能,但 Gurobi 做不到。

.lp 文件:

Minimize
 obj: - wi0k0 - wi1k0 - wi2k0 - wi3k0 - wi0k1 - wi1k1 - wi2k1 - wi3k1 + [ m0 ^2
      + m1 ^2 + 1.54315034142201 loss0 ^2 + 1.54315034142201 loss1 ^2
      + 1.54315034142201 loss2 ^2 + 1.54315034142201 loss3 ^2 ] / 2
Subject To
 c1i0k0:  - 2.98563348744947 zi0k0 - ti0k0 <= 0
 c2i0k0:  - 1.33632173341833 zi0k0 + ti0k0 <= 0
 c3i0k0:  m0 + 1.33632173341833 zi0k0 - ti0k0 <= 1.33632173341833
 c4i0k0:  - m0 + 2.98563348744947 zi0k0 + ti0k0 <= 2.98563348744947
 c5i0k0:  - 2.30258509299405 zi0k0 - wi0k0 <= 0
 c6i0k0:  0.22314355131421 zi0k0 + wi0k0 <= 0
 c7i0k0:  v0 - 0.22314355131421 zi0k0 - wi0k0 <= -0.22314355131421
 c8i0k0:  - v0 + 2.30258509299405 zi0k0 + wi0k0 <= 2.30258509299405
 c1i1k0:  - 2.98563348744947 zi1k0 - ti1k0 <= 0
 c2i1k0:  - 1.33632173341833 zi1k0 + ti1k0 <= 0
 c3i1k0:  m0 + 1.33632173341833 zi1k0 - ti1k0 <= 1.33632173341833
 c4i1k0:  - m0 + 2.98563348744947 zi1k0 + ti1k0 <= 2.98563348744947
 c5i1k0:  - 2.30258509299405 zi1k0 - wi1k0 <= 0
 c6i1k0:  0.22314355131421 zi1k0 + wi1k0 <= 0
 c7i1k0:  v0 - 0.22314355131421 zi1k0 - wi1k0 <= -0.22314355131421
 c8i1k0:  - v0 + 2.30258509299405 zi1k0 + wi1k0 <= 2.30258509299405
 c1i2k0:  - 2.98563348744947 zi2k0 - ti2k0 <= 0
 c2i2k0:  - 1.33632173341833 zi2k0 + ti2k0 <= 0
 c3i2k0:  m0 + 1.33632173341833 zi2k0 - ti2k0 <= 1.33632173341833
 c4i2k0:  - m0 + 2.98563348744947 zi2k0 + ti2k0 <= 2.98563348744947
 c5i2k0:  - 2.30258509299405 zi2k0 - wi2k0 <= 0
 c6i2k0:  0.22314355131421 zi2k0 + wi2k0 <= 0
 c7i2k0:  v0 - 0.22314355131421 zi2k0 - wi2k0 <= -0.22314355131421
 c8i2k0:  - v0 + 2.30258509299405 zi2k0 + wi2k0 <= 2.30258509299405
 c1i3k0:  - 2.98563348744947 zi3k0 - ti3k0 <= 0
 c2i3k0:  - 1.33632173341833 zi3k0 + ti3k0 <= 0
 c3i3k0:  m0 + 1.33632173341833 zi3k0 - ti3k0 <= 1.33632173341833
 c4i3k0:  - m0 + 2.98563348744947 zi3k0 + ti3k0 <= 2.98563348744947
 c5i3k0:  - 2.30258509299405 zi3k0 - wi3k0 <= 0
 c6i3k0:  0.22314355131421 zi3k0 + wi3k0 <= 0
 c7i3k0:  v0 - 0.22314355131421 zi3k0 - wi3k0 <= -0.22314355131421
 c8i3k0:  - v0 + 2.30258509299405 zi3k0 + wi3k0 <= 2.30258509299405
 c9k0:    - pi0 + omk0j1 + omk0j2 + omk0j3 + omk0j4  = 0
 c10k0:   - v0 + 5.78057663816274 omk0j1 - 2.88064275681032 gk0j1
          + 2.81415134341597 omk0j2 - 2.06487580075496 gk0j2
          + 1.87716609698306 omk0j3 - 1.64323243986015 gk0j3
          + 1.41062901675158 omk0j4 - 1.35164676471547 gk0j4  = 0
 c11k0:   gk0j1 + gk0j2 + gk0j3 + gk0j4  = 1
 c12k0j1: - omk0j1 + 0.1 gk0j1 <= 0
 c13k0j1: omk0j1 - 0.275 gk0j1 <= 0
 c12k0j2: - omk0j2 + 0.275 gk0j2 <= 0
 c13k0j2: omk0j2 - 0.45 gk0j2 <= 0
 c12k0j3: - omk0j3 + 0.45 gk0j3 <= 0
 c13k0j3: omk0j3 - 0.625 gk0j3 <= 0
 c12k0j4: - omk0j4 + 0.625 gk0j4 <= 0
 c13k0j4: omk0j4 - 0.8 gk0j4 <= 0
 c14k0:   - 4 pi0 + zi0k0 + zi1k0 + zi2k0 + zi3k0  = 0
 c15k0:   1.33632173341833 zi0k0 - ti0k0 - 1.17708699624777 zi1k0 - ti1k0
          - 2.28656128473847 zi2k0 - ti2k0 - 2.98563348744947 zi3k0 - ti3k0
           = 0
 c1i0k1:  - 2.98563348744947 zi0k1 - ti0k1 <= 0
 c2i0k1:  - 1.33632173341833 zi0k1 + ti0k1 <= 0
 c3i0k1:  m1 + 1.33632173341833 zi0k1 - ti0k1 <= 1.33632173341833
 c4i0k1:  - m1 + 2.98563348744947 zi0k1 + ti0k1 <= 2.98563348744947
 c5i0k1:  - 2.30258509299405 zi0k1 - wi0k1 <= 0
 c6i0k1:  0.22314355131421 zi0k1 + wi0k1 <= 0
 c7i0k1:  v1 - 0.22314355131421 zi0k1 - wi0k1 <= -0.22314355131421
 c8i0k1:  - v1 + 2.30258509299405 zi0k1 + wi0k1 <= 2.30258509299405
 c1i1k1:  - 2.98563348744947 zi1k1 - ti1k1 <= 0
 c2i1k1:  - 1.33632173341833 zi1k1 + ti1k1 <= 0
 c3i1k1:  m1 + 1.33632173341833 zi1k1 - ti1k1 <= 1.33632173341833
 c4i1k1:  - m1 + 2.98563348744947 zi1k1 + ti1k1 <= 2.98563348744947
 c5i1k1:  - 2.30258509299405 zi1k1 - wi1k1 <= 0
 c6i1k1:  0.22314355131421 zi1k1 + wi1k1 <= 0
 c7i1k1:  v1 - 0.22314355131421 zi1k1 - wi1k1 <= -0.22314355131421
 c8i1k1:  - v1 + 2.30258509299405 zi1k1 + wi1k1 <= 2.30258509299405
 c1i2k1:  - 2.98563348744947 zi2k1 - ti2k1 <= 0
 c2i2k1:  - 1.33632173341833 zi2k1 + ti2k1 <= 0
 c3i2k1:  m1 + 1.33632173341833 zi2k1 - ti2k1 <= 1.33632173341833
 c4i2k1:  - m1 + 2.98563348744947 zi2k1 + ti2k1 <= 2.98563348744947
 c5i2k1:  - 2.30258509299405 zi2k1 - wi2k1 <= 0
 c6i2k1:  0.22314355131421 zi2k1 + wi2k1 <= 0
 c7i2k1:  v1 - 0.22314355131421 zi2k1 - wi2k1 <= -0.22314355131421
 c8i2k1:  - v1 + 2.30258509299405 zi2k1 + wi2k1 <= 2.30258509299405
 c1i3k1:  - 2.98563348744947 zi3k1 - ti3k1 <= 0
 c2i3k1:  - 1.33632173341833 zi3k1 + ti3k1 <= 0
 c3i3k1:  m1 + 1.33632173341833 zi3k1 - ti3k1 <= 1.33632173341833
 c4i3k1:  - m1 + 2.98563348744947 zi3k1 + ti3k1 <= 2.98563348744947
 c5i3k1:  - 2.30258509299405 zi3k1 - wi3k1 <= 0
 c6i3k1:  0.22314355131421 zi3k1 + wi3k1 <= 0
 c7i3k1:  v1 - 0.22314355131421 zi3k1 - wi3k1 <= -0.22314355131421
 c8i3k1:  - v1 + 2.30258509299405 zi3k1 + wi3k1 <= 2.30258509299405
 c9k1:    - pi1 + omk1j1 + omk1j2 + omk1j3 + omk1j4  = 0
 c10k1:   - v1 + 5.78057663816274 omk1j1 - 2.88064275681032 gk1j1
          + 2.81415134341597 omk1j2 - 2.06487580075496 gk1j2
          + 1.87716609698306 omk1j3 - 1.64323243986015 gk1j3
          + 1.41062901675158 omk1j4 - 1.35164676471547 gk1j4  = 0
 c11k1:   gk1j1 + gk1j2 + gk1j3 + gk1j4  = 1
 c12k1j1: - omk1j1 + 0.1 gk1j1 <= 0
 c13k1j1: omk1j1 - 0.275 gk1j1 <= 0
 c12k1j2: - omk1j2 + 0.275 gk1j2 <= 0
 c13k1j2: omk1j2 - 0.45 gk1j2 <= 0
 c12k1j3: - omk1j3 + 0.45 gk1j3 <= 0
 c13k1j3: omk1j3 - 0.625 gk1j3 <= 0
 c12k1j4: - omk1j4 + 0.625 gk1j4 <= 0
 c13k1j4: omk1j4 - 0.8 gk1j4 <= 0
 c14k1:   - 4 pi1 + zi0k1 + zi1k1 + zi2k1 + zi3k1  = 0
 c15k1:   1.33632173341833 zi0k1 - ti0k1 - 1.17708699624777 zi1k1 - ti1k1
          - 2.28656128473847 zi2k1 - ti2k1 - 2.98563348744947 zi3k1 - ti3k1
           = 0
 c16i0:   zi0k0 + zi0k1  = 1
 c16i1:   zi1k0 + zi1k1  = 1
 c16i2:   zi2k0 + zi2k1  = 1
 c16i3:   zi3k0 + zi3k1  = 1
 c17k0:   zi0k0 + zi1k0 + zi2k0 + zi3k0 >= 0.4
 c18k0:   zi0k0 + zi1k0 + zi2k0 + zi3k0 <= 3.2
 c17k1:   zi0k1 + zi1k1 + zi2k1 + zi3k1 >= 0.4
 c18k1:   zi0k1 + zi1k1 + zi2k1 + zi3k1 <= 3.2
 c21k0:   m0 - m1 <= 0
 c22:     pi0 + pi1  = 1
 c23i0:   ti0k0 + ti0k1 + loss0  = 1.33632173341833
 c23i1:   ti1k0 + ti1k1 + loss1  = -1.17708699624777
 c23i2:   ti2k0 + ti2k1 + loss2  = -2.28656128473847
 c23i3:   ti3k0 + ti3k1 + loss3  = -2.98563348744947
Bounds
 0.1 <= pi0 <= 0.8
-2.98563348744947 <= m0 <= 1.33632173341833
-2.30258509299405 <= v0 <= -0.22314355131421
 0 <= zi0k0 <= 1
-2.98563348744947 <= ti0k0 <= 1.33632173341833
-2.30258509299405 <= wi0k0 <= -0.22314355131421
 0 <= zi1k0 <= 1
-2.98563348744947 <= ti1k0 <= 1.33632173341833
-2.30258509299405 <= wi1k0 <= -0.22314355131421
 0 <= zi2k0 <= 1
-2.98563348744947 <= ti2k0 <= 1.33632173341833
-2.30258509299405 <= wi2k0 <= -0.22314355131421
 0 <= zi3k0 <= 1
-2.98563348744947 <= ti3k0 <= 1.33632173341833
-2.30258509299405 <= wi3k0 <= -0.22314355131421
 0.1 <= omk0j1 <= 0.8
 0 <= gk0j1 <= 1
 0.1 <= omk0j2 <= 0.8
 0 <= gk0j2 <= 1
 0.1 <= omk0j3 <= 0.8
 0 <= gk0j3 <= 1
 0.1 <= omk0j4 <= 0.8
 0 <= gk0j4 <= 1
 0.1 <= pi1 <= 0.8
-2.98563348744947 <= m1 <= 1.33632173341833
-2.30258509299405 <= v1 <= -0.22314355131421
 0 <= zi0k1 <= 1
-2.98563348744947 <= ti0k1 <= 1.33632173341833
-2.30258509299405 <= wi0k1 <= -0.22314355131421
 0 <= zi1k1 <= 1
-2.98563348744947 <= ti1k1 <= 1.33632173341833
-2.30258509299405 <= wi1k1 <= -0.22314355131421
 0 <= zi2k1 <= 1
-2.98563348744947 <= ti2k1 <= 1.33632173341833
-2.30258509299405 <= wi2k1 <= -0.22314355131421
 0 <= zi3k1 <= 1
-2.98563348744947 <= ti3k1 <= 1.33632173341833
-2.30258509299405 <= wi3k1 <= -0.22314355131421
 0.1 <= omk1j1 <= 0.8
 0 <= gk1j1 <= 1
 0.1 <= omk1j2 <= 0.8
 0 <= gk1j2 <= 1
 0.1 <= omk1j3 <= 0.8
 0 <= gk1j3 <= 1
 0.1 <= omk1j4 <= 0.8
 0 <= gk1j4 <= 1
 0 <= loss0 <= 4.3219552208678
-2.5134087296661 <= loss1 <= 1.80854649120169
-3.6228830181568 <= loss2 <= 0.699072202710996
-4.3219552208678 <= loss3 <= 0
Binaries
 zi0k0  zi1k0  zi2k0  zi3k0  gk0j1  gk0j2  gk0j3  gk0j4  zi0k1  zi1k1  zi2k1 
 zi3k1  gk1j1  gk1j2  gk1j3  gk1j4 
Semi-Continuous
 ti0k0  wi0k0  ti1k0  wi1k0  ti2k0  wi2k0  ti3k0  wi3k0  omk0j1  omk0j2 
 omk0j3  omk0j4  ti0k1  wi0k1  ti1k1  wi1k1  ti2k1  wi2k1  ti3k1  wi3k1 
 omk1j1  omk1j2  omk1j3  omk1j4 
End

这里 Gurobi 可以求解模型,但不能求解 CPLEX。

CPLEX 输出:

古罗比输出:

【问题讨论】:

  • 您好!欢迎来到堆栈溢出!看来你的问题很好!为了帮助我们帮助您,请包含您认为与回答问题相关的代码部分。请避免发布文件下载链接,而是提供问题的清晰代码 sn-p。希望你早日找到答案!
  • 感谢您的建议。我删除了文件链接并重新发布了 .lp 文件。我会说我对 CPLEX 很陌生,我从 CPLEX 生成了这个 .lp。它不包含错误。这里有决策二元变量:zi#k#、gk#j#。有半连续变量:wi#k#、ti#k# 和 omk#j#。约束 c1i#k# - c4i#k# 和 c5i#k# - c8i#k# 分别定义了半连续变量的界限和属性:wi#k# 和 ti#k#。
  • 另请注意:.lp 格式不是跨求解器标准化的!请尝试使用 .mps 格式。另请注意,.lp 文件旨在供人类阅读。因此,当使用 Gurobi 编写 .lp 文件时,参数将不会以完整的十进制精度写入!供参考:support.gurobi.com/hc/en-us/articles/…support.gurobi.com/hc/en-us/articles/…

标签: cplex gurobi


【解决方案1】:

我认为您的 LP 文件规范有误。例如,您有

-2.98563348744947

但同时 ti0k0 被标记为“半连续”。那应该是什么意思? “半连续”表示“必须为 0 或在指定范围内”。如果指定的边界包括 0,那么变量可能只是半连续的。对解决这个问题有帮助吗?

我不确定 Gurobi 对这样的变量做了什么。如果您使用 Gurobi 读取 LP,然后将其写出并将新创建的 LP 文件提供给 CPLEX,会发生什么情况?您是否检查过 Gurobi 提供的解决方案是否确实满足您的所有限制条件?

【讨论】:

    【解决方案2】:

    除了我在其他答案中提到的怪异(无法编辑我的答案,因为我没有在这里注册)之外,您的 LP 文件实际上对于 CPLEX 是错误的。如果您查看https://www.ibm.com/support/knowledgecenter/SSSA5P_12.8.0/ilog.odms.cplex.help/CPLEX/UsrMan/topics/discr_optim/semi_cont_var/02_SemiCont_defn.html,那么您可以阅读

    半连续下限 (sclb) 必须大于或等于 为 0(零)。尝试使用负值 半连续下界 (sclb) 将导致该界为 视为 0(零)。

    因此,“0 或负”的半连续变量可能是导致模型不可行的原因,因为它们的下限设置为 0,然后导致变量的边界相互矛盾。

    您必须将这些变量乘以 -1,以便它们变为“0 或在正范围内”。

    【讨论】:

    • 谢谢你,丹尼尔!一定是这个原因。我将研究我的半连续变量。我刚刚意识到,与 Gurobi 相比,它在 CPLEX 中的处理方式不同,在 Gurobi 中,“半连续变量具有取值​​为 0 或在指定的下限和上限之间的值”的属性,而没有限制下限必须是积极的。
    • 另一个更新。我通过根据 CPLEX 调整半连续变量来使其工作。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2022-01-25
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多