Действительно, оптимизаторы могут быть трудными в использовании: множество параметров, для которых разные комбинации требуются для разных типов оптимизаторов, и все они скрыты в общем массиве OptimizationData
, который они получают. Если вы не начнете сопоставлять код с документами, на которые они ссылаются, вы вряд ли сможете получить от них какие-либо результаты.
Я также хотел использовать некоторые из Thes решателей/оптимизаторы попробовать время от времени, главный источник надежен, работает «» примеры «» для меня оказалось бы модульные тесты из этих классов, которые, как правило, довольно разрабатывать и охватывать многие случаи. Например, в отношении SimplexOptimizer
вы можете ознакомиться с тестовыми примерами org/apache/commons/math4/optim/nonlinear/scalar/noderiv/
, содержащими тестовые классы SimplexOptimizerMultiDirectionalTest.java
и SimplexOptimizerNelderMeadTest.java
.
(К сожалению, может быть, это не то, что вы ожидали или надеялись, но ... Я нашел эти тесты чрезвычайно полезны, когда я попытался выяснить, какие OptimizationData
эти оптимизаторы действительно нужно ...)
РЕДАКТИРОВАТЬ
Просто для справки, полный пример, извлеченной из одного из основных модульных тестов:
import java.util.Arrays;
import org.apache.commons.math3.analysis.MultivariateFunction;
import org.apache.commons.math3.optim.InitialGuess;
import org.apache.commons.math3.optim.MaxEval;
import org.apache.commons.math3.optim.PointValuePair;
import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;
import org.apache.commons.math3.util.FastMath;
public class SimplexOptimizerExample
{
public static void main(String[] args)
{
SimplexOptimizer optimizer = new SimplexOptimizer(1e-10, 1e-30);
final FourExtrema fourExtrema = new FourExtrema();
final PointValuePair optimum =
optimizer.optimize(
new MaxEval(100),
new ObjectiveFunction(fourExtrema),
GoalType.MINIMIZE,
new InitialGuess(new double[]{ -3, 0 }),
new NelderMeadSimplex(new double[]{ 0.2, 0.2 }));
System.out.println(Arrays.toString(optimum.getPoint()) + " : "
+ optimum.getSecond());
}
private static class FourExtrema implements MultivariateFunction
{
// The following function has 4 local extrema.
final double xM = -3.841947088256863675365;
final double yM = -1.391745200270734924416;
final double xP = 0.2286682237349059125691;
final double yP = -yM;
final double valueXmYm = 0.2373295333134216789769; // Local maximum.
final double valueXmYp = -valueXmYm; // Local minimum.
final double valueXpYm = -0.7290400707055187115322; // Global minimum.
final double valueXpYp = -valueXpYm; // Global maximum.
public double value(double[] variables)
{
final double x = variables[0];
final double y = variables[1];
return (x == 0 || y == 0) ? 0 : FastMath.atan(x)
* FastMath.atan(x + 2) * FastMath.atan(y) * FastMath.atan(y)
/(x * y);
}
}
}
Это выглядит отлично! Благодарю. Я думаю, каждый оптимизатор берет свой собственный набор элементов «OptimizationData», который может быть практически любым. Забавно, что нет ни одного хорошего списка, из которого решатели/оптимизаторы ожидают, какие предметы. – homesalad