Как инициализировать пустой массив ограничений, связанных с моделью в JuMP?

В моем алгоритме я динамически добавляю 3 разных набора ограничений к модели (m1), которые затем сохраняю в 3 массивах ConstraintRef[] (а именно a,b,c). Количество добавляемых ограничений отличается от итерации к итерации. Мне также нужно получить доступ к двойным значениям этих ограничений после его решения, что для этой модели не является проблемой (например, dual.(a)). Однако в какой-то момент моего алгоритма мне нужно решить копию моей модели (m2). После ее решения я не могу запросить дуалы, так как в массивах a,b,c нет никакой информации о m2.

Есть ли способ связать/зарегистрировать имена массивов с моделью, чтобы при копировании модели я мог эффективно получать доступ к двойным значениям?

Обновление, вот небольшой пример:

using JuMP
using GLPK

a = ConstraintRef[]
m1 = Model(GLPK.Optimizer)
@variable(m1,x)
con1 = @constraint(m1, x==2)
push!(a,con1)
optimize!(m1)
d = dual.(a)

# (..) I keep adding constraints to 'a'

m2 = copy(m1)
set_optimizer(m2, GLPK.Optimizer)

# (..) I keep populating the set of constraints in 'a'

optimize!(m2)

Что я хочу сделать, так это получить двойники всех ограничений, включенных в a, но для m2. Очевидно, что dual.(a) не работает. Я добавляю ограничения как анонимные, потому что заранее не знаю, сколько мне нужно добавить на каждой итерации.


person Berni    schedule 08.01.2021    source источник


Ответы (1)


Помочь будет легче, если вы предоставите минимальный рабочий пример того, чего вы пытаетесь достичь.

Однако вы, вероятно, ищете reference_map, который возвращается из copy_model, который сопоставляет объекты в исходной модели и скопированный объект в новой модели:

model = Model()
@variable(model, x)
@constraint(model, cref, x == 2)

new_model, reference_map = copy_model(model)
x_new = reference_map[x]
cref_new = reference_map[cref]

Документы: https://jump.dev/JuMP.jl/dev/reference/models/#JuMP.copy_model

person Oscar Dowson    schedule 10.01.2021
comment
Спасибо за ответ. Я знаю о reference_map и это не совсем то, что я ищу. Как вы сказали, я обновил описание вопроса небольшим примером. - person Berni; 11.01.2021
comment
Вам нужно сопоставить каждый элемент вектора: [dual(reference_map[ai]) for ai in a]. - person Oscar Dowson; 11.01.2021
comment
Спасибо, это помогает - person Berni; 16.01.2021