【问题标题】:Cplex java, no solution found; how to improve a program by using exportModel()Cplex java,没有找到解决方案;如何使用 exportModel() 改进程序
【发布时间】:2013-08-23 12:07:44
【问题描述】:

我在 java 中使用 cplex。我刚刚实现了一个程序,它与 cplex 优化工作室中的程序具有相同的目标函数和几乎相同的约束设置。

程序(旅行推销员问题)针对一个非常小的问题实例(3 个客户)运行。一旦实例变大一点,java(eclipse) 就会给我如下输出,但没有解决方案。

Tried aggregator 2 times.
MIP Presolve eliminated 617 rows and 607 columns.
MIP Presolve modified 13624 coefficients.
Aggregator did 6 substitutions.
Reduced MIP has 697 rows, 763 columns, and 18408 nonzeros.
Reduced MIP has 381 binaries, 238 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.16 sec. (79.02 ticks)
Probing fixed 252 vars, tightened 287 bounds.
Probing changed sense of 4 constraints.
Probing time = 0.08 sec. (23.50 ticks)
Cover probing fixed 29 vars, tightened 83 bounds.
Tried aggregator 2 times.
MIP Presolve eliminated 400 rows and 528 columns.
MIP Presolve modified 1532 coefficients.
Aggregator did 11 substitutions.
Reduced MIP has 286 rows, 224 columns, and 5117 nonzeros.
Reduced MIP has 96 binaries, 80 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.03 sec. (9.14 ticks)

    Nodes                                         Cuts/
Node  Left     Objective  IInf  Best Integer    Best Bound    ItCnt     Gap

  0     0 -1.00000e+037     0                    -86.8576        0         

Root node processing (before b&c):
Real time             =    0.02 sec. (2.20 ticks)
Parallel b&c, 2 threads:
Real time             =    0.00 sec. (0.00 ticks)
Sync time (average)   =    0.00 sec.
Wait time (average)   =    0.00 sec.
                      ------------
Total (root+branch&cut) =    0.02 sec. (2.20 ticks)

同时,“唯一”的 cplex 程序仍然能够为该实例计算解决方案。

由于我对 cplex 和 java 比较陌生,我不知道如何解释这个输出。

我想过这个:

-由于我的程序与上面提到的“just”cplex 实现非常相似,因此约束的数量不能太多,导致计算量太大。

-当它解决了一个小实例时,它还应该运行其他实例,这些实例适用于“just” cplex 实现。

在 cplex 仍然存在的情况下,java 是否无法解决某些问题?

编辑:

使用 exportModel(filename.lp) 后,我得到一个像这样的文件:

\ENCODING=ISO-8859-1
\Problem name: ilog.cplex

Minimize
 obj: x1 - x2
Subject To
 c1:    x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17
        + x18 + x19 + x20 + x21 + x22 + x23 + x24 + x25 + x26 + x27 + x28 + x29
        + x30 + x31 + x32 + x33 + x34 + x35 + x36 + x37 + x38 + x39 + x40  = 1
 c3:    x77 + x78 + x79 + x80 + x81 + x82 + x83 + x84 + x85 + x86 + x87 + x88
        + x89 + x90 + x91 + x92 + x93 + x94 + x95 + x96 + x97 + x98 + x99
        + x100 + x101 + x102 + x103 + x104 + x105 + x106 + x107 + x108 + x109
        + x110 + x111 + x112  = 1
 c5:    x113 + x114 + x115 + x116 + x117 + x118 + x119 + x120 + x121 + x122
        + x123 + x124 + x125 + x126 + x127 + x128 + x129 + x130 + x131 + x132
        + x133 + x134 + x135 + x136 + x137 + x138 + x139 + x140 + x141 + x142
        + x143 + x144 + x145 + x146 + x147 + x148  = 1
 c7:    x185 + x186 + x187 + x188 + x189 + x190 + x191 + x192 + x193 + x194
        + x195 + x196 + x197 + x198 + x199 + x200 + x201 + x202 + x203 + x204
        + x205 + x206 + x207 + x208 + x209 + x210 + x211 + x212 + x213 + x214
        + x215 + x216 + x217 + x218 + x219 + x220  = 1
[...]

这只是 8771 行的简短摘录。我看不到任何明显的错误。我读到可以将此 .lp 文件或 .sav 文件导入 cplex 交互式优化器以改进程序,但找不到任何进一步的信息。

调试和改进程序的典型方法是什么?

编辑:

在更改了一些小东西并为 objectice 值添加上限后,我得到了这样的输出(程序运行 3 个实例):

Instanz: 1

Row 'c2023' infeasible, all entries at implied bounds.
Presolve time = 0.02 sec. (2.66 ticks)

Instanz: 2

Row 'c2023' infeasible, all entries at implied bounds.
Presolve time = 0.02 sec. (2.70 ticks)

Instanz: 3

Infeasibility row 'c1':  0  = 1.
Presolve time = 0.00 sec. (0.45 ticks)

我不太确定,如何阅读。我的程序类和导出模型的分析都没有这么多的行数。

在哪里可以找到行 c2023 或 c1?

【问题讨论】:

  • 根目标是-10^37,这表明您的模型的java实现存在一些问题。您应该使用 .lp 扩展名执行 exportModel(),然后查看您实际发送到 cplex 的内容。
  • 谢谢大卫。我这样做了,现在我有一个包含 8700 行的文件,它们似乎是由约束引起的。它没有明显的错误。你能告诉我要寻找什么,或者给我一个有很好信息的来源吗?

标签: java cplex


【解决方案1】:

分析 .lp(或 .sav)文件,假设它没有找到可行的解决方案。从命令行启动 cplex。

cplex> read filename.lp
cplex> optimize
.....  [output log]
cplex> conflict
cplex> write filename.iis

如果 filename.lp 有一个不可行的解决方案,那么 filename.iis 将包含约束的“不可约不可行子集”,这通常可以让您更好地了解问题所在。您应该像在 Java 程序中那样运行交互式 cplex 获得类似的行为。 您可以通过命名变量和约束来使 .lp 文件更有用。您可以使用 .setName() 方法,也可以使用构造函数参数。

【讨论】:

  • 嗨,大卫,感谢您的回答。我跟着你的步骤。但输出 .iis 文件并没有真正帮助我。它包含 12000 行,包含约束。但他们看起来并不真的有什么问题。是否以某种方式标记了约束的“不可约不可行子集”?
  • 您可以根据已知的解决方案在目标上添加界限。在您的情况下,如果您认为应该有一个比 100 更好的解决方案,您可以将 x1 - x2
  • 谢谢,我实现了上限。 eclipse 输出现在更精确了。而且我认为计算时间也有所改善。我在上面提到过。
  • 问题已解决:我使用的实例在我的限制下无法解决。我发现这个link 可能有助于其他阅读此内容的人诊断不可行性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2018-05-08
相关资源
最近更新 更多