[英]How does one elegantly initialize start values or parameter values when creating a julia JuMP parameter or variable container?
希望 Julia 或 JuMP 專家可以幫助我如何執行以下操作(抱歉,因為我是該語言的新手並嘗試了所有資源但無法找到解決此問題的方法)
創建 JuMP 變量容器時,我試圖初始化所有變量的起始值。
我有一個 function 定義如下:
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
我想初始化幾個 model 變量,比方說產品的家庭消費。
@variable(model, 0.001 <= Xᵢ[h, g]) # where h = ["HOH"] and g = ["BRD", "MLK"]
這個變量可以使用上面的 function 初始化。 它應該是"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])
一個更簡單的例子:
我有一些 function f = x^2 + y^2
和 arrays 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
。
做類似的事情:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.