【问题标题】:Cplex Java API: Very large numbers (> 64bit) or exact floating point numbersCplex Java API:非常大的数字(> 64 位)或精确的浮点数
【发布时间】:2023-03-04 11:12:01
【问题描述】:

在我的最小化问题中,我需要最小化一个因子可能非常大的项(例如,在某些情况下为 2^200)。例如,我需要添加客观术语,例如

objective.addTerm(vars.get(i).get(j), math.pow(2,200); // vars is a list of lists of IloNumVar, objective is of type IloLinearNumExpr
// ... Add terms for all cvars ...
cplex.addMinimize(objective);

有没有办法将这么大的客观术语添加到 cplex 中?我正在运行 cplex 12.3,API 只允许我传递 double 类型的变量。好像不支持 BigIntegers?

另一种解决方案是将所有值缩小到 [0,2^32] 范围内。然而,由于舍入误差,结果并不是最优的。 cplex 是否支持 BigDecimals 或某些等效类型?

【问题讨论】:

  • 我认为你只需要扩展它。如果您有一个很大的问题(变量和约束的数量),那么您通常只会在一定的公差范围内证明最优性。与最优容差相比,大数的舍入误差可能并不显着。默认的最优容差类似于 1e-5,我在一些问题上更加严格;但通常我们倾向于放松这一点并接受更大的容差以获得合理的运行时间。

标签: java cplex


【解决方案1】:

要具体回答您的问题,不,不支持 BigInteger。您可以通过查看CPLEX Java Reference Manual 来验证这一点。

正如 cmets 中所提到的,您可能希望缩放这些大系数。对于变量上限,值得记住的是,CPX_INFBOUND (1.0e+20) 被视为无穷大(例如,参见CPXXnewcols 的文档;这是针对 C 可调用库的,但仍然相关)。另外,请确保您没有“在目标函数中找到的系数有很大的变化(例如,六个或更多数量级)”,否则您可能会遇到numeric difficulties

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多