Как найти индекс набора в 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

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


person Cam    schedule 13.08.2015    source источник
comment
Не забудьте принять ответы на свои предыдущие вопросы - это побудит людей ответить на ваши новые вопросы!   -  person IainDunning    schedule 13.08.2015
comment
Когда вы говорите set, похоже, вы имеете в виду список / массив, и это существенное соображение. Вы не можете индексировать набор. Я не уверен, что вы можете перебирать набор, либо вам может понадобиться использовать collect (). Зацикливать подробные индексы? Вы имеете в виду что-то вроде list = [list [x] for x in [1: length (list)]]?   -  person Chase CB    schedule 15.08.2015


Ответы (1)


Опубликованный вами код не работает, потому что вы пытаетесь проиндексировать 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
person IainDunning    schedule 13.08.2015
comment
это сработало! однако у меня возникают проблемы с попыткой сделать это при распечатке моих переменных. Я добавил к своему вопросу код новой ошибки, которая у меня возникла. Надеюсь, у вас есть ответ! - person Cam; 13.08.2015
comment
Вам нужно 1:n, например for i in 1:n - сейчас у вас только for i in n - person IainDunning; 14.08.2015