-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathessRecombine.c
59 lines (47 loc) · 1.87 KB
/
essRecombine.c
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
#include "ess.h"
/**
* Recombined `ind` with `ind_index` in the refSet with all the other members of refSet
* and return the index of the best recombined solution that outperform its parent.
* `-1` means there was not such a solution exist.
* @param eSSParams
* @param ind parent Individual
* @param ind_index index of the parent Individual
* @param bestInd
* @param inp
* @param out
* @return index of the best candidate that outperform its parent.
*/
int recombine(eSSType *eSSParams, Individual *ind, int ind_index,/* Individual *bestInd,*/
void *inp, void *out){
double c1;
double c2;
double d;
double alpha, beta;
int p = 0;
int best_index = -1;
for (int j = 0; j < eSSParams->n_refSet; ++j)
{
if ( j != ind_index ){
alpha = ( ind_index < j ) ? 1 : -1;
beta = abs(j - ind_index);
for (int k = 0; k < eSSParams->n_params; ++k)
{
d = eSSParams->refSet->members[j].params[k] - eSSParams->refSet->members[ind_index].params[k];
c1 = eSSParams->refSet->members[ind_index].params[k] - d * ( 1 + alpha * beta);
c2 = eSSParams->refSet->members[ind_index].params[k] + d * ( 1 + alpha * beta);
c1 = MAX(eSSParams->min_real_var[k], c1); c1 = MIN(eSSParams->max_real_var[k], c1);
c2 = MAX(eSSParams->min_real_var[k], c2); c2 = MIN(eSSParams->max_real_var[k], c2);
eSSParams->candidateSet->members[p].params[k] = c1 + (c2 - c1) * rndreal(0, 1);
}
evaluate_Individual(eSSParams, &(eSSParams->candidateSet->members[p]), inp, out);
eSSParams->candidateSet->members[p].dist = 0;
eSSParams->candidateSet->members[p].mean_cost = 0;
eSSParams->candidateSet->members[p].var_cost = 0;
eSSParams->candidateSet->members[p].n_stuck = 0;
if ( eSSParams->candidateSet->members[p].cost < eSSParams->refSet->members[ind_index].cost )
best_index = p;
p++;
}
}
return best_index;
}