2015-08-13 3 views
1

Я пытаюсь создать модель линейной оптимизации. У меня есть набор, который выглядит так:Как найти индекс набора в Julia/JuMP?

si=[1,51,39,400909,1244] 
sj=[31,47,5] 

Номера в этом наборе представляют коды. Я пытаюсь выполнить цикл через набор, чтобы добавить ограничение к моей модели, но я не хочу перебирать множества, используя их значения, я хочу прокручивать множества на основе их индексов. Вот код, у меня сейчас:

si=[1,51,39,400909,1244] 
sj=[31,47,5] 

c= [3 5 2; 
    4 3 5; 
    4 5 3; 
    5 4 3; 
    3 5 4] 
b= [80; 
    75; 
    80; 
    120; 
    60] 
# x_ij >= 0 ∀ i = 1,...,5, j = 1,...,3 
@defVar(m, x[i in si,j in sj] >= 0) 
@setObjective(m,Min,sum{c[i,j]*x[i,j],i in si, j in sj}) 
# ∀j = 1,...,3 
for j in sj 
    @addConstraint(m, sum{x[i,j],i in si} <= 480) 
end 
for i in si 
    @addConstraint(m, sum{x[i,j],j in sj} >= b[i]) 
end 

я получаю сообщение об ошибке, потому что числа в наборах слишком велики. Кто-нибудь знает, как перебирать индексы? Или у кого-то есть другой способ сделать это?

У меня также есть проблемы с печатью моего решения. Вот мой код:

for i in n 
    for j in p 
     println("x",i,",",j,"= ", getValue(x[i,j])) 
    end 
end (incorporating Iain Dunning's answer from below) 

Однако выход только читает

Objective value: 1165.0 
x5,3= 0.0 

Вы знаете, как исправить выход, так что я могу читать значения моих переменных?

+2

Пожалуйста, не забудьте принять ответы на свои предыдущие вопросы - это будет способствовать тому, что люди ответят на ваши новые вопросы! – IainDunning

+0

Когда вы говорите «set», похоже, что вы имеете в виду список/массив, и это материальное соображение. Вы не можете индексировать в набор. Я не уверен, что вы можете выполнить цикл через набор, возможно, вам понадобится использовать функцию collect(). Провести тщательные индексы? Вы имеете в виду что-то по строкам списка = [list [x] для x в [1: length (list)]]? –

ответ

4

Код, который вы опубликовали, не работает, потому что вы пытаетесь проиндексировать c, например. 400909,47. Попробуйте следующее:

n = length(si) 
p = length(sj) 

@variable(m, x[i=1:n,j=1:p] >= 0) 
@objective(m,Min,sum{c[i,j]*x[i,j],i=1:n,j=1:p}) 
for j in 1:p 
    @constraint(m, sum{x[i,j],i=1:n} <= 480) 
end 
for i in 1:n 
    @constraint(m, sum{x[i,j],j=1:p} >= b[i]) 
end 
+0

, который сработал! однако у меня возникает проблема с попыткой сделать это при печати моих переменных. Я добавил к моему вопросу код с новой ошибкой, которую у меня есть. Надеюсь, у вас есть ответ! – Cam

+1

Вам нужно '1: n', например. 'for i in 1: n' - прямо сейчас у вас просто есть' for i in n' – IainDunning

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