【问题标题】:Apache commons math optimization get best solution each iterationApache commons 数学优化每次迭代都能获得最佳解决方案
【发布时间】:2016-06-06 20:51:16
【问题描述】:

Apache Commons Math 具有可以优化某些目标函数的优化类,通常必须为优化器设置最大评估次数。

https://stackoverflow.com/a/32532514/3229995 中有一个功能齐全的 NelderMeadSimplex 的小型 Java 示例,MaxEval(100) 设置了最大评估。

如何在 NelderMeadSimplex 等优化器的每个评估步骤中获得当前解决方案?

引用的代码仅运行并打印出最终解决方案(或者如果MaxEval(100) 中的数字太低,则抛出TooManyEvaluationsException 并且到目前为止不打印任何解决方案),但我找不到可以帮助获取每个评估步骤的当前解决方案。

【问题讨论】:

    标签: java math optimization apache-commons-math


    【解决方案1】:

    据我所知,以及通过查看实现的源代码可以得出的结论,没有直接的、内置的方法来获得中间结果。

    在每次评估期间(应该)调用一些涉及的接口。特别是有ConvergenceChecker 接口。一个相对干净的解决方案可能是相应地实现这个接口(通过从它的实现类之一派生)。但据我所知,对于每个优化算法都没有严格的要求来使用这个接口(更不用说真正在每个评估步骤中调用它)。 p>

    曾经,我想实现相同的目标:将优化的中间步骤“记录”到visualize an optimization process。我以务实的方式解决了这个问题...... 非常:唯一可以确定的是,MultivariateFunction 必须在每一点进行评估。从某种意义上说,这是一个可以在优化黑盒中插入钩子的地方。所以最终,我在MultivariateFunction 周围创建了一个包装器:

    private static MultivariateFunction createLogging(
        final MultivariateFunction delegate)
    {
        return new MultivariateFunction()
        {
            @Override
            public double value(double[] point)
            {
                double result = delegate.value(point);
                System.out.println("Evaluated "+
                    Arrays.toString(point)+" to "+result);
                return result;
            }
        };
    }
    

    然后,替换任何

    new ObjectiveFunction(multivariateFunction)
    

    new ObjectiveFunction(createLogging(multivariateFunction)),
    

    将记录优化过程。

    我不推荐这样解决它,但根据目标和应用案例,至少可能是一种选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多