|
@@ 51-83 (lines=33) @@
|
| 48 |
|
x = [pop[r[0]][i] + f * (pop[r[1]][i] - pop[r[2]][i]) if rnd.rand() < cr or i == j else pop[ic][i] for i in range(len(pop[ic]))] |
| 49 |
|
return asarray(x) |
| 50 |
|
|
| 51 |
|
def CrossBest1(pop, ic, x_b, f, cr, rnd=rand, *args): |
| 52 |
|
r"""Mutation strategy with crossover. |
| 53 |
|
|
| 54 |
|
Mutation strategy uses two different random individuals from population and global best individual. |
| 55 |
|
|
| 56 |
|
Mutation: |
| 57 |
|
Name: de/best/1 |
| 58 |
|
|
| 59 |
|
:math:`\mathbf{v}_{i, G} = \mathbf{x}_{best, G} + F \cdot (\mathbf{x}_{r_1, G} - \mathbf{x}_{r_2, G})` |
| 60 |
|
where :math:`r_1, r_2` are random indexes representing current population individuals. |
| 61 |
|
|
| 62 |
|
Crossover: |
| 63 |
|
Name: Binomial crossover |
| 64 |
|
|
| 65 |
|
:math:`\mathbf{x}_{i, G+1} = \begin{cases} \mathbf{u}_{i, G+1}, & \text{if $f(\mathbf{u}_{i, G+1}) \leq f(\mathbf{x}_{i, G})$}, \\ \mathbf{x}_{i, G}, & \text{otherwise}. \end{cases}` |
| 66 |
|
|
| 67 |
|
args: |
| 68 |
|
pop (numpy.ndarray[Individual]): Current population. |
| 69 |
|
ic (int): Index of individual being mutated. |
| 70 |
|
x_b (Individual): Current global best individual. |
| 71 |
|
f (float): Scale factor. |
| 72 |
|
cr (float): Crossover probability. |
| 73 |
|
rnd (mtrand.RandomState): Random generator. |
| 74 |
|
*args (list): Additional arguments. |
| 75 |
|
|
| 76 |
|
returns: |
| 77 |
|
numpy.ndarray: Mutated and mixed individual. |
| 78 |
|
""" |
| 79 |
|
j = rnd.randint(len(pop[ic])) |
| 80 |
|
p = [1 / (len(pop) - 1.0) if i != ic else 0 for i in range(len(pop))] if len(pop) > 2 else None |
| 81 |
|
r = rnd.choice(len(pop), 2, replace=not len(pop) >= 2, p=p) |
| 82 |
|
x = [x_b[i] + f * (pop[r[0]][i] - pop[r[1]][i]) if rnd.rand() < cr or i == j else pop[ic][i] for i in range(len(pop[ic]))] |
| 83 |
|
return asarray(x) |
| 84 |
|
|
| 85 |
|
def CrossRand2(pop, ic, x_b, f, cr, rnd=rand, *args): |
| 86 |
|
r"""Mutation strategy with crossover. |
|
@@ 17-49 (lines=33) @@
|
| 14 |
|
logger = logging.getLogger('NiaPy.algorithms.basic') |
| 15 |
|
logger.setLevel('INFO') |
| 16 |
|
|
| 17 |
|
def CrossRand1(pop, ic, x_b, f, cr, rnd=rand, *args): |
| 18 |
|
r"""Mutation strategy with crossover. |
| 19 |
|
|
| 20 |
|
Mutation strategy uses three different random individuals from population to perform mutation. |
| 21 |
|
|
| 22 |
|
Mutation: |
| 23 |
|
Name: DE/rand/1 |
| 24 |
|
|
| 25 |
|
:math:`\mathbf{x}_{r_1, G} + F \cdot (\mathbf{x}_{r_2, G} - \mathbf{x}_{r_3, G}` |
| 26 |
|
where :math:`r_1, r_2, r_3` are random indexes representing current population individuals. |
| 27 |
|
|
| 28 |
|
Crossover: |
| 29 |
|
Name: Binomial crossover |
| 30 |
|
|
| 31 |
|
:math:`\mathbf{x}_{i, G+1} = \begin{cases} \mathbf{u}_{i, G+1}, & \text{if $f(\mathbf{u}_{i, G+1}) \leq f(\mathbf{x}_{i, G})$}, \\ \mathbf{x}_{i, G}, & \text{otherwise}. \end{cases}` |
| 32 |
|
|
| 33 |
|
Args: |
| 34 |
|
pop (numpy.ndarray[Individual]): Current population. |
| 35 |
|
ic (int): Index of individual being mutated. |
| 36 |
|
x_b (Individual): Current global best individual. |
| 37 |
|
f (float): Scale factor. |
| 38 |
|
cr (float): Crossover probability. |
| 39 |
|
rnd (mtrand.RandomState): Random generator. |
| 40 |
|
*args (list): Additional arguments. |
| 41 |
|
|
| 42 |
|
Returns: |
| 43 |
|
numpy.ndarray: Mutated and mixed individual. |
| 44 |
|
""" |
| 45 |
|
j = rnd.randint(len(pop[ic])) |
| 46 |
|
p = [1 / (len(pop) - 1.0) if i != ic else 0 for i in range(len(pop))] if len(pop) > 3 else None |
| 47 |
|
r = rnd.choice(len(pop), 3, replace=not len(pop) >= 3, p=p) |
| 48 |
|
x = [pop[r[0]][i] + f * (pop[r[1]][i] - pop[r[2]][i]) if rnd.rand() < cr or i == j else pop[ic][i] for i in range(len(pop[ic]))] |
| 49 |
|
return asarray(x) |
| 50 |
|
|
| 51 |
|
def CrossBest1(pop, ic, x_b, f, cr, rnd=rand, *args): |
| 52 |
|
r"""Mutation strategy with crossover. |