我在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)
与此同时,'only'cplex程序仍然可以为此实例计算解决方案。
由于我是cplex和java的新手,我不知道如何解释这个输出。
我想到了这个:
- 由于我的程序与上面提到的“just”cplex实现非常相似,因此约束的数量不能太高,导致计算量过大。
- 当它解决一个小实例时,它也应该运行其他的实例,这些实例适用于“正常”的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行?
答案 0 :(得分: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()方法,也可以使用构造函数参数。