1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.math.optimization;
19
20 import static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertTrue;
22
23 import org.apache.commons.math.ConvergenceException;
24 import org.apache.commons.math.FunctionEvaluationException;
25 import org.apache.commons.math.analysis.MultivariateRealFunction;
26 import org.apache.commons.math.optimization.direct.NelderMead;
27 import org.apache.commons.math.random.GaussianRandomGenerator;
28 import org.apache.commons.math.random.JDKRandomGenerator;
29 import org.apache.commons.math.random.RandomVectorGenerator;
30 import org.apache.commons.math.random.UncorrelatedRandomVectorGenerator;
31 import org.junit.Test;
32
33 public class MultiStartMultivariateRealOptimizerTest {
34
35 @Test
36 public void testRosenbrock()
37 throws FunctionEvaluationException, ConvergenceException {
38
39 Rosenbrock rosenbrock = new Rosenbrock();
40 NelderMead underlying = new NelderMead();
41 underlying.setStartConfiguration(new double[][] {
42 { -1.2, 1.0 }, { 0.9, 1.2 } , { 3.5, -2.3 }
43 });
44 JDKRandomGenerator g = new JDKRandomGenerator();
45 g.setSeed(16069223052l);
46 RandomVectorGenerator generator =
47 new UncorrelatedRandomVectorGenerator(2, new GaussianRandomGenerator(g));
48 MultiStartMultivariateRealOptimizer optimizer =
49 new MultiStartMultivariateRealOptimizer(underlying, 10, generator);
50 optimizer.setConvergenceChecker(new SimpleScalarValueChecker(-1, 1.0e-3));
51 optimizer.setMaxIterations(100);
52 RealPointValuePair optimum =
53 optimizer.optimize(rosenbrock, GoalType.MINIMIZE, new double[] { -1.2, 1.0 });
54
55 assertEquals(rosenbrock.getCount(), optimizer.getEvaluations());
56 assertTrue(optimizer.getEvaluations() > 20);
57 assertTrue(optimizer.getEvaluations() < 250);
58 assertTrue(optimum.getValue() < 8.0e-4);
59
60 }
61
62 private static class Rosenbrock implements MultivariateRealFunction {
63
64 private int count;
65
66 public Rosenbrock() {
67 count = 0;
68 }
69
70 public double value(double[] x) throws FunctionEvaluationException {
71 ++count;
72 double a = x[1] - x[0] * x[0];
73 double b = 1.0 - x[0];
74 return 100 * a * a + b * b;
75 }
76
77 public int getCount() {
78 return count;
79 }
80
81 }
82
83 }