- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在解决金融的标准优化问题 - 投资组合优化。在绝大多数情况下,NLopt 正在返回一个合理的解决方案。然而,在极少数情况下,SLSQP 算法似乎迭代到正确的解决方案,然后无缘无故地选择从迭代过程的大约三分之一返回一个非常明显次优的解决方案。有趣的是,通过很小的量改变初始参数向量可以解决这个问题。
我已经设法隔离了我正在谈论的行为的一个相对简单的工作示例。抱歉数字有点乱。这是我能做的最好的。以下代码可以剪切并粘贴到 Julia REPL 中,并且每次都会运行并打印目标函数和参数的值 NLopt
调用目标函数。我两次调用优化例程。如果您回滚下面代码打印的输出,您会注意到在第一次调用时,优化例程迭代到目标函数值为 0.0022
的良好解决方案。但随后无缘无故地回到了一个更早的解决方案,其中目标函数是 0.0007
,并返回它。第二次调用优化函数时,我使用了稍微不同的参数起始向量。同样,优化例程迭代到相同的好解,但这次它返回目标函数值为 0.0022
的好解。 .
那么,问题是:有谁知道为什么在第一种情况下,SLSQP 在迭代过程的大约三分之一中放弃了好的解决方案而支持更差的解决方案?如果是这样,有什么办法可以解决这个问题吗?
#-------------------------------------------
#Load NLopt package
using NLopt
#Define objective function for the portfolio optimisation problem (maximise expected return subject to variance constraint)
function obj_func!(param::Vector{Float64}, grad::Vector{Float64}, meanVec::Vector{Float64}, covMat::Matrix{Float64})
if length(grad) > 0
tempGrad = meanVec - covMat * param
for j = 1:length(grad)
grad[j] = tempGrad[j]
end
println("Gradient vector = " * string(grad))
end
println("Parameter vector = " * string(param))
fOut = dot(param, meanVec) - (1/2)*dot(param, covMat*param)
println("Objective function value = " * string(fOut))
return(fOut)
end
#Define standard equality constraint for the portfolio optimisation problem
function eq_con!(param::Vector{Float64}, grad::Vector{Float64})
if length(grad) > 0
for j = 1:length(grad)
grad[j] = 1.0
end
end
return(sum(param) - 1.0)
end
#Function to call the optimisation process with appropriate input parameters
function do_opt(meanVec::Vector{Float64}, covMat::Matrix{Float64}, paramInit::Vector{Float64})
opt1 = Opt(:LD_SLSQP, length(meanVec))
lower_bounds!(opt1, [0.0, 0.0, 0.05, 0.0, 0.0, 0.0])
upper_bounds!(opt1, [1.0, 1.0, 1.0, 1.0, 1.0, 1.0])
equality_constraint!(opt1, eq_con!)
ftol_rel!(opt1, 0.000001)
fObj = ((param, grad) -> obj_func!(param, grad, meanVec, covMat))
max_objective!(opt1, fObj)
(fObjOpt, paramOpt, flag) = optimize(opt1, paramInit)
println("Returned parameter vector = " * string(paramOpt))
println("Return objective function = " * string(fObjOpt))
end
#-------------------------------------------
#Inputs to optimisation
meanVec = [0.00238374894628471,0.0006879970888824095,0.00015027322404371585,0.0008440624572209092,-0.004949409024535505,-0.0011493778903180567]
covMat = [8.448145928621056e-5 1.9555283947528615e-5 0.0 1.7716366331331983e-5 1.5054664977783003e-5 2.1496436765051825e-6;
1.9555283947528615e-5 0.00017068536691928327 0.0 1.4272576023325365e-5 4.2993023110905543e-5 1.047156519965148e-5;
0.0 0.0 0.0 0.0 0.0 0.0;
1.7716366331331983e-5 1.4272576023325365e-5 0.0 6.577888700124854e-5 3.957059294420261e-6 7.365234067319808e-6
1.5054664977783003e-5 4.2993023110905543e-5 0.0 3.957059294420261e-6 0.0001288060347757139 6.457128839875466e-6
2.1496436765051825e-6 1.047156519965148e-5 0.0 7.365234067319808e-6 6.457128839875466e-6 0.00010385067478418426]
paramInit = [0.0,0.9496114216578236,0.050388578342176464,0.0,0.0,0.0]
#Call the optimisation function
do_opt(meanVec, covMat, paramInit)
#Re-define initial parameters to very similar numbers
paramInit = [0.0,0.95,0.05,0.0,0.0,0.0]
#Call the optimisation function again
do_opt(meanVec, covMat, paramInit)
最佳答案
SLSQP 是一个 受限 优化算法。每一轮它都必须检查是否具有最佳目标值并满足约束条件。当满足约束条件时,最终输出是最佳值。
通过更改 eq_con!
打印出约束的值到:
function eq_con!(param::Vector{Float64}, grad::Vector{Float64})
if length(grad) > 0
for j = 1:length(grad)
grad[j] = 1.0
end
end
@show sum(param)-1.0
return(sum(param) - 1.0)
end
Objective function value = 0.0007628202546187453
sum(param) - 1.0 = 0.0
For equality constraints, a small positive tolerance is strongly advised in order to allow NLopt to converge even if the equality constraint is slightly nonzero.
equality_constraint!
调用
do_opt
到
equality_constraint!(opt1, eq_con!,0.00000001)
关于julia - NLopt SLSQP 放弃了好的解决方案,取而代之的是旧的、更差的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35213506/
我在 openMDAO 中使用 SLSQP 算法,但我无法理解它的实际工作原理。我只是在看常见的抛物面示例,它有 2 个设计变量,旨在无任何限制地最小化 f。通过打印每次迭代的 x、y 和 f 的值(
我正在尝试使用 Scipy 的 Optimize 来运行一些曲线拟合。我不使用 polyfit 这样做,因为考虑到我所拥有的关系,我想确保曲线是单调的。所以假设硫和温度之间有以下关系: sulphur
我想从 Scipy 求解器“SLSQP”中获取迭代信息。我使用回调函数开发了一个代码,如下所述。 from scipy.optimize import minimize, rosen, rosen_d
我想最小化一个目标函数,该函数在每一步中调用模拟软件并返回一个标量。有没有办法限制目标函数的结果?例如,我想获取使结果尽可能接近 1 的变量值。 我尝试简单地从目标函数的结果中减去 1,但这没有帮助。
我试图在约束下找到最佳解决方案,并将 SciPy 最小化与 SLSQP 结合使用。它可以完美地工作,没有任何单一约束的问题。一旦我添加另一个约束,它就会成功完成,但没有达到优化目标。 我假设我的问题与
出于某种目的,在我的代码的一部分中,我想猜测最适合我的数据并且在某些点上不递减的五次多项式。 示例代码为: import numpy as np import scipy.optimize as op
我正在通过 OpenMDAO 使用 SLSQP 来解决优化问题。优化工作充分;最后的 SLSQP 输出如下: Optimization terminated successfully. (Exi
我正在解决金融的标准优化问题 - 投资组合优化。在绝大多数情况下,NLopt 正在返回一个合理的解决方案。然而,在极少数情况下,SLSQP 算法似乎迭代到正确的解决方案,然后无缘无故地选择从迭代过程的
我仍然是Python的初学者,所以如果这太微不足道,我很抱歉。我想计算一个共有 12 个变量的函数的最小值。在这 12 个变量中,10 个固定为给定值,其余 2 个可自由计算最小值。这是我的代码示例。
我在尝试运行优化库时遇到 TypeErrors pyOpt 。我尝试运行的代码是给出的基本示例 here (我只是测试 SLSQP 求解器)。 我在执行求解器期间收到以下错误 la = numpy.a
我尝试使用 scipy 深入研究基于多个变量的函数优化 在使用批处理文件调用该工具后,我有一个函数从数据挖掘工具返回预测。 def query(x): import numpy as np
考虑以下(凸)优化问题: minimize 0.5 * y.T * y s.t. A*x - b == y 其中优化(向量)变量是x和y和A,b是一个矩阵和向量,分别具有适当的维度。 下面的代
我正在学习使用 scipy.optimize.minimize 优化多元约束非线性问题,但收到了奇怪的结果。 我的问题: minimize objfun objfun x*y constraint
我正在使用 SciPy 进行优化,而 SLSQP 方法似乎忽略了我的约束。 具体来说,我希望 x[3] 和 x[4] 在 [0-1] 范围内 我收到消息:“不等式约束不兼容” 这是执行的结果,后面是示
我正在尝试获得更接近平均重量组合的最小重量。我当前的问题是使用 SLSQP 求解器时无法找到 100% 满足目标的正确权重。是否有其他求解器可以用来解决我的问题?或者任何数学建议。请帮忙。 我现在的数
我有一个带有约束和上限/下限的非线性优化问题,所以对于 scipy,我必须使用 SLSQP。这个问题显然不是凸的。我得到了 jacobian fo 目标函数和约束函数都可以正常工作(结果好/快到 30
我正在使用 scipy.optimize.minimize 来求解复杂的油藏优化模型(SQSLP 和 COBYLA,因为该问题同时受到边界和约束方程的约束)。每天有一个决策变量(存储),并且在目标函数
我正在尝试使用 SciPy 解决一个非常基本的优化问题。这个问题是受约束的并且有可变的界限,我很确定它是线性的。 当我运行以下代码时,执行失败并显示错误消息“LSQ 子问题中的奇异矩阵 C”。有谁知道
这是一个 Assets 配置的金融工程问题。有四种 Assets 类别:股票、固定 yield 、CTA策略和相对值(value)策略。给出了它们的返回和协方差矩阵。对于结果,预计会增加固定 yiel
Servus 伙计们我正在用 Nlopt(SLSQP) 做一个关于参数识别的项目,我写了一个测试代码,但是在 3 次迭代之后,编译器总是抛出关于 Nullptr 在 'myfunc' 中的 'grad
我是一名优秀的程序员,十分优秀!