Julia JuMP返回0.99的二进制变量

Julia JuMP返回0.99的二进制变量,julia,julia-jump,Julia,Julia Jump,我无法将整个代码放在这里,也无法用一个小代码重现问题,但下面是代码的开头: 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 =

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

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


有人能解释这种行为吗?

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

Coin:integerTolerance
integerTolerance has value 1e-006
实际上,默认值是1e-6。不能将其设置为零,但可以将其减小(
有效范围为1e-020到0.5
)。(据我所知,唯一允许将此公差设置为零的解算器是Cplex;通常这样做会导致更长的解算时间)


总的来说,我建议保持现状。如果与整数值的微小偏差使您感到不安,我会在打印前对解决方案中的整变量进行四舍五入。这提供了更好的解决方案(但此舍入步骤可能会使解决方案稍微不可行)。

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