java - cplex java,未找到解决方案;如何使用exportModel()改进程序

标签 java cplex

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

程序(旅行推销员问题)针对一个非常小的问题实例(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 比较陌生,所以我不确定如何解释此输出。

我想到了这一点:

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

-当它解决一个小实例时,它还应该运行其他实例,这些实例适用于“只是”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 交互式优化器以改进程序,但找不到任何进一步的信息。

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

编辑:

更改一些小内容并添加目标值的上限后,我得到如下输出(程序运行 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 行?

最佳答案

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

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

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

关于java - cplex java,未找到解决方案;如何使用exportModel()改进程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18349516/

相关文章:

java - 如何对数组的间隔求和?

java - 使用管理员用户运行javaservice

python-3.x - 您如何指定 CPLEX 在 pyomo 中仅使用一个线程?

ios - 如何将 IBM CPLEX 应用于我的 iOS 项目?

javascript - OPL 脚本中的幂函数

java - 从歌曲中获取当前音频频率 - Java(也许使用 FFT?)

java - 如果使用 Android 后台服务,Flutter 卡在 'waiting for observatory port to be available'

Java Cplex 两个决策变量的乘积

c - "Symbols not found for Architecture x86_64"对于在 C 中使用 CPLEX API 的 MEX 文件

java - 如何将 Cucumber JUnit 步骤标记为失败但继续