【发布时间】: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 行的文件,它们似乎是由约束引起的。它没有明显的错误。你能告诉我要寻找什么,或者给我一个有很好信息的来源吗?