Hi,

I have been struggling for several days to figure out how to use
NonLinearConjugateGradientOptimizer.
My goal is to optimize a multivariate unconstrained function (for example
f(x,y,z) = x^2 + y^2 + z^2) with conjugate gradient method. I have already
managed to optimize my function with SimplexOptimizer and want to try
Gradient Descent now.

For now, my code is (inspired by all the examples I could found): 

import java.util.Arrays;

import org.apache.commons.math3.analysis.MultivariateFunction;
import org.apache.commons.math3.analysis.MultivariateVectorFunction;
import
org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
import org.apache.commons.math3.analysis.differentiation.GradientFunction;
import
org.apache.commons.math3.analysis.differentiation.MultivariateDifferentiableFunction;
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.SimpleValueChecker;
import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;
import
org.apache.commons.math3.optim.nonlinear.scalar.GradientMultivariateOptimizer;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import
org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunctionGradient;
import
org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer;
import
org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import
org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;

public class ApacheTest {
        
    public static void main(String[] args) {
        
        SimplexOptimizer simplexOptimizer = new SimplexOptimizer(1e-10,
1e-30);
        
        NonLinearConjugateGradientOptimizer gradientOptimizer = new
NonLinearConjugateGradientOptimizer(NonLinearConjugateGradientOptimizer.Formula.POLAK_RIBIERE,
new SimpleValueChecker(1e-13, 1e-13));
        
        final MyFunction f = new MyFunction();

        simplexOptimizerMethod(simplexOptimizer, f);
        conjugateGradientMethod(gradientOptimizer, f);
    }

        private static void
conjugateGradientMethod(NonLinearConjugateGradientOptimizer optimizer,
MyFunction f) {
                
                ObjectiveFunction objF = new ObjectiveFunction(f);
                
                final PointValuePair optimum =
                                optimizer.optimize(new MaxEval(1000), objF, 
GoalType.MINIMIZE, new
InitialGuess(new double[]{ 10, 10, 10 })); 

                System.out.println(Arrays.toString(optimum.getPoint()) + " : "
                    + optimum.getSecond());
                
        }

        private static void simplexOptimizerMethod(SimplexOptimizer optimizer,
final MyFunction f) {
                final PointValuePair optimum =
            optimizer.optimize(
                new MaxEval(10000), 
                new ObjectiveFunction(f), 
                GoalType.MINIMIZE, 
                new InitialGuess(new double[]{ 100, 100, 60 }), 
                new NelderMeadSimplex(new double[]{ 0.2, 0.2, 0.2 }));

        System.out.println(Arrays.toString(optimum.getPoint()) + " : "
            + optimum.getSecond());
        }

    private static class MyFunction implements MultivariateFunction {
      
        public double value(double[] variables) {
                
            final double x = variables[0];
            final double y = variables[1];
            final double z = variables[2];
            
            return x*x + y*y + z*z;
            
        }
        
    }
}

When I execute the code I get the following error: 

Exception in thread "main" java.lang.NullPointerException
        at
org.apache.commons.math3.optim.nonlinear.scalar.GradientMultivariateOptimizer.computeObjectiveGradient(GradientMultivariateOptimizer.java:53)
        at
org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer.doOptimize(NonLinearConjugateGradientOptimizer.java:254)
        at
org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer.doOptimize(NonLinearConjugateGradientOptimizer.java:46)
        at
org.apache.commons.math3.optim.BaseOptimizer.optimize(BaseOptimizer.java:153)
        at
org.apache.commons.math3.optim.BaseMultivariateOptimizer.optimize(BaseMultivariateOptimizer.java:65)
        at
org.apache.commons.math3.optim.nonlinear.scalar.MultivariateOptimizer.optimize(MultivariateOptimizer.java:63)
        at
org.apache.commons.math3.optim.nonlinear.scalar.GradientMultivariateOptimizer.optimize(GradientMultivariateOptimizer.java:73)
        at
org.apache.commons.math3.optim.nonlinear.scalar.gradient.NonLinearConjugateGradientOptimizer.optimize(NonLinearConjugateGradientOptimizer.java:244)
        at
com.sri.ai.expresso.apache.ApacheTest.conjugateGradientMethod(ApacheTest.java:96)
        at com.sri.ai.expresso.apache.ApacheTest.main(ApacheTest.java:87)


I think that maybe the problem is a missing argument of type
ObjectiveFunctionGradient in the optimize method: 

final PointValuePair optimum =
                                optimizer.optimize(new MaxEval(1000), objF, 
GoalType.MINIMIZE, new
InitialGuess(new double[]{ 10, 10, 10 })); 

However, I don't know how to build it. 

Does anyone has an idea, or an example which looks like what I am looking
for?

Thank you very much



--
Sent from: http://apache-commons.680414.n4.nabble.com/Commons-User-f735979.html

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org

Reply via email to