1

我在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 实现上工作。

java不能解决cplex仍然存在的一些问题吗?

编辑:

使用 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?

4

1 回答 1

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() 方法,或使用构造函数参数。

于 2013-08-22T02:58:51.777 回答