错误尝试访问索引[1,0]的30×26 Array {VariableRef,2}

时间:2019-11-10 17:16:36

标签: arrays indexing julia scheduled-tasks julia-jump

当我要根据要求满足不同的班次分配工人时遇到问题。他们每天可以轮班两次。

但是我不知道为什么出现数组问题,我是Julia的新人

empleados=26;
turnos=30;
requerimiento=[3,4,1,1,2,2,4,3,1,3,3,1,2,4,2,4,3,2,1,2,2,2,2,2,2,3]
costo=28;

using JuMP
using Gurobi
m = Model(with_optimizer(Gurobi.Optimizer))

@variable(m, x[1:turnos,1:empleados]<=1,Bin)

@objective(m, Min, costo * sum(x))    

for i in 1:turnos+1,j in 1:empleados
    @constraint(m,x[i,j] + x[i,j-1] + x[i,j+1]  <= 2)
end
for i in 1:turnos+3,j in 1:empleados
    @constraint(m, x[i,j]+x[i,j-2]+x[i,j-3]+x[i,j+3]+x[i,j+2] <= 1) 
end
    @constraint(m, sum(x[i,:]) for i in i:turnos >=requerimiento[i])

***ERROR***
BoundsError: attempt to access 30×26 Array{VariableRef,2} at index [1, 0]

Stacktrace:
 [1] getindex(::Array{VariableRef,2}, ::Int64, ::Int64) at .\array.jl:729
 [2] macro expansion at C:\Users\DELL\.julia\packages\JuMP\MsUSY\src\macros.jl:390 [inlined]
 [3] top-level scope at .\In[103]:15

1 个答案:

答案 0 :(得分:0)

第一个错误出现在此行:

for i in 1:turnos+1,j in 1:empleados
    @constraint(m,x[i,j] + x[i,j-1] + x[i,j+1]  <= 2)
end

在Julia中,通常从1开始对数组进行索引(查找基于1的索引)。这与其他语言(例如python)不同。

这意味着如果数组的大小为(30,26),则只能在第一个维度上使用1到30的索引,在第二个维度上使用1到26的索引。

您的变量x的大小为30x26,但是在您的循环中,您尝试调用元素x[1,0](因为您要查询x[i,j - 1]且j从1)。 通过重新定义索引或范围来解决此问题后,x[i,j+1]部分将遇到另一个问题,因为您将尝试访问也不存在的x[1,27]。  您还需要修复i的范围,该范围当前在第一个索引(for i in 1:turnos + 1)中从1到31。这也会破坏代码,因为您的数组在第一个维度上的大小仅为30。

最后,您要构建的最后一行

@constraint(m, sum(x[i,:]) for i in i:turnos >=requerimiento[i])

这是一个错误,因为您正在要求ii到另一个值,这没有意义。

因此,您只需要仔细注意如何迭代数组即可。

一种使该行工作的方法是:

for i in 1:turnos,j in 2:empleados-1
       @constraint(m,x[i,j] + x[i,j-1] + x[i,j+1]  <= 2)
end

但是我不了解您的模型,所以我不知道您是否正在尝试这样做。我可以提供的最佳建议是使用简单的示例更好地熟悉official docs上的索引编制。