| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.commons.math3.optimization; |
| |
| |
| import org.apache.commons.math3.analysis.differentiation.MultivariateDifferentiableFunction; |
| import org.apache.commons.math3.geometry.euclidean.twod.Vector2D; |
| import org.apache.commons.math3.optimization.general.CircleScalar; |
| import org.apache.commons.math3.optimization.general.ConjugateGradientFormula; |
| import org.apache.commons.math3.optimization.general.NonLinearConjugateGradientOptimizer; |
| import org.apache.commons.math3.random.GaussianRandomGenerator; |
| import org.apache.commons.math3.random.JDKRandomGenerator; |
| import org.apache.commons.math3.random.RandomVectorGenerator; |
| import org.apache.commons.math3.random.UncorrelatedRandomVectorGenerator; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| @Deprecated |
| public class MultivariateDifferentiableMultiStartOptimizerTest { |
| |
| @Test |
| public void testCircleFitting() { |
| CircleScalar circle = new CircleScalar(); |
| circle.addPoint( 30.0, 68.0); |
| circle.addPoint( 50.0, -6.0); |
| circle.addPoint(110.0, -20.0); |
| circle.addPoint( 35.0, 15.0); |
| circle.addPoint( 45.0, 97.0); |
| // TODO: the wrapper around NonLinearConjugateGradientOptimizer is a temporary hack for |
| // version 3.1 of the library. It should be removed when NonLinearConjugateGradientOptimizer |
| // will officially be declared as implementing MultivariateDifferentiableOptimizer |
| MultivariateDifferentiableOptimizer underlying = |
| new MultivariateDifferentiableOptimizer() { |
| |
| private final NonLinearConjugateGradientOptimizer cg = |
| new NonLinearConjugateGradientOptimizer(ConjugateGradientFormula.POLAK_RIBIERE, |
| new SimpleValueChecker(1.0e-10, 1.0e-10)); |
| public PointValuePair optimize(int maxEval, |
| MultivariateDifferentiableFunction f, |
| GoalType goalType, |
| double[] startPoint) { |
| return cg.optimize(maxEval, f, goalType, startPoint); |
| } |
| |
| public int getMaxEvaluations() { |
| return cg.getMaxEvaluations(); |
| } |
| |
| public int getEvaluations() { |
| return cg.getEvaluations(); |
| } |
| |
| public ConvergenceChecker<PointValuePair> getConvergenceChecker() { |
| return cg.getConvergenceChecker(); |
| } |
| }; |
| JDKRandomGenerator g = new JDKRandomGenerator(); |
| g.setSeed(753289573253l); |
| RandomVectorGenerator generator = |
| new UncorrelatedRandomVectorGenerator(new double[] { 50.0, 50.0 }, new double[] { 10.0, 10.0 }, |
| new GaussianRandomGenerator(g)); |
| MultivariateDifferentiableMultiStartOptimizer optimizer = |
| new MultivariateDifferentiableMultiStartOptimizer(underlying, 10, generator); |
| PointValuePair optimum = |
| optimizer.optimize(200, circle, GoalType.MINIMIZE, new double[] { 98.680, 47.345 }); |
| Assert.assertEquals(200, optimizer.getMaxEvaluations()); |
| PointValuePair[] optima = optimizer.getOptima(); |
| for (PointValuePair o : optima) { |
| Vector2D center = new Vector2D(o.getPointRef()[0], o.getPointRef()[1]); |
| Assert.assertEquals(69.960161753, circle.getRadius(center), 1.0e-8); |
| Assert.assertEquals(96.075902096, center.getX(), 1.0e-8); |
| Assert.assertEquals(48.135167894, center.getY(), 1.0e-8); |
| } |
| Assert.assertTrue(optimizer.getEvaluations() > 70); |
| Assert.assertTrue(optimizer.getEvaluations() < 90); |
| Assert.assertEquals(3.1267527, optimum.getValue(), 1.0e-8); |
| } |
| |
| } |