当前位置: 首页 > 知识库问答 >
问题:

JavaCplex结果不同于IBM优化工作室

南门飞
2023-03-14

我在IBM优化工作室中实现了一个LP问题,使用OPL来创建模型。验证模型后,我想把它放在Java,为模拟目的脚本参数。我找到了在Java使用我的OLP模型的最快方法,代码如下:

IloOplFactory.setDebugMode(false);
IloOplFactory oplF = new IloOplFactory();
IloOplErrorHandler errHandler = oplF.createOplErrorHandler(System.out);
IloOplModelSource modelSource = oplF.createOplModelSource("myModel.mod");
IloCplex cplex = null;
cplex = oplF.createCplex();
IloOplSettings settings = oplF.createOplSettings(errHandler);
IloOplModelDefinition def = oplF.createOplModelDefinition(modelSource, settings);
IloOplModel opl = oplF.createOplModel(def, cplex);

String inDataFile = "myData.dat";
IloOplDataSource dataSource = oplF.createOplDataSource(inDataFile);
opl.addDataSource(dataSource);

opl.generate();
opl.convertAllIntVars(); // converts integer bounds into LP compatible format
if (cplex.solve()) {
        double obj = opl.getCplex().getObjValue();
        System.out.println("OBJECTIVE: " + obj);
}

现在的问题是,如果我在IBM优化工作室和Java运行“myModel.mod”和“myData.dat”,我会得到非常不同的客观结果。

在IBM Optimization Studio中:

solution (optimal) with objective 125

在Java中:

Parallel mode: deterministic, using up to 4 threads for concurrent optimization.
Tried aggregator 1 time.
LP Presolve eliminated 0 rows and 1 columns.
Reduced LP has 5280 rows, 5325 columns, and 25525 nonzeros.
Presolve time = 0.01 sec. (3.77 ticks)

Iteration log . . .
Iteration:     1   Dual objective     =             0.000000
Iteration:   345   Dual objective     =            90.297455
Iteration:   568   Dual objective     =           117.206047
Perturbation started.
Iteration:   707   Dual objective     =           117.206047
Removing perturbation.
Reinitializing dual norms . . .

Dual simplex solved model.

OBJECTIVE: 117.20608137232513

我看了数据集和我的模型,低于125的目标甚至不可能(我用极值来确保我的目标变量之一是125,所以低于这一点的任何东西都不可能)。

有人知道为什么这些结果不同吗?与IBM相比,Java的设置中是否存在这样的问题?我是否可以将我的IBM optimization studio设置导入Java来测试这一点?

非常感谢。

编辑:这是IBM Optimization studio日志,我忘了包括这些日志。它确实显示了更多关于整数被截断的信息,但这是我第一次使用这两个程序,所以有人能帮我找到问题所在或这一切意味着什么吗?

Found incumbent of value 125.000000 after 0.00 sec. (0.53 ticks)
Tried aggregator 1 time.
MIP Presolve eliminated 5027 rows and 4764 columns.
MIP Presolve modified 1191 coefficients.
Reduced MIP has 253 rows, 562 columns, and 1958 nonzeros.
Reduced MIP has 562 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.02 sec. (8.46 ticks)
Probing fixed 8 vars, tightened 0 bounds.
Probing time = 0.00 sec. (2.86 ticks)
Tried aggregator 1 time.
MIP Presolve eliminated 158 rows and 306 columns.
MIP Presolve modified 293 coefficients.
Reduced MIP has 95 rows, 256 columns, and 632 nonzeros.
Reduced MIP has 256 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.02 sec. (1.73 ticks)
Probing fixed 6 vars, tightened 0 bounds.
Probing time = 0.00 sec. (0.12 ticks)
Tried aggregator 1 time.
MIP Presolve eliminated 29 rows and 30 columns.
MIP Presolve modified 2 coefficients.
Reduced MIP has 66 rows, 226 columns, and 522 nonzeros.
Reduced MIP has 226 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.00 sec. (0.42 ticks)
Probing time = 0.00 sec. (0.07 ticks)
Clique table members: 34.
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: deterministic, using up to 4 threads.
Root relaxation solution time = 0.00 sec. (0.36 ticks)

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

*     0+    0                          125.0000      123.0000             1.60%
      0     0      123.8469     4      125.0000      123.8469       62    0.92%
      0     0        cutoff            125.0000                     81    0.00%
Elapsed time = 0.09 sec. (17.09 ticks, tree = 0.00 MB, solutions = 1)

Zero-half cuts applied:  1
Gomory fractional cuts applied:  1

Root node processing (before b&c):
  Real time             =    0.09 sec. (17.22 ticks)
Parallel b&c, 4 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.09 sec. (17.22 ticks)

编辑2:我发现矩阵中的整数值为0。。1不是四舍五入为0或1,而是计为0.932。。。如何强制Java cplex对整数进行四舍五入?

已解决:它是“opl.convertalintvars();”这把一切都变成了双打。我从示例代码中删除了它,现在一切正常。

共有1个答案

东门焕
2023-03-14

你的模型在某些方面会有所不同。我怀疑整数变量可能被处理的方式——值125是一个整数,而117.2显然不是整数,日志显示它是作为一个直LP求解的。

查看两个模型解决方案中变量的值,并找到值不同的地方。希望两个解决方案中的许多变量值相似,这将有助于缩小搜索范围。

尝试将模型导出为LP文件或两者中的类似文件,并比较生成的模型。可以在CPLEX命令行解算器中解算两个导出的模型,并比较日志和结果。

尝试从另一个模型中的一个解决方案中修复一些值,然后重新求解。

另外,给我们提供更多来自OPL模型的日志输出。

 类似资料:
  • 当实验完成,下一步就是分析结果。 A/B测试工具将显示实验中的数据,并会告诉您使用数学方法和统计的帮助,网页上的不同变化如何执行,以及变化之间是否存在显着差异。 示例 如果网页上的图像降低了跳出率,当在网页上上传多个图像时可以判断决定是否有良好的转换。 如果您因此看到跳出率没有变化,请返回上一步并创建一个新的假设/变体以执行新的测试。 像VWO和Optimizely这样的工具可用于运行测试,但Go

  • 我是IBM的CMPLEX优化工作室的新手,我试图了解什么是实现我的目标的最佳方法。我试图通过为我的问题创建一个相关的表示,然后将其与CMPLEX求解器接口来实现一个决策优化解决方案,表示为混合整数线性程序。 最初,我开始用OPL语言开发模型。然而,由于我打算使用相同的模型但使用不同的数据动态调用解算器,从我的C应用程序中,我意识到通过CMPLEX C API(Concert技术的一部分)构建模型并

  • 这是一个优化问题,我正试图用我使用的opl代码来解决(稍微有点扭曲)。 opl代码为我提供了两种解决方案,即:{Product12,Product31} 当我使用docplex将此代码翻译为python语言时,我使用以下代码: 我明白了: ***问题没有解决方案 我不明白为什么我有不同的结果,有人能帮我吗? 先谢谢你。 当做

  • 我在这里漏掉了什么?我试过上/下现金,每个字节之间的空格。我不确定还能试什么。 这个问题开始是因为我在Python中实现了这个,但在我担心代码之前,我试图理解为什么这是不同的。

  • 当我在MySQL Workbench中查询一个表时,没有显示任何结果,结果部分只是空白,没有网格或任何东西。然而,如果我导出数据,它就在那里。直到几天前,一切都很顺利。 查询设置: 最大长度=65536 没有查询工作,一个例子将是

  • 我到处寻找解决方案,尝试了不同的解决方案,包括Chip Bennett在这里详细解释的解决方案,但我似乎仍然无法让它工作。 结果的第一页工作正常,但是从第2页开始,它只显示索引模板,并且仍然显示页面未找到。这是我的代码: 功能。php 提取查询参数的代码 循环代码: 任何建议将不胜感激。 编辑: 我还注意到,当我尝试访问第2页时,URL被修改了。 这是第1页URL: 第2页URL: