2016-11-24 15 views
0

У меня есть простая математика прога, что я пытаюсь решить:JuMP ограничение макро изменение типа ранее объявленные переменная

m = Model(solver=MosekSolver()) 
@variable(m, x[1:8] >= 0) 
@objective(m,Min,sum(x)) 
@constraint(m,A*x .== given) 
@constraint(m, x, sum(x)==1) 

status = solve(m) 

println("x = ", getvalue(x)) 

А некоторая матрица с типом Array{Float64,2

Линия:

@constraint(m, x, sum(x)==1))

Изменяет тип x от Array{JuMP.Variable,1} до JuMP.ConstraintRef{JuMP.Model,JuMP.GenericRangeConstraint{JuMP.GenericAffExpr{Float64,JuMP.Variable}}}.

  1. Так как x был ранее объявлен как переменный не должен типа остается теми же? (Кроме того, если выше линии выполняется, все еще работает, но, getvalue не будет в связи с изменением типа.)

  2. Есть ли способ, чтобы добавить суммирования ограничений без изменения типа x

ответ

1

относятся к JuMP documentation:

Constraint Ссылки

Чтобы управлять ограничениями после создания, необходимо, чтобы сохранял ссылку. Самый простой способ сделать это состоит в использовании специальных три-аргумент с именем синтаксиса ограничения для @constraint, который дополнительно позволяет создавать группы ограничений проиндексированных множеств аналогичны @variable

Так как JuMP работает, как и ожидалось, почему бы не @constraint(m, anothersymbol, sum(x)==1)?

0

сделать это как так

@constraint(m, constr, A*x .== given) 

@constraint(m, constr2, sum(x) == 1)