当我要根据要求满足不同的班次分配工人时遇到问题。他们每天可以轮班两次。
但是我不知道为什么出现数组问题,我是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
答案 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])
这是一个错误,因为您正在要求i
从i
到另一个值,这没有意义。
因此,您只需要仔细注意如何迭代数组即可。
一种使该行工作的方法是:
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上的索引编制。