ОШИБКА при попытке доступа к массиву 30 × 26 {VariableRef, 2} по индексу [1, 0] - PullRequest
0 голосов
/ 10 ноября 2019

У меня возникают проблемы, когда я хочу назначить работников на разные смены в соответствии с требованиями. Они могут быть в две смены в день.

Но я не знаю, почему проблема с массивами, я новичок в Юлии

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 голосов
/ 11 ноября 2019

Первая ошибка появляется в этой строке:

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, который в настоящее время идет от 1 до 31 в первом индексе (for i in 1:turnos + 1). Это также нарушит ваш код, потому что ваш массив имеет только размер 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

Но я не понимаю вашу модель, поэтому не знаю, пытаетесь ли вы это сделать,Лучший совет, который я могу вам дать, - лучше ознакомиться с индексированием официальных документов на простых примерах.

...