50 auto front =
fast_nds(pop, island_pool);
51 for (
size_t i = 0; i< front.size(); i++)
56 vector<size_t> selected(0);
57 for (
int i = 0; i < island_pool.size(); ++i)
60 *
r.select_randomly(island_pool.begin(), island_pool.end()),
61 *
r.select_randomly(island_pool.begin(), island_pool.end()));
63 selected.push_back(winner);
78 auto original_size = params.
pop_size;
83 std::vector<size_t> island_pool;
86 island_pool.insert(island_pool.end(), indexes.begin(), indexes.end());
90 auto front =
fast_nds(pop, island_pool);
93 vector<size_t> selected;
99 && ( selected.size() + front.at(i).size() < original_size )
102 std::vector<int>& Fi = front.at(i);
106 for (
int j = 0; j < Fi.size(); ++j)
107 selected.push_back(Fi.at(j));
114 std::sort(front.at(i).begin(),front.at(i).end(),
sort_n(pop));
117 const int extra = original_size - selected.size();
118 for (
int j = 0; j < extra; ++j)
119 selected.push_back(front.at(i).at(j));
132 vector<vector<int>> front;
137 for (
int i = 0; i < island_pool.size(); ++i) {
139 std::vector<unsigned int> dom;
144 for (
int j = 0; j < island_pool.size(); ++j) {
148 int compare = p->fitness.dominates(q.
fitness);
151 dom.push_back(island_pool[j]);
152 }
else if (compare == -1) {
157 p->fitness.dcounter = dcount;
158 p->fitness.dominated.clear();
159 p->fitness.dominated = dom;
160 p->fitness.set_crowding_dist(0.0f);
162 if (p->fitness.dcounter == 0) {
164 p->fitness.set_rank(1);
166 front.at(0).push_back(island_pool[i]);
176 std::sort(front.at(0).begin(), front.at(0).end());
179 while (front.at(fi-1).size() > 0) {
180 std::vector<int>& fronti = front.at(fi-1);
182 for (
int i = 0; i < fronti.size(); ++i) {
193 q->fitness.dcounter -= 1;
195 if (q->fitness.dcounter == 0) {
198 q->fitness.set_rank(fi+1);
217 std::vector<int> F = front.at(fronti);
223 const int fsize = F.size();
226 for (
int i = 0; i < fsize; ++i)
227 pop.
individuals.at(F.at(i))->fitness.set_crowding_dist(0.0f);
231 const int limit = pop.
individuals.at(0)->fitness.get_wvalues().size();
234 for (
int m = 0; m < limit; ++m) {
241 pop.
individuals.at(F.at(0))->fitness.crowding_dist = std::numeric_limits<float>::max();
243 pop.
individuals.at(F.at(fsize-1))->fitness.crowding_dist = std::numeric_limits<float>::max();
245 float first_of_front = pop.
individuals.at(F.at(0))->fitness.get_wvalues().at(m);
246 float last_of_front = pop.
individuals.at(F.at(fsize-1))->fitness.get_wvalues().at(m);
247 for (
int i = 1; i < fsize-1; ++i)
249 if (pop.
individuals.at(F.at(i))->fitness.crowding_dist != std::numeric_limits<float>::max())
251 float next_of_front = pop.
individuals.at(F.at(i+1))->fitness.get_wvalues().at(m);
252 float prev_of_front = pop.
individuals.at(F.at(i-1))->fitness.get_wvalues().at(m);
255 pop.
individuals.at(F.at(i))->fitness.crowding_dist +=
256 (next_of_front - prev_of_front) / (last_of_front - first_of_front);