Apache commons 数学优化在每次迭代中获得最佳解决方案

Apache commons math optimization get best solution each iteration

Apache Commons Math 具有优化 classes,可以优化某些 objective 函数,通常必须为优化器设置最大计算次数。

中有一个完整功能的 NelderMeadSimplex 的工作小 Java 示例,MaxEval(100) 设置了最大评估。

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

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

据我所知,并且就我通过查看实现的源代码得出的结论而言,没有直接的、内置的方法来获取中间结果。

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

曾经,我想达到同样的目标:到"log"优化的中间步骤,到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)),

将导致优化过程被记录。

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