【问题标题】: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)),
将记录优化过程。
我不推荐这样解决它,但根据目标和应用案例,至少可能是一种选择。