【问题标题】:Julia JuMP returns Binary variable at 0.99Julia JuMP 在 0.99 返回二进制变量
【发布时间】:2019-07-30 09:01:03
【问题描述】:

我无法将整个代码放在这里,并且无法用小代码重现问题,但这里是代码的开头:

using JuMP, Cbc, StatsBase

n = 3;
V = 1:(2n+1);

model = Model(with_optimizer(Cbc.Optimizer, seconds=120));

@variable(model, x[V], Bin);

...

@objective(model, Min, total_blah);

JuMP.optimize!(model)
result = termination_status(model)

JuMP.objective_value(model)

xsol = JuMP.value.(x);

我遇到的问题是求解器返回一个解决方案,其中一些 xsol 具有 0.99995 之类的值,我期待二进制,即 0 或 1。

有人可以解释这种行为吗?

【问题讨论】:

  • 你能链接到代码吗?
  • 也许求解器无法在您设置的 120 秒时间限制内找到可行的解决方案?您可以尝试将maxSolutions=1ratioGap 设置为足够大的值以使求解器在合理的时间内终止,而不是使用时间限制。
  • 求解器具有整数可行性容差。我相信 CBC 为此使用默认值 1e-6。

标签: julia julia-jump


【解决方案1】:

我查了一下,CBC 有一个名为integerTolerance(或integerT)的选项,可以帮助 CBC 确定变量是否为整数值。使用 CBC.exe,我看到:

Coin:integerTolerance
integerTolerance has value 1e-006

事实上,默认值为 1e-6。您不能将其设置为零,但可以将其变小 (valid range is 1e-020 to 0.5)。 (我所知道的唯一允许将此容差设置为零的求解器是 Cplex;通常这样做会导致更长的求解时间)。

一般来说,我建议保持原样。如果与整数值的微小偏差让您感到恼火,我会在打印之前对解决方案中的整数变量进行舍入。这提供了更好看的解决方案(但这个舍入步骤可能会使解决方案稍微不可行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多