2015-01-04 65 views
1

有没有办法让某些功能如isinteger()与JuMPArrays一起工作? 我正在使用Julia/JuMP来解决优化问题,并且在得到解决方案后,我想检查解决方案是否为整数。因此,这里是我写的:JuMPArrays有哪些功能?

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

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

回答

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,因此用户需要明确地说,他们希望做的事情之前正常朱莉娅阵列。

无论如何,你不应该使用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

+0

实际上,我们建议使用''iround(X [1])''。 – mlubin

+0

IainDunning添加'[:]'没有帮助!我仍然无法使用'isinteger'和'xstar'。另外,请你向我介绍一份描述JuMPArrays和Julia的区别的文件。 关于'isinteger'函数,是不是有一个精确的阈值,以便它可以识别'0.9999'为'1'?像'isinteger(value,precision)'。 – Ana

+0

@mlubin'iround'只会在其实际的'Bin',在这个例子中它只是一个连续变量。 – IainDunning