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)),
将导致优化过程被记录。
我不推荐这样解决,但根据目标和应用案例,它可能是一个选项,至少。
Apache Commons Math 具有优化 classes,可以优化某些 objective 函数,通常必须为优化器设置最大计算次数。
在 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)),
将导致优化过程被记录。
我不推荐这样解决,但根据目标和应用案例,它可能是一个选项,至少。