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