|
1 | 1 | import numpy as np |
2 | 2 |
|
3 | | -__all__ = ['crossover_1point', 'crossover_2point', 'crossover_2point_bit', 'crossover_pmx'] |
| 3 | +__all__ = ['crossover_1point', 'crossover_2point', 'crossover_2point_bit', 'crossover_pmx', 'crossover_2point_prob'] |
4 | 4 |
|
5 | 5 |
|
6 | 6 | def crossover_1point(self): |
@@ -46,6 +46,21 @@ def crossover_2point_bit(self): |
46 | 46 | return self.Chrom |
47 | 47 |
|
48 | 48 |
|
| 49 | +def crossover_2point_prob(self, crossover_prob): |
| 50 | + ''' |
| 51 | + 2 points crossover with probability |
| 52 | + ''' |
| 53 | + Chrom, size_pop, len_chrom = self.Chrom, self.size_pop, self.len_chrom |
| 54 | + for i in range(0, size_pop, 2): |
| 55 | + if np.random.rand() < crossover_prob: |
| 56 | + n1, n2 = np.random.randint(0, self.len_chrom, 2) |
| 57 | + if n1 > n2: |
| 58 | + n1, n2 = n2, n1 |
| 59 | + seg1, seg2 = self.Chrom[i, n1:n2].copy(), self.Chrom[i + 1, n1:n2].copy() |
| 60 | + self.Chrom[i, n1:n2], self.Chrom[i + 1, n1:n2] = seg2, seg1 |
| 61 | + return self.Chrom |
| 62 | + |
| 63 | + |
49 | 64 | # def crossover_rv_3(self): |
50 | 65 | # Chrom, size_pop = self.Chrom, self.size_pop |
51 | 66 | # i = np.random.randint(1, self.len_chrom) # crossover at the point i |
|
0 commit comments