2015-01-04 6 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 (х [я]) ''. – mlubin

+0

IainDunning добавление '[:]' не помогло! Я все еще не мог использовать 'isinteger' с' xstar'. Кроме того, не могли бы вы сослаться на документ, описывающий разницу между JuMPArrays и Julia. И о функции 'isinteger', нехорошо иметь порог точности, чтобы он мог распознать' 0.9999' как '1'? Что-то вроде 'isinteger (значение, точность)'. – Ana

+0

@mlubin 'iround' вещь будет работать, только если это фактически' Bin', в примере это просто непрерывная переменная. – IainDunning

 Смежные вопросы

  • Нет связанных вопросов^_^