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

Java ApacheCommons数学优化在每次迭代中获得最佳解决方案,java,math,optimization,apache-commons-math,Java,Math,Optimization,Apache Commons Math,ApacheCommonsMath有可以优化某些目标函数的优化类,通常必须为优化器设置最大数量的评估 在中,有一个完整功能的NelderMeadSimplex的小型Java示例,它具有MaxEval(100)设置最大求值 如何在优化器(如NelderMeadSimplex)的每个评估步骤中获得当前解决方案 引用的代码只运行并打印出最终的解决方案(或者抛出ToomanyEvaluationException,如果MaxEval(100)中的数字太低,到目前为止不会打印任何解决方案),但我找不到有助

ApacheCommonsMath有可以优化某些目标函数的优化类,通常必须为优化器设置最大数量的评估

在中,有一个完整功能的NelderMeadSimplex的小型Java示例,它具有
MaxEval(100)
设置最大求值

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


引用的代码只运行并打印出最终的解决方案(或者抛出ToomanyEvaluationException,如果
MaxEval(100)
中的数字太低,到目前为止不会打印任何解决方案),但我找不到有助于获得每个eval步骤的当前解决方案的类方法或字段。

据我所知,从实现的源代码来看,没有直接的、内置的方法来获得中间结果

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

有一次,我想实现同样的目标:记录优化的中间步骤,然后完成。我解决了这个问题。。。非常实用:唯一可以确定的是,
多变量函数
必须在每个点进行评估。从某种意义上说,这是一个可以将钩子插入优化黑盒的地方。最后,我在
多变量函数
周围创建了一个包装器:

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)),