Задача оптимизации в Julia - Использование элементов массива в ограничении - PullRequest
1 голос
/ 18 июня 2020

Я выполнил следующий код в Julia, пытаясь решить простую математическую задачу.

model = Model(GLPK.Optimizer)
@variable(model, x[1:4])
@variable(model, y)
@objective(model, Min, 2*sum(x[i] for i in 1:4) + 5*y +18)
@constraint(model, 5*sum(x[i] for i in 1:4) + y >= 6 )
@constraint(model, (x[i] for i in 1:4) >= 0)
@constraint(model, y >= 2)
@time JuMP.optimize!(model)

Но когда я запускаю программу, я получаю эту ошибку:

MethodError: no method matching -(::Base.Generator{UnitRange{Int64},var"#143#144"}, ::Int64)
Closest candidates are:
 -(!Matched::Complex{Bool}, ::Real) at complex.jl:307
-(!Matched::Missing, ::Number) at missing.jl:115
-(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:108
 ...

То, что я пытаюсь сделать в строке 6 (@constraint(model, (x[i] for i in 1:4) >= 0) - установить ограничение, которое каждый отдельный элемент массива x больше нуля. Например:

x[1]>=0, x[2]>=0, x[3]>=0, x[4]>=0

Заранее спасибо!

1 Ответ

1 голос
/ 18 июня 2020

Я не уверен, почему он сообщает об ошибке для -, но причина довольно проста.

julia> (x[i] for i in 1:4)
Base.Generator{UnitRange{Int64},var"#5#6"}(var"#5#6"(), 1:4)

Это генератор, вы можете перебирать его; вы можете collect его в список (с каким-то макетом x для демонстрации):

julia> x = rand(4);

julia> collect(x[i] for i in 1:4)
4-element Array{Float64,1}:
 0.82205289980846   
 0.1753822661463882 
 0.3134638596396617 
 0.24751968827319581

Но, конечно, нет смысла сравнивать генератор с целым числом:

julia> (x[i] for i in 1:4) >= 0
ERROR: MethodError: no method matching isless(::Int64, ::Base.Generator{UnitRange{Int64},var"#13#14"})

То, что вы скорее всего хотите, это:

julia> collect(x[i] >= 0 for i in 1:4)
4-element Array{Bool,1}:
 1
 1
 1
 1

Обратите внимание, что здесь использовалась обычная Julia. JUMP использует тот же синтаксис внутри макроса и, вероятно, попытается придерживаться той же семантики, но внутренне переписывает код. И все же сравнивать генератор с числом не имеет смысла.

...