TestDownhillSimplex.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #ifdef NICE_USELIB_CPPUNIT
  2. #include <string>
  3. #include <exception>
  4. #include <map>
  5. #include "TestDownhillSimplex.h"
  6. using namespace std;
  7. const bool verboseStartEnd = true;
  8. // const bool verbose = true;
  9. const bool verbose = false;
  10. CPPUNIT_TEST_SUITE_REGISTRATION( TestDownhillSimplex );
  11. void TestDownhillSimplex::setUp() {
  12. }
  13. void TestDownhillSimplex::tearDown() {
  14. }
  15. //define a simple cost function for one-dimensional or two-dimensional data
  16. class MyCostFunction : public CostFunction
  17. {
  18. public:
  19. MyCostFunction(const int & dim) : CostFunction(dim)
  20. {
  21. }
  22. virtual double evaluate(const optimization::matrix_type & x)
  23. {
  24. double f;
  25. if (verbose)
  26. std::cerr << x.rows() << " x " << x.cols() << std::endl;
  27. if ( x.rows() == 1 )
  28. {
  29. if (verbose)
  30. std::cerr << "current position: " << x[0][0] << std::endl;
  31. //our cost function is f(x) = (x-5)^2
  32. f = pow(x[0][0] - 4.2, 2.0);
  33. if (verbose)
  34. std::cerr << "function value: " << f << std::endl;
  35. }
  36. //two-dimensional data
  37. else {
  38. if (verbose)
  39. std::cerr << "current position: " << x[0][0] << " " << x[1][0] << std::endl;
  40. //our cost function is f(x,y) = (x-4.7)^2 + (y-1.1)^2
  41. f = pow(x[0][0] - 4.7, 2.0) + pow( x[1][0] - 1.1, 2.0 );
  42. if (verbose)
  43. std::cerr << "function value: " << f << std::endl;
  44. }
  45. return f;
  46. }
  47. };
  48. void TestDownhillSimplex::testDHS_1Dim ()
  49. {
  50. if (verboseStartEnd)
  51. std::cerr << "================== TestDownhillSimplex::testDHS_1Dim ===================== " << std::endl;
  52. int dim (1);
  53. CostFunction *func = new MyCostFunction(dim);
  54. //initial guess: 2.0
  55. optimization::matrix_type initialParams (dim, 1);
  56. initialParams.Set(2.0);
  57. //we search with step-width of 1.0
  58. optimization::matrix_type scales (dim, 1);
  59. scales.Set(1.0);
  60. //setup the optimization problem
  61. SimpleOptProblem optProblem ( func, initialParams, scales );
  62. DownhillSimplexOptimizer optimizer;
  63. //actually, this has no effect at all
  64. optimizer.setMaxNumIter(true, 100);
  65. optimizer.optimizeProb ( optProblem );
  66. optimization::matrix_type optimizedParams (optProblem.getAllCurrentParams());
  67. double goal(4.2);
  68. if (verbose)
  69. std::cerr << "1d optimization -- result " << optimizedParams[0][0] << " -- goal: " << goal << std::endl;
  70. CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams[0][0], goal, 1e-7 /* tolerance */);
  71. if (verboseStartEnd)
  72. std::cerr << "================== TestDownhillSimplex::testDHS_1Dim done ===================== " << std::endl;
  73. }
  74. void TestDownhillSimplex::testDHS_2Dim()
  75. {
  76. if (verboseStartEnd)
  77. std::cerr << "================== TestDownhillSimplex::testDHS_2Dim ===================== " << std::endl;
  78. int dim (2);
  79. CostFunction *func = new MyCostFunction(dim);
  80. //initial guess: 2.0
  81. optimization::matrix_type initialParams (dim, 1);
  82. initialParams.Set(2.0);
  83. //we search with step-width of 1.0
  84. optimization::matrix_type scales (dim, 1);
  85. scales.Set(1.0);
  86. //setup the optimization problem
  87. SimpleOptProblem optProblem ( func, initialParams, scales );
  88. DownhillSimplexOptimizer optimizer;
  89. //actually, this has no effect at all
  90. optimizer.setMaxNumIter(true, 100);
  91. optimizer.optimizeProb ( optProblem );
  92. optimization::matrix_type optimizedParams (optProblem.getAllCurrentParams());
  93. double goalFirstDim(4.7);
  94. double goalSecondDim(1.1);
  95. if (verbose)
  96. {
  97. std::cerr << "2d optimization 1st dim-- result " << optimizedParams[0][0] << " -- goal: " << goalFirstDim << std::endl;
  98. std::cerr << "2d optimization 1st dim-- result " << optimizedParams[1][0] << " -- goal: " << goalSecondDim << std::endl;
  99. }
  100. CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams[0][0], goalFirstDim, 1e-7 /* tolerance */);
  101. CPPUNIT_ASSERT_DOUBLES_EQUAL( optimizedParams[1][0], goalSecondDim, 1e-7 /* tolerance */);
  102. if (verboseStartEnd)
  103. std::cerr << "================== TestDownhillSimplex::testDHS_2Dim done ===================== " << std::endl;
  104. }
  105. #endif