什么功能适用于JuMPArrays?

时间:2015-01-04 21:45:49

标签: julia julia-jump

有没有办法让某些功能如isinteger()与JuMPArrays一起使用? 我正在使用Julia / JuMP来解决优化问题,在我得到解决方案之后,我想检查解是否是整数。所以这就是我写的:

@defVar(m, 0<= x[1:3] <= 1)
...
xstar = getValue(x)
if isinteger(xstar)
  ...
end

我得到一个错误,说isinteger()没有匹配isinteger(:: JuMPArray)的方法。 感谢

1 个答案:

答案 0 :(得分:1)

因此,一般情况下,您可以使用JuMPArray[:]获取基础数组,例如

m = Model()
@variable(m, 0 <= x[1:3] <= 1)
@variable(m, 0 <= y[1:10, 1:10] <= 1)
solve(m)
xstar = getvalue(x)[:]
ystar = getvalue(y)[:,:]

请注意,原因是JuMPArrays不必从索引1开始,因此用户需要明确表示他们在执行操作之前需要正常的Julia数组。

无论如何,你不应该使用isinteger。求解者总是不会返回非常精确的答案,例如:他们可能会说x[1] = 0.999996,但他们的确意味着1。你应该做点什么

for i in 1:3
    if getvalue(x[i]) >= 0.999
        println("x[$i] is 1!")
    elseif getvalue(x[i]) <= 0.001
        println("x[$i] is 0!")
    end
end

确保您不会得到任何误报。如果变量被限制为整数或二进制,请使用iround,例如

for i in 1:3
    v = iround(getvalue(x[i]))
    if v == 1
        println("x[$i] is 1!")
    elseif v == 0
        println("x[$i] is 0!")
    end
end

但看起来在这种情况下你只是看到解决方案是自然为0还是1。