问题标签 [nlopt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mathematical-optimization - Python 上使用的 NLOPT 中变量和约束的最大数量是多少?
我猜每个 NLOPT 算法都有不同的尺度。我对 Global Optimizer ISRES 和 Local Optimizer COBYLA 更感兴趣。他们的最大限制是多少?谢谢!
c++ - 在 C++ 中的 NLOPT 优化过程中调用 digamma() 函数
我使用 Visual Studio 2015 上的NLOPT库来解决涉及多参数目标函数和梯度向量的优化问题。缩短的代码如下所示:
使用NLOPT_LD_LBFGS
& 调用boost::math::digamma()
-function 会产生以下错误:
boost::math::digamma(1.0 + 1.0/x[0])
如果我更改为etc ,则不会出现此错误boost::math::digamma(1.0 + 1.0/5.4)
。因此,当我取出参数 x[0] 时,它工作正常。当我使用另一个boost::math
-function 时会发生同样的错误,但如果我使用它的std::
-counterpart 则不会。
问:为什么我不能将boost::math
-functions 应用于优化的参数?是否有另一种方法来包含digamma()
- 函数(除了使用它的泰勒近似)?
谢谢你的帮助。我可以提供更多细节,但代码很广泛,我想我已经过滤掉了手头的问题。
编辑:main()
调用上面的函数。
python - threading.join() 如何检测超时?
我们正在运行退出一个大的 Python 代码来随机扫描一些物理模型的参数空间(所以,很难给出一个最小的例子,对不起)。评估一个参数点大约需要 300 毫秒,但有时(我不知道为什么)评估突然需要几个小时,这会耗尽我们在计算集群上的 CPU 预算。
因此,我的想法是使用线程来为参数点的每次评估提供最大的运行时间。如果评估需要更长的时间,那么我可以忽略这一点,因为它是不物理的。现在,这似乎不起作用。我在一个新线程中开始计算,将其连接到主线程,超时设置为 1 秒,但主线程仍然继续等待计算终止(这需要比 1 秒长得多的时间)。
这怎么可能?线程如何测量新线程已经运行的时间?不得不说,在评估一个参数点的过程中,我大量使用了 nlopt、numpy 和 scipy。正如我所假设的,其中大部分不是直接用 python 编写的,而是使用一些二进制文件来加速计算。这会影响线程吗(因为函数对它来说是“黑匣子”)?
谢谢!
c++ - 停止和恢复优化
我正在使用nlopt
C++ 接口来解决非线性优化问题。
但是,我希望最后一行继续优化,不仅使用最后一个params
值,还使用step_size
最后使用的值,但我认为我无法访问该值。
我怎样才能实现这样的目标?
optimization - 使用 NLOPTR 的最小方差投资组合优化
我在 NLOPTR 中使用SLSQP函数来构建使用 34 只低波动性股票的投资组合。股票并不重要。我想要做的是能够对每只股票施加最小重量和最大重量。
hin 函数施加了最小权重约束——从这里可以看出——在投资组合的构建中每个权重必须至少为 1%;这可以通过“(x - 0.01)”看到
我不知道现在如何为函数添加最大约束(比如每只股票最大重量的 15%)以及具有最小约束。因此将具有最小 1% 和最大 15% 的权重约束。
有人可以帮我创建一个最小和一个最大约束。
我运行优化的代码如下:
r - 带约束的非线性优化
考虑以下数据框:
有以下优化问题:
其中 a_i 是矩阵 A 的第 i 行。
我试图用包解决这个问题nloptr
。首先是目标函数:
然后是约束:
但是我尝试过的所有求解器都需要梯度,例如:
是否可以计算这个函数的梯度,或者有其他方法可以解决这个问题吗?
谢谢你。
r - 为什么我的 NLOPT 优化错误/无法解决?
我难住了。我在 R 中为 NLOPT 制定了一个问题。当前问题解决了 180 个变量和 28 个等式约束
该代码是从问题的更简单版本中重新使用的,在我的脚本的早期版本中,具有 36 个变量和 20 个等式约束,可以立即解决,NLOPT_LD_SLSQP
用作算法。
使用 180 个变量的较大版本的问题会立即产生以下结果NLOPT_LD_SLSQP
:
这让我感到困惑,因为它适用于问题的较小版本。同样,它返回起始值并且实际上并没有完成任何迭代。所以我实现NLOPT_AUGLAG_LD_EQ
了,作为主要算法,NLOPT_LD_SLSQP
作为局部算法。现在问题无法解决并产生:
如果我降低公差,它只会更快地失败......我将玩具问题放入 Excel 中,看看我是否未能正确制定或者它是否不可行,但它立即解决了。如果你愿意,我可以给你这个文件。我取了 Excel 解决方案值并在 R 中填充了函数,果然我的约束和目标函数似乎很好。
我想知道是否有人可以帮助我解决这个问题。以下是一些代码,将为 R 中的任何人产生问题(经过测试和确认):
现在这里是用 SLSQP 解决的代码:
这是使用 AUGLAG 解决的代码:
最后但并非最不重要的一点是,这是 Excel 生成的可行解决方案:
我的问题是:为什么该模型会为示例代码中实现的每个 SLSQP 和 AUGLAG 算法产生我在此处报告的错误?
会喜欢这里的一些输入。如果您需要任何其他信息,请告诉我!
r - 将参数传递给 r 中的 nloptr
我正在使用 'nloptr' 在 r 中优化一个简单的函数,但我很难将参数传递给目标函数。这是我正在使用的代码:
res <- nloptr(x0=Wghts,eval_f = pf.vol,eval_g_ineq=pf.return,opts=list(algorithm="NLOPT_GN_ISRES"), x=Wghts,C=Correl)
(我知道我在这里缺少参数,但我试图突出我不理解的行为)运行它会产生以下错误:
Error in .checkfunargs(eval_f, arglist, "eval_f") :
x' passed to (...) in 'nloptr' but this is not required in the eval_f function.
只是想看看会发生什么,我可以尝试在没有 x 参数的情况下运行它:
res <- nloptr(x0=Wghts,eval_f = pf.vol,eval_g_ineq=pf.return,opts=list(algorithm="NLOPT_GN_ISRES"), C=Correl)
这给出了错误:
Error in .checkfunargs(eval_g_ineq, arglist, "eval_g_ineq") :
eval_g_ineq requires argument 'x' but this has not been passed to the 'nloptr' function.
因此,包含x
会引发一个不必要的错误,而忽略它会引发一个(至少可以理解的)错误,它已被省略。