Как использовать SimplexSolver или SimplexOptimizer в математике java apache?

Я пытаюсь использовать математическую библиотеку Apache Commons версии 3.5+ для решения проблемы оптимизации. По сути, я пытаюсь подобрать (гамма) распределение к некоторым точкам данных. Я не могу найти простых примеров использования новых (версия 3.5) инструментов оптимизации, таких как SimplexSolver, SimplexOptimizer или OptimizationData, для решения тривиальной задачи оптимизации.

Подобные вопросы задавались здесь раньше, но все ответы, похоже, относятся к более старой версии математики apache - в 3.5 все было реструктурировано, и ни один из примеров кода, который я смог найти, не работает.

Есть ли у кого-нибудь рабочий пример использования новых оптимизаторов или решателей? Меня больше всего интересует SimplexOptimizer, но на данный момент все было бы полезно.


person homesalad    schedule 11.09.2015    source источник


Ответы (1)


Действительно, оптимизаторы могут быть сложны в использовании: множество параметров, различные комбинации которых требуются для разных типов оптимизаторов, и все они скрыты в общем массиве OptimizationData, который они получают. Если вы не начнете сопоставлять код с документами, на которые они ссылаются, вы вряд ли сможете получить от них какие-либо результаты.

Я также хотел время от времени использовать некоторые из этих решателей/оптимизаторов, основным источником надежных, работающих ""примеров"" для меня оказались модульные тесты этих классов, которые обычно довольно сложны и охватывают многие случаи. Например, что касается 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);
        }
    }
}
person Marco13    schedule 11.09.2015
comment
Это выглядит идеально! Спасибо. Я думаю, что каждый оптимизатор использует свой собственный набор элементов OptimizationData, которые могут быть практически любыми. Забавно, что нигде нет хорошего списка, какие решатели/оптимизаторы ожидают какие элементы. - person homesalad; 13.09.2015
comment
Для Math 3 тесты следующие: gitbox.apache.org/repos/asf?p=commons- math.git;a=blob;f=src/ - person Sergei Rodionov; 05.02.2021