当前位置: 首页 > 面试题库 >

如何在Java Apache Math中使用SimplexSolver或SimplexOptimizer?

乜璞瑜
2023-03-14
问题内容

我正在尝试使用Apache
Commons数学库3.5+版本来解决优化问题。基本上,我试图将(gamma)分布拟合到某些数据点。我似乎找不到任何有关如何使用新的(版本3.5)优化工具(例如SimplexSolver,SimplexOptimizer或OptimizationData)解决琐碎的优化问题的简单示例

之前曾在这里问过类似的问题,但是所有答案似乎都是针对较旧版本的apache数学-在3.5中,所有内容都进行了重组,而我找不到的示例代码都能奏效。

有没有人有一个可行的示例,说明如何使用新的优化器或求解器?我对SimplexOptimizer最为感兴趣,但是在这一点上,任何事情都会有用。


问题答案:

确实,优化器可能很难使用:许多参数,其中不同类型的优化器需要不同的组合,并且它们都隐藏在所OptimizationData接收的通用数组中。除非您开始将代码与它们所引用的论文相匹配,否则您将很难从中获得任何结果。

我还想偶尔使用一些求解器/优化器,对我来说,可靠的,有效的“示例”的主要来源是这些类的 单元测试
,它们通常非常复杂,并且涵盖很多情况。例如,关于SimplexOptimizer,您可能想看看org/apache/commons/math4/optim/nonlinear/scalar/noderiv/包含测试类SimplexOptimizerMultiDirectionalTest.java和的测试用例
SimplexOptimizerNelderMeadTest.java

(对不起,也许这不是您期望或希望的,但是…当我试图弄清楚OptimizationData这些优化器实际需要哪些时,我发现这些测试非常有帮助…)

编辑

仅供参考,是一个完整的示例,该示例摘自以下基本单元测试之一:

import java.util.Arrays;

import org.apache.commons.math3.analysis.MultivariateFunction;
import org.apache.commons.math3.optim.InitialGuess;
import org.apache.commons.math3.optim.MaxEval;
import org.apache.commons.math3.optim.PointValuePair;
import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;
import org.apache.commons.math3.util.FastMath;

public class SimplexOptimizerExample
{
    public static void main(String[] args)
    {
        SimplexOptimizer optimizer = new SimplexOptimizer(1e-10, 1e-30);
        final FourExtrema fourExtrema = new FourExtrema();

        final PointValuePair optimum =
            optimizer.optimize(
                new MaxEval(100), 
                new ObjectiveFunction(fourExtrema), 
                GoalType.MINIMIZE, 
                new InitialGuess(new double[]{ -3, 0 }), 
                new NelderMeadSimplex(new double[]{ 0.2, 0.2 }));

        System.out.println(Arrays.toString(optimum.getPoint()) + " : "
            + optimum.getSecond());
    }

    private static class FourExtrema implements MultivariateFunction
    {
        // The following function has 4 local extrema.
        final double xM = -3.841947088256863675365;
        final double yM = -1.391745200270734924416;
        final double xP = 0.2286682237349059125691;
        final double yP = -yM;
        final double valueXmYm = 0.2373295333134216789769; // Local maximum.
        final double valueXmYp = -valueXmYm; // Local minimum.
        final double valueXpYm = -0.7290400707055187115322; // Global minimum.
        final double valueXpYp = -valueXpYm; // Global maximum.

        public double value(double[] variables)
        {
            final double x = variables[0];
            final double y = variables[1];
            return (x == 0 || y == 0) ? 0 : FastMath.atan(x)
                * FastMath.atan(x + 2) * FastMath.atan(y) * FastMath.atan(y)
                / (x * y);
        }
    }
}


 类似资料:
  • 问题内容: 因此,我在这里已经读到,在Vue.js中,可以使用或在选择器中创建适用于子组件内部元素的样式规则。但是,无论是在SCSS还是普通的旧CSS中,尝试以我的样式使用它均无效。而是将它们原样发送到浏览器,因此无效。例如: home.vue: 生成的CSS: 我想要的是: 我与之相关的webpack配置如下所示: 所以我的问题是,如何让该操作员工作? 我已经找到了这个答案,但我确实在这样做,而

  • 在一个flink项目中,我使用一个case类click。 这个类填充了数据集,并且在日期为Java8的情况下可以很好地工作。在Java7环境中切换到org.joda(Version2.9)之后,对数据集中的click对象的调用不像以前那样执行。对click对象的date字段的某些函数的访问引发。这些函数的例子有等。我能够确保click类的日期字段不为空。我怀疑joda时间库与kryo序列化的交互不

  • 问题内容: 我想使用或在C中使用。我该怎么做?我不知道如何用C处理它们,如果有人知道,请告诉我如何。谢谢。 问题答案: 通常,最好避免打开文件以获取随机数据,因为该过程中存在多个故障点。 在最近的Linux发行版,该系统调用可用来获取加密安全随机数,它不能失败 ,如果 是 没有 指定为标志和读取量最多256个字节。 截至2017年10月,OpenBSD,Darwin和Linux(带有)现在都已实现

  • 我是SpringAMQP的新手。我有一个应用程序是生产者发送消息给另一个应用程序是消费者。 一旦消费者收到消息,我们将对数据进行验证。 如果数据是正确的,我们必须确认,消息应该从队列中删除。如果数据不正确,我们必须对数据进行NACK(否定确认),以便它在RabbitMQ中重新排队。 我偶然发现

  • 问题内容: 我还不能弄清楚如何在Swift中获取a的子字符串: 我无法在Swift中创建范围。在Playground中自动完成并不是超级有帮助-这说明: 我在Swift标准参考库中找不到任何有帮助的东西。这是另一个疯狂的猜测: 还有这个: 我看过其他答案(在SwiftString中查找字符的索引),似乎暗示着由于是的桥类型,因此“旧”方法应该起作用,但尚不清楚如何- 例如,这也不起作用(似乎不是有

  • 显然IE(11)在方面存在问题,例如在事件方面。IE是否有其他方法获得? 下面是一个在IE中产生错误的示例:https://jsfiddle.net/rnyqy78m/