Julia JuMP: ¿cómo usar una variable con CartesianIndex? En la programación en Julia con el paquete JuMP, es posible utilizar variables con el tipo de dato CartesianIndex. Un CartesianIndex representa un índice en una matriz multidimensional. Para utilizar este tipo de variable en JuMP, se pueden seguir los siguientes pasos: 1. Importar el paquete JuMP y el paquete Base.Cartesian: “`julia using JuMP using Base.Cartesian “` 2. Definir el modelo de optimización: “`julia model = Model() “` 3. Crear un conjunto de índices cartesianos: “`julia indices = CartesianRange((1:3, 1:2)) “` 4. Definir una variable con el tipo CartesianIndex: “`julia @variables(model, x[indices], base = CartesianIndex) “` Con esta línea de código, se creará una variable x para cada índice en el conjunto “indices”. 5. Ahora, se pueden utilizar estas variables en las restricciones y la función objetivo del modelo. Espero que esta guía te sea útil para utilizar variables con el tipo de dato CartesianIndex en Julia JuMP.
Con el fin de reducir el tamaño de mi variable, deseo definir un modelo JuMP con un CartesianIndex.
He intentado el siguiente código, pero sigo teniendo problemas al utilizar el CartesianIndex con la variable:
using JuMP, Cbc, IterTools
Random.seed!(3)
N = 10
cost = rand(1:4, N, N)
# reducir el tamaño utilizando un índice
idx = findall(cost .< 2)
# reducir el tamaño de 100 a 22 variables
model = Model(with_optimizer(Cbc.Optimizer));
@variable(model, x[idx], Bin);
# restricción para que solo haya sum(x) = 1 en cada fila
for i in 1:N
# creando un segundo CartesianIndex para seleccionar la fila i, luego interseccionarlo con los 22 índices de x
cart_idx = CartesianIndex.(collect(product(i,1:N)))
cart_idx = intersect(cart_idx, idx)
@constraint(model, sum(x[cart_idx]) == 1)
# ERROR: KeyError: key CartesianIndex{2}[CartesianIndex(1, 5), CartesianIndex(1, 6)] not found
end
La última línea de código en el bucle genera el siguiente error:
ERROR: KeyError: key CartesianIndex{2}[CartesianIndex(1, 5), CartesianIndex(1, 6)] not found
¿Es posible utilizar CartesianIndex con una variable de JuMP y cómo corregir el problema mencionado?
davy.ai
Para utilizar CartesianIndex con una variable JuMP, es necesario convertirla a un índice regular utilizando la función
flatten
. Esta función convertirá el CartesianIndex a su correspondiente índice lineal en el arreglo original.Para corregir el error en el código anterior, puedes reemplazar la última línea del bucle con:
Esto debería resolver el KeyError y permitirte utilizar CartesianIndex con variables JuMP.