NimbRo ROS Soccer Package
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
HillOptimizer.hpp
1 //HillOptimizer.hpp
2 // Created on: June 3, 2015
3 // Author: Hafez Farazi <farazi@ais.uni-bonn.de>
4 #pragma once
5 #include "opencv2/opencv.hpp"
6 #include <stdlib.h> /* abs */
7 #include <vision_module/Tools/General.hpp>
8 #include <vision_module/Tools/OptimizorParam.hpp>
9 
10 using namespace cv;
16 template<class T>
18 {
19 private:
20  vector<OptimizorParam> parameters;
21  unsigned int paramsCount;
22  T& obj;
23  float (T::*pFunc)(const vector<OptimizorParam>& parameters);
24 public:
25  HillOptimizer(T& obj, float (T::*pFunc)(const vector<OptimizorParam>& parameters)) :
26  paramsCount(0),obj(obj), pFunc(pFunc)
27  {
28 
29  }
30 
31  bool TuneForBest(int maxIteration, double tol = 0.0000001)
32  {
33  double lastRes = Tune();
34  cout << " First Tune =" << lastRes << endl;
35  int successCounter = 0;
36  for (int i = 0; i < maxIteration; i++)
37  {
38  double curRes = Tune();
39  cout << " Tune counter = " << i << " TuneRes = " << curRes << endl;
40  if ((lastRes - curRes) < tol)
41  {
42  successCounter++;
43  }
44  else
45  {
46  successCounter = 0;
47  }
48  if (successCounter >= 3)
49  {
50  return true;
51  }
52  lastRes = curRes;
53  }
54  return false;
55  }
56 
57  float Tune()
58  {
59  float bestResult = 999999999;
60  for (size_t i = 0; i < paramsCount; i++)
61  {
62  float resOld = (obj.*pFunc)(parameters);
63  float resAbove = resOld;
64  float resBelow = resOld;
65 
66  bool tuned = false;
67  while (!tuned)
68  {
69  float oldParameter = parameters[i].data;
70 
71  float stepAbove = oldParameter + parameters[i].step;
72  float stepBelow = oldParameter - parameters[i].step;
73 
74  parameters[i].data = stepAbove;
75  resAbove = (obj.*pFunc)(parameters);
76 
77  parameters[i].data = stepBelow;
78  resBelow = (obj.*pFunc)(parameters);
79 
80  if (resAbove < resBelow && resAbove < resOld)
81  {
82  parameters[i].data = stepAbove;
83  resOld = resAbove;
84  }
85  else if (resAbove > resBelow && resBelow < resOld)
86  {
87  parameters[i].data = stepBelow;
88  resOld = resBelow;
89  }
90  else
91  {
92  parameters[i].data = oldParameter;
93  bestResult = min(bestResult, resOld);
94  tuned = true;
95  }
96  }
97  }
98  return bestResult;
99  }
100 
101  void setParameters(vector<OptimizorParam> _parameters)
102  {
103  parameters = _parameters;
104  paramsCount = _parameters.size();
105  }
106  vector<OptimizorParam> getParameters() const
107  {
108  return parameters;
109  }
110 };
A class for hill climbing optimization.
Definition: HillOptimizer.hpp:17