Как подвести итоги за все в Julia / JuMP v 1.10 - PullRequest
1 голос
/ 18 мая 2019

Я видел устаревший ответ в следующей ветке ( Как сделать «для всех» в краткой записи в Julia / JuMP ), которому, к сожалению, 3 года, но это именно то, что я хочу.Однако код завершается сбоем из-за ряда синтаксических ошибок, поскольку функция sum () изменилась за последние несколько лет.

Для моего кода я обнаружил, что функция sum () работает только для одной индексной переменной i,но если я включу другую переменную j, функция перестает работать.Я также использую ноутбук Jupyter, если это имеет какое-либо значение.Любые идеи?

Using JuMP
ZS = Model(with_optimizer(Gurobi.Optimizer))

P = [[10 -20];
    [30 -40]]

@variable(ZS, x[1,1:2])
@variable(ZS, y[1:2,1])


@objective(ZS, Max, sum(x[i]*P[i,j]*y[j] for i=1:2 for j=1:2)) 


@constraint(ZS, con1, x[1] + x[2] <= 1)
@constraint(ZS, con2, y[1] + y[2] <= 1)

optimize!(ZS)

Для этого примера кода я получил ошибку «ключ не найден»

1 Ответ

0 голосов
/ 18 мая 2019

Измените определения переменных, чтобы они были одномерными:

@variable(ZS, x[1:2])
@variable(ZS, y[1:2])

и все должно работать как положено.

В качестве альтернативы оставьте x и y двумерными и переопределите вашу цель и ограничения следующим образом:

@objective(ZS, Max, sum(x[1,i]*P[i,j]*y[j,1] for i=1:2 for j=1:2)) 

@constraint(ZS, con1, x[1,1] + x[1,2] <= 1)
@constraint(ZS, con2, y[1,1] + y[2,1] <= 1)

В качестве примечания вы можете определить P более просто так:

julia> P = [10 -20
            30 -40]
2×2 Array{Int64,2}:
 10  -20
 30  -40
...