1

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

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

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

4

1 回答 1

1

JuMPArray因此,通常您可以使用a 从 a 中获取底层数组[:],例如

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。

于 2015-01-04T22:26:26.147 回答