2 // --- coding: latin_1 ---
5 // creation : 2007-03-30.13.44.14
8 // Copyright © 2007 Commissariat à l'Energie Atomique
9 // par Gilles ARNAUD (DM2S/SFME/LETR)
10 // C.E. Saclay; Bat 454; 91191 GIF/YVETTE CEDEX; France
11 // Tel: 01 69 08 38 86; Fax : 33 1 69 08 85 68
12 // Gilles.Arnaud@cea.fr
15 // version distribue du simplex de nelder mead
17 //___________________________________________________________________
20 #include "simplex.hxx"
26 Simplex::Simplex(long sz, long nbgen, Maestro &maest)
35 Simplex::~Simplex(void)
39 if (work.size() == size) {
40 for (i=0; i<size; i++)
42 for (i=0; i<nbin; i++)
47 void Simplex::setStop(long max)
52 void Simplex::start(void)
57 for (i=0; i<size; i++) {
58 work[i] = new Point(nbin);
59 calc->put(i, *(work[i]->next()));
65 int Simplex::next(void)
69 std::vector<double> *next, *res;
73 pt = work[id]->inform(*res);
77 work[id]->mute(*pnt, *barycentre(), *minimum());
81 next = work[id]->next();
90 void Simplex::finish(void)
92 std::cout << maxe - nbeval << std::endl;
96 Solution *Simplex::solution(void)
101 Solution *Simplex::add(Solution *sol)
106 if (simplx.size() < nbin) {
107 ret = (Solution *) NULL;
109 simplx.push_back(sol);
110 while (i && simplx[i]->obj[0] < simplx[i-1]->obj[0]) {
113 simplx[i] = simplx[i-1];
118 else if (sol->obj[0] > simplx[nbin-1]->obj[0])
124 while (i && simplx[i]->obj[0] < simplx[i-1]->obj[0]) {
126 simplx[i] = simplx[i-1];
134 std::vector<double> *Simplex::minimum(void)
136 return new std::vector<double>(*simplx[0]->param);
139 std::vector<double> *Simplex::barycentre(void)
142 std::vector<double> *ret;
144 ret = new std::vector<double>(nbin);
145 for (i=0; i<nbin; i++) {
147 for (j=0; j<nbin; j++)
148 (*ret)[i] += (*simplx[j]->param)[i];