【问题标题】:How to find the index of a set in Julia/JuMP?如何在 Julia/JuMP 中找到集合的索引?
【发布时间】:2015-08-13 17:57:52
【问题描述】:

我正在尝试创建一个线性优化模型。我有一个看起来像这样的集合:

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

您知道如何修复输出以便我可以读取变量的值吗?

【问题讨论】:

  • 请记住接受您之前问题的答案 - 这将鼓励人们回答您的新问题!
  • 当您说“设置”时,您的意思似乎是列表/数组,这是一个重要的考虑因素。你不能索引到一个集合中。我不确定你是否可以遍历一个集合,或者你可能需要使用 collect()。循环彻底索引?您的意思类似于 list=[list[x] for x in [1:length(list)]]?

标签: julia julia-jump


【解决方案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

【讨论】:

  • 成功了!但是我在打印我的变量时遇到了问题。我在我的问题中添加了我遇到的新错误的代码。希望你有答案!
  • 您需要1:n,例如for i in 1:n - 现在你只有for i in n
猜你喜欢
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
相关资源
最近更新 更多