Как определить выражение JuMP, зависящее от значения индекса - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь определить @NLexpression в JuMP, который имеет разные спецификации для разных индексов. В приведенном ниже примере я хочу, чтобы выражение y[j,k] было определено как 1/(x[j] - x[k]), когда j != k, и приняло какое-то другое значение, когда j == k. Я могу смоделировать это поведение, определив вспомогательную переменную z и добавив ограничения, зависящие от значений индекса. Есть ли аналогичный способ определения выражения, зависящего от значений индекса?

using JuMP, Ipopt

model = JuMP.Model(with_optimizer(Ipopt.Optimizer))

@variable(model, 0 <= x[1:2])
@NLexpression(model, y[j=1:2,k=1:2], 1/(x[j] - x[k])) # <- problematic line

@variable(model, z[1:2,1:2])
for j=1:2, k=1:2
    if j == k
        @constraint(model, z[j,k] == 1)
    else
        @NLconstraint(model, z[j,k] == 1/(p[j] - p[k]))
    end
end

display(model)

1 Ответ

2 голосов
/ 15 апреля 2020

Вы не обязаны использовать макросы JuMP для создания контейнеров для выражений. Вы должны быть в состоянии условно создать выражения следующим образом:

model = JuMP.Model()

@variable(model, 0 <= x[1:2])
y = Dict()  # Or Array, if you prefer.
for j=1:2, k=1:2
    if j == k
        y[j,k] = 1
    else
        y[j,k] = @NLexpression(model, 1/(p[j] - p[k]))
    end
end
...