-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodif_nslc.hpp
129 lines (114 loc) · 4.49 KB
/
modif_nslc.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//| This file is a part of the sferes2 framework.
//| Copyright 2009, ISIR / Universite Pierre et Marie Curie (UPMC)
//| Main contributor(s): Jean-Baptiste Mouret, [email protected]
//|
//| This software is a computer program whose purpose is to facilitate
//| experiments in evolutionary computation and evolutionary robotics.
//|
//| This software is governed by the CeCILL license under French law
//| and abiding by the rules of distribution of free software. You
//| can use, modify and/ or redistribute the software under the terms
//| of the CeCILL license as circulated by CEA, CNRS and INRIA at the
//| following URL "http://www.cecill.info".
//|
//| As a counterpart to the access to the source code and rights to
//| copy, modify and redistribute granted by the license, users are
//| provided only with a limited warranty and the software's author,
//| the holder of the economic rights, and the successive licensors
//| have only limited liability.
//|
//| In this respect, the user's attention is drawn to the risks
//| associated with loading, using, modifying and/or developing or
//| reproducing the software by the user in light of its specific
//| status of free software, that may mean that it is complicated to
//| manipulate, and that also therefore means that it is reserved for
//| developers and experienced professionals having in-depth computer
//| knowledge. Users are therefore encouraged to load and test the
//| software's suitability as regards their requirements in conditions
//| enabling the security of their systems and/or data to be ensured
//| and, more generally, to use and operate it in the same conditions
//| as regards security.
//|
//| The fact that you are presently reading this means that you have
//| had knowledge of the CeCILL license and that you accept its terms.
#ifndef MODIFIER_NSLC_HPP
#define MODIFIER_NSLC_HPP
#include <Eigen/Core>
#include <sferes/parallel.hpp>
namespace sferes {
namespace modif {
namespace nslc {
template<typename T>
struct _compare_dist_p {
_compare_dist_p(const T& v) : _v(v) {}
const T& _v;
template<typename T1, typename T2>
bool operator()(const T1& v1, const T2& v2) const {
return _v->fit().dist(*v1) < _v->fit().dist(*v2);
}
};
}
template<typename Phen, typename Params, typename Exact = stc::Itself>
class Nslc {
public:
typedef boost::shared_ptr<Phen> phen_t;
typedef std::vector<phen_t> pop_t;
Nslc() : _rho_min(Params::nslc::rho_min_init), _not_added(0) {}
template<typename Ea>
void apply(Ea& ea) {
size_t k = Params::nslc::k;
// merge the population and the archive in a single archive
pop_t archive = _archive;
archive.insert(archive.end(), ea.pop().begin(), ea.pop().end());
// compute the sparseness of each individual of the population
// and potentially add some of them to the archive
int added = 0;
for (size_t i = 0; i < ea.pop().size(); ++i) {
size_t nb_objs = ea.pop()[i]->fit().objs().size();
assert(nb_objs >= 2);
// sort
parallel::sort(archive.begin(), archive.end(),
nslc::_compare_dist_p<phen_t>(ea.pop()[i]));
// local competition score
int rank = k;
for (size_t j = 0; j < k; ++j)
if (ea.pop()[i]->fit().value() < archive[j]->fit().value())
rank--;
ea.pop()[i]->fit().set_obj(0, rank);
// novelty
double n = 0.0;
for (size_t j = 0; j < k; ++j)
n += ea.pop()[i]->fit().dist(*archive[j]);
ea.pop()[i]->fit().set_obj(1, n);
// add to the archive
if (n > _rho_min
|| misc::rand<float>() < Params::nslc::add_to_archive_prob) {
_archive.push_back(ea.pop()[i]);
_not_added = 0;
++added;
} else {
++_not_added;
}
} // end for all individuals
// update rho_min
if (_not_added > Params::nslc::stalled_tresh) { //2500
_rho_min *= 0.95;
_not_added = 0;
}
if (_archive.size() > Params::nslc::k
&& added > Params::nslc::adding_tresh) {//4
_rho_min *= 1.05f;
}
std::cout<<"archive size:"<<_archive.size()<<std::endl;
}
const pop_t& archive() const {
return _archive;
}
protected:
pop_t _archive;
float _rho_min;
size_t _not_added;
};
} // modif
} // sferes
#endif