标签: nonlinear-optimization

特征错误:please_protect_your_min_with_parentheses

我正在尝试通过运行包附带的测试代码来测试Eigen的非线性优化功能.

这些错误让我陷入困境(更像是困惑):

Error   5   error C2039: 'please_protect_your_min_with_parentheses' : is not a member of 'std::numeric_limits<double>'  c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    184
Error   7   error C2039: 'please_protect_your_min_with_parentheses' : is not a member of 'std::numeric_limits<double>'  c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    28
Error   6   error C2065: 'please_protect_your_min_with_parentheses' : undeclared identifier c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    184
Error   8   error C2065: 'please_protect_your_min_with_parentheses' : undeclared identifier c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    28
Run Code Online (Sandbox Code Playgroud)

顺便说一句(我认为)导致这样的行:

#define min(A,B) please_protect_your_min_with_parentheses
Run Code Online (Sandbox Code Playgroud)

并且错误是指这一行(在上面提到的2个不同的地方,作为第28和184行):

const Scalar dwarf = std::numeric_limits<Scalar>::min();
Run Code Online (Sandbox Code Playgroud)

任何建议应该并且将非常感激

c++ visual-studio-2010 nonlinear-optimization eigen

6
推荐指数
1
解决办法
299
查看次数

使用张量流逃离局部极小值

我正在用张量流求解这个方程组:

f1 = y - x*x = 0
f2 = x - (y - 2)*(y - 2) + 1.1 = 0
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果我选择错误的起点 (x,y)=(-1.3,2),那么我会使用以下代码进入局部最小值优化 f1^2+f2^2:

f1 = y - x*x
f2 = x - (y - 2)*(y - 2) + 1.1
sq=f1*f1+f2*f2
o = tf.train.AdamOptimizer(1e-1).minimize(sq)
with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run([init])
    for i in range(50):
        sess.run([o])
        r=sess.run([x,y,f1,f2])
        print("x",r)
Run Code Online (Sandbox Code Playgroud)

如何使用内置张量流工具摆脱这个局部最小值?可能还有其他 TF 方法可以用来从这个坏点开始求解这个方程吗?

python nonlinear-optimization equation-solving gradient-descent tensorflow

6
推荐指数
1
解决办法
2367
查看次数

R中整数变量的非线性优化/编程

我想知道是否有人能够建议一些软件包来解决非线性优化问题,该问题可以为最佳解决方案提供整数变量?问题是最小化具有等式约束的函数,该函数受一些下边界和上边界约束。

我在 R 中使用了 'nloptr' 包来解决非线性优化问题,该问题效果很好,但现在想扩展该方法以将某些变量作为整数。从我到目前为止对 nloptr 的使用和理解来看,它只能返回连续变量,而不是整数变量以获得最佳解决方案。

我相信这类问题需要使用混合整数非线性规划来解决。

nloptr 形式的问题的一个示例:

min f(x) (x-y)^2/y + (p-q)^2/q
so that (x-y)^2/y + (p-q)^2/q = 10.2

where 
x and p are positive integers not equal to 0 
and 
y and q may or may not be positive integers not equal to 0
Run Code Online (Sandbox Code Playgroud)

R 中的 nloptr 代码如下所示

library('nloptr')

x1 <- c(50,25,20,15)

fn <- function(x) {
  (((x[1] - x[2])^2)/x[2]) + (((x[3] - x[4])^2)/x[4])
  }

heq <- function(x) {
  fn(x)-10.2
}

lower_limit <- c(0,0,0,0)
upper_limit <- …
Run Code Online (Sandbox Code Playgroud)

r nonlinear-optimization mixed-integer-programming

6
推荐指数
1
解决办法
1021
查看次数

用于投资组合选择的纯 Java 开源库(= 约束、非线性优化)?

有谁知道或有使用纯Java库来选择投资组合或进行一些类似的带有约束的二次规划的经验吗?

正如其他地方已经讨论过的 那样,似乎有很多工具- 但我想使用的是纯 Java 实现。由于我想从另一个具有 BSD 风格许可证的开源软件中调用该库,因此我更喜欢 LGPL 而不是 GPL。

任何帮助表示赞赏。如果您不知道这样的库,您建议实现的最简单的算法是什么?它必须应对不等式约束(全部x_i>= 0)和等式约束(全部之和x_i= 1)。

java open-source nonlinear-optimization

5
推荐指数
1
解决办法
3773
查看次数

在 R 中,如何进行涉及求解微分方程的非线性最小二乘优化?

使用可重现的示例进行更新以说明我的问题

我最初的问题是“在 R 中实现信任区域反射优化算法”。但是,在生成可重现示例的过程中(感谢 @Ben 的建议),我意识到我的问题是在 Matlab 中,一个函数lsqnonlin很好(意味着不需要选择一个好的起始值,速度快)对于我拥有的大多数情况来说已经足够了,而在 R 中,没有这样一个一应俱全的功能。不同的优化算法在不同的情况下效果很好。不同的算法达到不同的解决方案。这背后的原因可能不是R中的优化算法不如Matlab中的信任区域反射算法,也可能与R如何处理自动微分有关。这个问题其实来自两年前的工作中断。当时,包optimx的作者之一 John C Nash 教授 已经建议 Matlab 进行了大量的自动微分工作,这可能是 Matlab lsqnonlin 比 R 中的优化函数/算法执行得更好的原因。我无法用我的知识弄清楚。

下面的示例显示了我遇到的一些问题(更多可重现的示例即将推出)。要运行示例,首先运行install_github("KineticEval","zhenglei-gao"). 您需要安装包mkin及其依赖项,并且可能还需要为不同的优化算法安装一堆其他包。

基本上我试图解决非线性最小二乘曲线拟合问题,如 Matlab 函数lsqnonlin的文档 ( http://www.mathworks.de/de/help/optim/ug/lsqnonlin.html ) 中所述。在我的例子中,曲线是由一组微分方程建模的。我将通过示例进行更多解释。我尝试过的优化算法包括:

  • Marq from nls.lm, the Levenburg-Marquardt
  • 端口来自 nlm.inb
  • L-BGFS-B 来自 optim
  • 来自 optimx
  • solnpRsolnp

我也尝试了其他一些,但没有在这里显示。

我的问题总结

  • R 中是否有可靠的函数/算法可以使用,例如lsqnonlin在 Matlab 中可以解决我的非线性最小二乘问题类型?(我找不到一个。)
  • 对于一个简单的情况,不同的优化达到不同的解决方案的原因是什么?
  • 什么lsqnonlin比 R 中的函数更胜一筹?信任区域反射算法或其他原因?
  • 有没有更好的方法来解决我的问题类型,以不同的方式表达?也许有一个非常简单的解决方案,但我只是不知道。

示例 1:一个简单的案例

我先给出R代码,稍后解释。 示例 1 的拟合图

ex1 <- mkinmod.full(
  Parent = …
Run Code Online (Sandbox Code Playgroud)

optimization r nonlinear-optimization

5
推荐指数
1
解决办法
3945
查看次数

Apache Commons优化问题

我正在尝试用Apache Commons提供的java优化库来解决受约束的非线性267维优化问题.

经过3天的破译,这就是我所拥有的:

public class optimize2 {

public static void main(String []args){

    double[] point = {1.,2.};
    double[] cost = {3., 2.};
    MultivariateFunction function = new MultivariateFunction() {
            public double value(double[] point) {
                    double x = point[0];
                    double y = point[1];
                    return x * y;
            }
    };


    MultivariateOptimizer optimize = new BOBYQAOptimizer(5);
    optimize.optimize(
            new MaxEval(200),
            GoalType.MAXIMIZE,
            new InitialGuess(point),
            new ObjectiveFunction(function),
            new LinearConstraint(cost, Relationship.EQ, 30));
}
Run Code Online (Sandbox Code Playgroud)

}

无论出于何种原因,optimize.optimize()都会抛出空指针错误.也许我只是愚蠢但我无法弄清楚如何使这个工作.

这是错误:

异常线程 "main" 显示java.lang.NullPointerException在org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.setup(BOBYQAOptimizer.java:2401)在org.apache.commons.math3.optim.nonlinear .scalar.noderiv.BOBYQAOptimizer.doOptimize(BOBYQAOptimizer.java:236)在org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.doOptimize(BOBYQAOptimizer.java:49)在org.apache.commons.math3 .optim.BaseOptimizer.optimize(BaseOptimizer.java:143)在org.apache.commons.math3.optim.BaseMultivariateOptimizer.optimize(BaseMultivariateOptimizer.java:66)在org.apache.commons.math3.optim.nonlinear.scalar.MultivariateOptimizer .optimize(MultivariateOptimizer.java:64)在Test.Code.optimize2.main(optimize2.java:39)

java optimization multidimensional-array nonlinear-optimization

5
推荐指数
1
解决办法
3161
查看次数

Python:多变量非线性拟合,如 matlabs nlinfit

我曾经使用 Matlab 使用该nlinfit函数执行非线性拟合。这使我能够为两个预测变量的观察响应向量创建拟合。为了争论,我们说通过基于进料等级和进料速率的分离过程回收铜。当使用 Matlabs 时nlinfit(),该函数接受Rec数据列作为观察到的响应,然后是一个由 2 组成的预测变量矩阵,在这种情况下,进料速率和进料等级。

我现在已经改用 Python(NumPy、SciPy 和 MatPlotLib)而不是 Matlab,并且无法使最小化函数执行相同的多变量非线性回归拟合。我使用具有许多观察值的单个预测变量管理得很好,但不是多变量预测变量集。

python numpy scipy nonlinear-optimization

5
推荐指数
0
解决办法
2068
查看次数

如果我的目标函数是非线性(也是指数解释)函数,应该使用什么求解器?Python GEKKO

我正在尝试使用GEKKO优化指数目标函数,但是我不知道所选的求解器是否是解决此类问题的最佳方法。

被选择的一个是有效的选择吗?

import numpy as np

'GEKKO MODELING'
from gekko import GEKKO
m = GEKKO()
m.options.SOLVER=1  # APOPT is an MINLP solver

# Initialize variables
x = []
x1 = m.Var(value=20,lb=20, ub=6555)  #integer=True
x2 = m.Var(value=0,lb=0,ub=10000)  #integer=True
x3 = m.sos1([30, 42, 45, 55])

x = [x1, x2, x3]
# Equations
m.Equation((x1 * x2* x3) * 10 ** (-6)>=50)

def fun(x):
    return 44440 + ((np.pi * x[0] * x[1] * x[2]) * 10 ** (-4))**0.613

x = [400,300,19]

'GEKKO Optimization'
m.Obj(fun(x)) …
Run Code Online (Sandbox Code Playgroud)

python optimization nonlinear-optimization exponential gekko

5
推荐指数
1
解决办法
79
查看次数

有什么方法可以限制 Julia 中 NLsolve 搜索的区域吗?

我正在尝试找到一个非线性(大致四次)方程的根。\n该方程始终有四个根,其中一对接近于零,一个大的正根和一个大的负根。我想确定任何一个接近零的根,但是nlsolve,即使最初的猜测非常接近这些根,似乎总是收敛于大的正根或负根。

\n

该函数的图本质上看起来像一个恒定的负值,具有接近零的(非常窄的)偶数阶极点,并逐渐上升到在大的正根和负根处交叉零。

\n

有什么方法可以限制 搜索的区域nlsolve,或者做一些事情让它对我的函数中这个极点的存在更加敏感?

\n

编辑:\n这里有一些重现问题的示例代码:

\n
using NLsolve\n\nfunction f!(F,x)\n    x = x[1]\n    F[1] = -15000 + x^4 / (x+1e-5)^2\nend\n# nlsolve will find the root at -122\nnlsolve(f!,[0.0])\n
Run Code Online (Sandbox Code Playgroud)\n

作为输出,我得到:

\n
Results of Nonlinear Solver Algorithm\n * Algorithm: Trust-region with dogleg and autoscaling\n * Starting Point: [0.0]\n * Zero: [-122.47447713915808]\n * Inf-norm of residuals: 0.000000\n * Iterations: 15\n * Convergence: true\n   * |x - x'| < 0.0e+00: false\n   * |f(x)| < 1.0e-08: true\n * Function …
Run Code Online (Sandbox Code Playgroud)

nonlinear-optimization equation-solving julia

5
推荐指数
1
解决办法
946
查看次数

设置优先队列值以优化找到“礼物”的概率

我有一个“门牌号”的优先队列。我从优先级队列中(即对应优先级值最低的门)得到隔壁门号,然后开门。门后可能有礼物,也可能没有。根据礼物的存在/不存在,更新此门号的优先级,并将其放回优先级队列。然后我重复一遍,打开隔壁的门号,依此类推。

假设每扇门都有不同的礼物补货率(即有些可能每天都收到新礼物,有些则根本没有),我应该如何更新优先级值以最大化我找到的礼物数量?也就是说,我想最大化我有礼物打开的门与没有礼物打开的门的比例。

我应该指出,补货率不能保证随着时间的推移而固定/存在随机变化。但我可以在这里简化假设。

这对我来说几乎像是一个蒙特卡洛问题,只是我探索一个节点(门)的次数越多,它的期望值就越低。(当然,没有要构建的树;我们只需要计算 depth-1 节点的值。)

最简单的方法是跟踪上次优先级 (LP) 和当前优先级 (CP),其中 delta = CP - LP。如果我们找到礼物,则设置下一个优先级 NP = CP + delta - 1;否则设置 NP = CP + delta + 1。我猜这是可行的,但它的优化似乎相当缓慢。

或者我们可以有一个乘法值:NP = CP + delta *shrink 或 NP = CP + delta *grow,其中shrink < 1 和grow > 1。这就是我目前所拥有的,它似乎可以正常工作几个月,但现在我遇到了一些门被背对背打开的情况(即打开门 D,找到礼物,放回优先队列,D 现在再次成为最佳选择,当然没有找到礼物,现在放回去在优先级较差的队列中),这看起来很糟糕。作为参考,我使用了shrink = 0.9 和grow = 1.3。

是否有数学公式(如蒙特卡罗)表达探索门的最佳方式?

algorithm priority-queue montecarlo nonlinear-optimization monte-carlo-tree-search

5
推荐指数
1
解决办法
54
查看次数