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 import static org.junit.Assert.fail;
23
24 import org.apache.commons.math.MathException;
25 import org.apache.commons.math.analysis.QuinticFunction;
26 import org.apache.commons.math.analysis.SinFunction;
27 import org.apache.commons.math.analysis.UnivariateRealFunction;
28 import org.apache.commons.math.optimization.univariate.BrentOptimizer;
29 import org.apache.commons.math.random.JDKRandomGenerator;
30 import org.junit.Test;
31
32 public class MultiStartUnivariateRealOptimizerTest {
33
34 @Test
35 public void testSinMin() throws MathException {
36 UnivariateRealFunction f = new SinFunction();
37 UnivariateRealOptimizer underlying = new BrentOptimizer();
38 JDKRandomGenerator g = new JDKRandomGenerator();
39 g.setSeed(44428400075l);
40 MultiStartUnivariateRealOptimizer minimizer =
41 new MultiStartUnivariateRealOptimizer(underlying, 10, g);
42 minimizer.optimize(f, GoalType.MINIMIZE, -100.0, 100.0);
43 double[] optima = minimizer.getOptima();
44 double[] optimaValues = minimizer.getOptimaValues();
45 for (int i = 1; i < optima.length; ++i) {
46 double d = (optima[i] - optima[i-1]) / (2 * Math.PI);
47 assertTrue (Math.abs(d - Math.rint(d)) < 1.0e-8);
48 assertEquals(-1.0, f.value(optima[i]), 1.0e-10);
49 assertEquals(f.value(optima[i]), optimaValues[i], 1.0e-10);
50 }
51 assertTrue(minimizer.getEvaluations() > 2900);
52 assertTrue(minimizer.getEvaluations() < 3100);
53 }
54
55 @Test
56 public void testQuinticMin() throws MathException {
57
58
59 UnivariateRealFunction f = new QuinticFunction();
60 UnivariateRealOptimizer underlying = new BrentOptimizer();
61 JDKRandomGenerator g = new JDKRandomGenerator();
62 g.setSeed(4312000053l);
63 MultiStartUnivariateRealOptimizer minimizer =
64 new MultiStartUnivariateRealOptimizer(underlying, 5, g);
65 minimizer.setAbsoluteAccuracy(10 * minimizer.getAbsoluteAccuracy());
66 minimizer.setRelativeAccuracy(10 * minimizer.getRelativeAccuracy());
67
68 try {
69 minimizer.getOptima();
70 fail("an exception should have been thrown");
71 } catch (IllegalStateException ise) {
72
73 } catch (Exception e) {
74 fail("wrong exception caught");
75 }
76 try {
77 minimizer.getOptimaValues();
78 fail("an exception should have been thrown");
79 } catch (IllegalStateException ise) {
80
81 } catch (Exception e) {
82 fail("wrong exception caught");
83 }
84
85 assertEquals(-0.27195612846834, minimizer.optimize(f, GoalType.MINIMIZE, -0.3, -0.2), 1.0e-13);
86 assertEquals(-0.27194301946870, minimizer.getResult(), 1.0e-13);
87 assertEquals(-0.04433426940878, minimizer.getFunctionValue(), 1.0e-13);
88
89 double[] optima = minimizer.getOptima();
90 double[] optimaValues = minimizer.getOptimaValues();
91 for (int i = 0; i < optima.length; ++i) {
92 assertEquals(f.value(optima[i]), optimaValues[i], 1.0e-10);
93 }
94
95 assertTrue(minimizer.getEvaluations() >= 510);
96 assertTrue(minimizer.getEvaluations() <= 530);
97 assertTrue(minimizer.getIterationCount() >= 150);
98 assertTrue(minimizer.getIterationCount() <= 170);
99
100 }
101
102 }