001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018 package org.apache.commons.math.optimization;
019
020 import static org.junit.Assert.assertEquals;
021 import static org.junit.Assert.assertTrue;
022
023 import org.apache.commons.math.ConvergenceException;
024 import org.apache.commons.math.FunctionEvaluationException;
025 import org.apache.commons.math.analysis.MultivariateRealFunction;
026 import org.apache.commons.math.optimization.direct.NelderMead;
027 import org.apache.commons.math.random.GaussianRandomGenerator;
028 import org.apache.commons.math.random.JDKRandomGenerator;
029 import org.apache.commons.math.random.RandomVectorGenerator;
030 import org.apache.commons.math.random.UncorrelatedRandomVectorGenerator;
031 import org.junit.Test;
032
033 public class MultiStartMultivariateRealOptimizerTest {
034
035 @Test
036 public void testRosenbrock()
037 throws FunctionEvaluationException, ConvergenceException {
038
039 Rosenbrock rosenbrock = new Rosenbrock();
040 NelderMead underlying = new NelderMead();
041 underlying.setStartConfiguration(new double[][] {
042 { -1.2, 1.0 }, { 0.9, 1.2 } , { 3.5, -2.3 }
043 });
044 JDKRandomGenerator g = new JDKRandomGenerator();
045 g.setSeed(16069223052l);
046 RandomVectorGenerator generator =
047 new UncorrelatedRandomVectorGenerator(2, new GaussianRandomGenerator(g));
048 MultiStartMultivariateRealOptimizer optimizer =
049 new MultiStartMultivariateRealOptimizer(underlying, 10, generator);
050 optimizer.setConvergenceChecker(new SimpleScalarValueChecker(-1, 1.0e-3));
051 optimizer.setMaxIterations(100);
052 RealPointValuePair optimum =
053 optimizer.optimize(rosenbrock, GoalType.MINIMIZE, new double[] { -1.2, 1.0 });
054
055 assertEquals(rosenbrock.getCount(), optimizer.getEvaluations());
056 assertTrue(optimizer.getEvaluations() > 20);
057 assertTrue(optimizer.getEvaluations() < 250);
058 assertTrue(optimum.getValue() < 8.0e-4);
059
060 }
061
062 private static class Rosenbrock implements MultivariateRealFunction {
063
064 private int count;
065
066 public Rosenbrock() {
067 count = 0;
068 }
069
070 public double value(double[] x) throws FunctionEvaluationException {
071 ++count;
072 double a = x[1] - x[0] * x[0];
073 double b = 1.0 - x[0];
074 return 100 * a * a + b * b;
075 }
076
077 public int getCount() {
078 return count;
079 }
080
081 }
082
083 }