我正在尝试通过运行包附带的测试代码来测试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)
任何建议应该并且将非常感激
我正在用张量流求解这个方程组:
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
我想知道是否有人能够建议一些软件包来解决非线性优化问题,该问题可以为最佳解决方案提供整数变量?问题是最小化具有等式约束的函数,该函数受一些下边界和上边界约束。
我在 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) 有谁知道或有使用纯Java库来选择投资组合或进行一些类似的带有约束的二次规划的经验吗?
正如其他地方已经讨论过的 那样,似乎有很多工具- 但我想使用的是纯 Java 实现。由于我想从另一个具有 BSD 风格许可证的开源软件中调用该库,因此我更喜欢 LGPL 而不是 GPL。
任何帮助表示赞赏。如果您不知道这样的库,您建议实现的最简单的算法是什么?它必须应对不等式约束(全部x_i>= 0)和等式约束(全部之和x_i= 1)。
我最初的问题是“在 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 ) 中所述。在我的例子中,曲线是由一组微分方程建模的。我将通过示例进行更多解释。我尝试过的优化算法包括:
nls.lm, the Levenburg-Marquardtnlm.inboptimoptimxsolnp包Rsolnp我也尝试了其他一些,但没有在这里显示。
lsqnonlin在 Matlab 中可以解决我的非线性最小二乘问题类型?(我找不到一个。)lsqnonlin比 R 中的函数更胜一筹?信任区域反射算法或其他原因?我先给出R代码,稍后解释。

ex1 <- mkinmod.full(
Parent = …Run Code Online (Sandbox Code Playgroud) 我正在尝试用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
我曾经使用 Matlab 使用该nlinfit函数执行非线性拟合。这使我能够为两个预测变量的观察响应向量创建拟合。为了争论,我们说通过基于进料等级和进料速率的分离过程回收铜。当使用 Matlabs 时nlinfit(),该函数接受Rec数据列作为观察到的响应,然后是一个由 2 组成的预测变量矩阵,在这种情况下,进料速率和进料等级。
我现在已经改用 Python(NumPy、SciPy 和 MatPlotLib)而不是 Matlab,并且无法使最小化函数执行相同的多变量非线性回归拟合。我使用具有许多观察值的单个预测变量管理得很好,但不是多变量预测变量集。
我正在尝试使用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
我正在尝试找到一个非线性(大致四次)方程的根。\n该方程始终有四个根,其中一对接近于零,一个大的正根和一个大的负根。我想确定任何一个接近零的根,但是nlsolve,即使最初的猜测非常接近这些根,似乎总是收敛于大的正根或负根。
该函数的图本质上看起来像一个恒定的负值,具有接近零的(非常窄的)偶数阶极点,并逐渐上升到在大的正根和负根处交叉零。
\n有什么方法可以限制 搜索的区域nlsolve,或者做一些事情让它对我的函数中这个极点的存在更加敏感?
编辑:\n这里有一些重现问题的示例代码:
\nusing 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])\nRun Code Online (Sandbox Code Playgroud)\n作为输出,我得到:
\nResults 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) 我有一个“门牌号”的优先队列。我从优先级队列中(即对应优先级值最低的门)得到隔壁门号,然后开门。门后可能有礼物,也可能没有。根据礼物的存在/不存在,更新此门号的优先级,并将其放回优先级队列。然后我重复一遍,打开隔壁的门号,依此类推。
假设每扇门都有不同的礼物补货率(即有些可能每天都收到新礼物,有些则根本没有),我应该如何更新优先级值以最大化我找到的礼物数量?也就是说,我想最大化我有礼物打开的门与没有礼物打开的门的比例。
我应该指出,补货率不能保证随着时间的推移而固定/存在随机变化。但我可以在这里简化假设。
这对我来说几乎像是一个蒙特卡洛问题,只是我探索一个节点(门)的次数越多,它的期望值就越低。(当然,没有要构建的树;我们只需要计算 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
optimization ×3
python ×3
java ×2
r ×2
algorithm ×1
c++ ×1
eigen ×1
exponential ×1
gekko ×1
julia ×1
montecarlo ×1
numpy ×1
open-source ×1
scipy ×1
tensorflow ×1