11 #include <vision_module/Tools/OptimizorParam.hpp>
22 vector<OptimizorParam> parameters;
23 unsigned int paramsCount;
25 float (T::*pFunc)(
const vector<float>& parameters);
28 float (T::*pFunc)(
const vector<float>& parameters)) :
29 paramsCount(0), obj(obj), pFunc(pFunc)
34 bool TuneForBest(
int maxIteration,
35 double tol = 1E8 * std::numeric_limits<float>::epsilon(),
36 std::vector<std::vector<float> > x = std::vector<
37 std::vector<float> >())
39 std::vector<float> init;
40 for(
size_t pi=0;pi<paramsCount;pi++)
42 init.push_back(parameters[pi].data);
45 const double a = 1.0, b = 1.0, g = 0.5, h = 0.5;
50 std::vector<float> xcentroid_old(N, 0);
51 std::vector<float> xcentroid_new(N, 0);
52 std::vector<float> vf(N + 1, 0);
53 int x1 = 0, xn = 0, xnp1 = 0;
61 std::vector<float> del(init);
62 std::transform(del.begin(), del.end(), del.begin(),
63 std::bind2nd(std::divides<float>(), 20));
66 for (
int i = 0; i < N; ++i)
68 std::vector<float> tmp(init);
75 std::transform(init.begin(), init.end(), xcentroid_old.begin(),
76 std::bind2nd(std::multiplies<float>(), N + 1));
80 for (cnt = 0; cnt < maxIteration; ++cnt)
83 for (
int i = 0; i < N + 1; ++i)
85 vf[i] = (obj.*pFunc)(x[i]);
92 for (
size_t i = 0; i < vf.size(); ++i)
106 for (
size_t i = 0; i < vf.size(); ++i)
108 if (vf[i] < vf[xnp1] && vf[i] > vf[xn])
113 std::vector<float> xg(N, 0);
114 for (
size_t i = 0; i < x.size(); ++i)
116 if (i != (
size_t)xnp1)
117 std::transform(xg.begin(), xg.end(), x[i].begin(),
118 xg.begin(), std::plus<float>());
120 std::transform(xg.begin(), xg.end(), x[xnp1].begin(),
121 xcentroid_new.begin(), std::plus<float>());
122 std::transform(xg.begin(), xg.end(), xg.begin(),
123 std::bind2nd(std::divides<float>(), N));
129 for (
int i = 0; i < N; ++i)
130 diff += fabs(xcentroid_old[i] - xcentroid_new[i]);
135 xcentroid_old.swap(xcentroid_new);
138 std::vector<float> xr(N, 0);
139 for (
int i = 0; i < N; ++i)
140 xr[i] = xg[i] + a * (xg[i] - x[xnp1][i]);
143 float fxr = (obj.*pFunc)(xr);
145 if (vf[x1] <= fxr && fxr <= vf[xn])
146 std::copy(xr.begin(), xr.end(), x[xnp1].begin());
149 else if (fxr < vf[x1])
151 std::vector<float> xe(N, 0);
152 for (
int i = 0; i < N; ++i)
153 xe[i] = xr[i] + b * (xr[i] - xg[i]);
154 if ((obj.*pFunc)(xe) < fxr)
155 std::copy(xe.begin(), xe.end(), x[xnp1].begin());
157 std::copy(xr.begin(), xr.end(), x[xnp1].begin());
161 else if (fxr > vf[xn])
163 std::vector<float> xc(N, 0);
164 for (
int i = 0; i < N; ++i)
165 xc[i] = xg[i] + g * (x[xnp1][i] - xg[i]);
166 if ((obj.*pFunc)(xc) < vf[xnp1])
167 std::copy(xc.begin(), xc.end(), x[xnp1].begin());
170 for (
size_t i = 0; i < x.size(); ++i)
174 for (
int j = 0; j < N; ++j)
175 x[i][j] = x[x1][j] + h * (x[i][j] - x[x1][j]);
183 for(
size_t pi=0;pi<x[x1].size();pi++)
185 parameters[pi].data = x[x1][pi];
187 cout <<
" Tune counter = " << cnt << endl;
188 if (cnt == maxIteration)
195 void setParameters(vector<OptimizorParam> _parameters)
197 parameters = _parameters;
198 paramsCount = _parameters.size();
201 vector<OptimizorParam> getParameters()
const
Nelder–Mead optimization.
Definition: SimplexOptimizer.hpp:19