我喜歡用Optim.jl
自動區分(autodiff=true
)來優化(最小化)下列給定函數(quad_function
)。Julia:使用`Optim.jl`和`autodiff`優化整數的代價函數
我的目標函數輪Real
值整數,因此是步驟。
當我使用autodiff
選項時,我的Real
值得到dual numbers(ForwardDiff.Dual
s)。但不幸的是沒有round
函數爲ForwardDiff.Dual
類型實施。因此我寫了一個roundtoint64
函數,它提取實部。這種方法在優化過程中會導致問題。
using Plots
plotlyjs()
function roundtoint64(x)
if typeof(x) <: ForwardDiff.Dual
roundtoint64(x.value)
else
Int64(round(x))
end
end
function quad_function(xs::Vector)
roundtoint64(xs[1])^2 + roundtoint64(xs[2])^2
end
x, y = linspace(-5, 5, 100), linspace(-5, 5, 100)
z = Surface((x,y)->quad_function([x,y]), x, y)
surface(x,y,z, linealpha = 0.3)
問題是,該optimize
功能立即收斂,不再繼續。
using Optim
res = Optim.optimize(
quad_function,
[5.0,5.0],
Newton(),
OptimizationOptions(
autodiff = true,
# show_trace = true
))
結果:
Results of Optimization Algorithm
* Algorithm: Newton's Method
* Starting Point: [5.0,5.0]
* Minimizer: [5.0,5.0]
* Minimum: 5.000000e+01
* Iterations: 0
* Convergence: true
* |x - x'| < 1.0e-32: false
* |f(x) - f(x')|/|f(x)| < 1.0e-32: false
* |g(x)| < 1.0e-08: true
* Reached Maximum Number of Iterations: false
* Objective Function Calls: 1
* Gradient Calls: 1
optimal_values = Optim.minimizer(res) # [5.0, 5.0]
optimum = Optim.minimum(res) # 50.0
我還試圖初始化optimize
功能與整數[5,5]
以避免舍入的東西的向量,但導致也問題找到的初始步長:
ERROR: InexactError()
in alphainit(::Int64, ::Array{Int64,1}, ::Array{Int64,1}, ::Int64) at /home/sebastian/.julia/v0.5/Optim/src/linesearch/hz_linesearch.jl:63
in optimize(::Optim.TwiceDifferentiableFunction, ::Array{Int64,1}, ::Optim.Newton, ::Optim.OptimizationOptions{Void}) at /home/sebastian/.julia/v0.5/Optim/src/newton.jl:69
in optimize(::Function, ::Array{Int64,1}, ::Optim.Newton, ::Optim.OptimizationOptions{Void}) at /home/sebastian/.julia/v0.5/Optim/src/optimize.jl:169
問題:有沒有辦法告訴optimize
只有e xplore整數空間?
更新: 我認爲與轉換的方法來Int64
問題是,我不再有ForwardDiff.Dual
S和因此不能計算任何衍生物/梯度。一個更好的round
函數怎麼可能是這樣的,哪些輪迴也可以嵌套雙重並且返回對偶?
該算法因梯度爲零而停止。你的問題並不是真的適合期待平滑功能的解算器。對於你的函數,試試像MIQP(混合整數二次規劃)求解器。 –
謝謝@ErwinKalvelagen我會檢查一下。但是你認爲總的來說,有一種方法可以實現這種我試圖做的映射,除非解算器不適合它嗎?因爲它在我的pers ctive中與光滑的函數沒有太大的距離...... – swiesend
它並不平坦,然後您將所有這些區域設置爲零梯度,本地nlp求解器可能會決定停止。對於基本上離散的問題,這實際上是錯誤的技術。 –