Skip to content

Commit c9819d1

Browse files
committed
crossover: add a crossover function with probability
1 parent ae75a37 commit c9819d1

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

sko/operators/crossover.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import numpy as np
22

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']
44

55

66
def crossover_1point(self):
@@ -46,6 +46,21 @@ def crossover_2point_bit(self):
4646
return self.Chrom
4747

4848

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+
4964
# def crossover_rv_3(self):
5065
# Chrom, size_pop = self.Chrom, self.size_pop
5166
# i = np.random.randint(1, self.len_chrom) # crossover at the point i

0 commit comments

Comments
 (0)