Я надеялся, что Джулия или эксперт JuMP помогут мне в том, как сделать следующее (извиняюсь, поскольку я новичок в языке и перепробовал все ресурсы, но не могу найти решение этой проблемы)
Я пытаюсь инициализировать начальные значения всех переменных при создании контейнера переменных JuMP.
У меня есть функция, определенная следующим образом:
function sam(i, j)
if i == "BRD" && j == "CAP"
return 5
elseif i == "BRD" && j == "LAB"
return 10
elseif i == "MLK" && j == "CAP"
return 20
elseif i == "MLK" && j == "LAB"
return 15
elseif i == "CAP" && j == "HOH"
return 25
elseif i == "HOH" && j == "BRD"
return 15
elseif i == "HOH" && j == "MLK"
return 35
else
return nothing
end
end
Я хочу инициализировать пару переменных модели, скажем, домашнее потребление продукта.
@variable(model, 0.001 <= Xᵢ[h, g]) # where h = ["HOH"] and g = ["BRD", "MLK"]
Эта переменная может быть инициализирована с помощью функции выше. Это должно быть "HOH" -> "BRD"
и "HOH" -> "MLK"
. Значит 15 и 35 соответственно.
Я могу выполнить эти инициализации, выполнив следующие действия:
set_start_value(Xᵢ["HOH", "BRD"], sam("HOH", "BRD"))
set_start_value(Xᵢ["HOH", "MLK"], sam("HOH", "MLK"))
Однако я надеялся, что будет лучший способ сделать это, используя опцию start
. Я пробовал следующее без успеха.
@variable(model, 0.001 <= Xᵢ[h, g], start = sam(h, g)) # option 1
@variable(model, 0.001 <= Xᵢ[h, g], start = sam.(h, g)) # option 2
@variable(model, 0.001 <= Xᵢ[h, g], start = sam.(permute(h), g)) # option 3
@variable(model, 0.001 <= Xᵢ[h, g], start = [sam(h,g) for h in h, for g in g]) # option 4
Тот же вопрос относится и к созданию @NLparameter`. Как это можно сделать для параметра. Варианты пробовали ниже:
@NLparameter(model, 0.001 <= FFᶠ[f][h] == sam(f, h))
@NLparameter(model, 0.001 <= FFᶠ[f][h] == sam.(f, h))
@NLparameter(model, 0.001 <= FFᶠ[f][h] == sam.(permute(f), h))
@NLparameter(model, 0.001 <= FFᶠ[f][h] == [sam(f,h) for f in f, for h in h])
Более простой пример:
У меня есть функция f = x^2 + y^2
и массивы x=[1,2,3,4,5,6]
и y=[1,2,3,4,5,6]
как мне написать:
@variable(model, v[x,y], start=f(x,y))
Так что value(v[1, 2])
начальное значение будет равно 1^2 + 2^2
, следовательно, 5
.
@Shayan не обязательно, я хочу инициализировать начальные переменные для переменных и параметров, которые я создал. Функция sam может возвращать значения, возможно, это не лучший способ сделать это, но это просто пример того, как я могу сделать это функционально. Я могу функционально инициализировать контейнер переменных (набор переменных)? Как я могу в той же строке инициализировать каждую отдельную переменную в этом контейнере пользовательским значением. Представь что-нибудь попроще у меня есть функция f = x^2 + y^2
и массивы x=[1,2,3,4,5,6]
и y=[1,2,3,4,5,6]
как мне написать @variable(model, v[x,y], start=f(x,y))
Сделайте что-нибудь вроде:
julia> using JuMP
julia> h, g = ["HOH"], ["BRD", "MLK"]
(["HOH"], ["BRD", "MLK"])
julia> model = Model()
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: NO_OPTIMIZER
Solver name: No optimizer attached.
julia> function sam(i, j)
if i == "HOH" && j == "BRD"
return 15
else
return nothing
end
end
sam (generic function with 1 method)
julia> @variable(model, 0.001 <= X[i=h, j=g], start = sam(i, j))
2-dimensional DenseAxisArray{VariableRef,2,...} with index sets:
Dimension 1, ["HOH"]
Dimension 2, ["BRD", "MLK"]
And data, a 1×2 Matrix{VariableRef}:
X[HOH,BRD] X[HOH,MLK]
julia> start_value.(X)
2-dimensional DenseAxisArray{Union{Nothing, Float64},2,...} with index sets:
Dimension 1, ["HOH"]
Dimension 2, ["BRD", "MLK"]
And data, a 1×2 Matrix{Union{Nothing, Float64}}:
15.0 nothing
Я думаю, мы могли бы сделать это более явным в документации. Я открыл проблему, чтобы исправить это: https://github.com/jump-dev/JuMP.jl/issues/3147
спасибо! не возражаешь, если я поправлю? рад представить PR, профиль @ajcost, если вы хотите назначить
Вам нужна лучшая замена для
sam
? Вы имеете в виду это?