public void TestReflection() { Poly cf = new Poly(); NelderMead optim = new NelderMead(cf); DoubleVector[] simplex = new DoubleVector[3]; simplex[0] = new DoubleVector(new double[2]{1,1}); simplex[1] = new DoubleVector(new double[2]{1,-1}); simplex[2] = new DoubleVector(new double[2]{2,0}); optim.Rho = 1.5; optim.InitializeMethod(simplex); optim.IterateMethod(); DoubleVector xr = (1+optim.Rho)*(new DoubleVector(new double[2]{1,0})) - optim.Rho*simplex[2]; Assert.IsTrue(optim.LastStep == NelderMead.Step.Reflection); Assert.AreEqual(optim.Simplex[0][0],xr[0]); Assert.AreEqual(optim.Simplex[0][1],xr[1]); }
public void TestInitializeMethod() { Rosenbrock cf = new Rosenbrock(); NelderMead optim = new NelderMead(cf); DoubleVector x0 = new DoubleVector(new double[4]{0,1,2,3}); optim.SimplexDelta = 0.1; optim.SimplexZeroDelta = 0.0001; optim.InitializeMethod(x0); Assert.AreEqual(optim.Simplex.Length,5); for (int i=0; i<optim.Simplex.Length; i++) { Assert.AreEqual(optim.Simplex[i][0],x0[0],optim.SimplexZeroDelta); Assert.AreEqual(optim.Simplex[i][1],x0[1],optim.SimplexDelta*x0[1]+0.001); Assert.AreEqual(optim.Simplex[i][2],x0[2],optim.SimplexDelta*x0[2]+0.001); Assert.AreEqual(optim.Simplex[i][3],x0[3],optim.SimplexDelta*x0[3]+0.001); } for (int i=1; i<optim.Simplex.Length; i++) { Assert.IsTrue(cf.Value(optim.Simplex[i-1])<cf.Value(optim.Simplex[i])); } }
public void TestShrink() { Poly cf = new Poly(); NelderMead optim = new NelderMead(cf); DoubleVector[] simplex = new DoubleVector[3]; simplex[0] = new DoubleVector(new double[2]{1,1}); simplex[1] = new DoubleVector(new double[2]{1,-1}); simplex[2] = new DoubleVector(new double[2]{2,0}); optim.Rho = 10; optim.Psi = 1.5; optim.InitializeMethod(simplex); optim.IterateMethod(); Assert.IsTrue(optim.LastStep == NelderMead.Step.Shrink); }