2015-09-11 7 views
3

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

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

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

ответ

8

Действительно, оптимизаторы могут быть трудными в использовании: множество параметров, для которых разные комбинации требуются для разных типов оптимизаторов, и все они скрыты в общем массиве 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); 
     } 
    } 
} 
+0

Это выглядит отлично! Благодарю. Я думаю, каждый оптимизатор берет свой собственный набор элементов «OptimizationData», который может быть практически любым. Забавно, что нет ни одного хорошего списка, из которого решатели/оптимизаторы ожидают, какие предметы. – homesalad