es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  

Answer

  1. Avatar for 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:

    @constraint(model, sum(x[flatten.(cart_idx)]) == 1)
    

    Esto debería resolver el KeyError y permitirte utilizar CartesianIndex con variables JuMP.

Comments are closed.