MultiPoint кроссовер с использованием Numpy - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь сделать кроссовер в популяции генетического алгоритма, используя numpy.Я разделил совокупность, используя родительский 1 и родительский 2.

population = np.random.randint(2, size=(4,8))
p1 = population[::2]
p2 = population[1::2]

Но я не могу выяснить какую-либо лямбда-команду или команду numpy, чтобы сделать многоточечное пересечение над родителями.Идея состоит в том, чтобы ith row of p1 и произвольно поменять местами некоторые биты с ith row of p2.

1 Ответ

0 голосов
/ 20 ноября 2018

Я думаю, вы хотите выбрать из p1 и p2 случайным образом, ячейка за ячейкой.

Чтобы было легче понять, я изменил p1 на 10-15 и p2 на 20-25.p1 и p2 были сгенерированы случайным образом в этих диапазонах.

p1
Out[66]: 
array([[15, 15, 13, 14, 12, 13, 12, 12],
       [14, 11, 11, 10, 12, 12, 10, 12],
       [12, 11, 14, 15, 14, 10, 13, 10],
       [11, 12, 10, 13, 14, 13, 12, 13]])

In [67]: p2
Out[67]: 
array([[23, 25, 24, 21, 24, 20, 24, 25],
       [21, 21, 20, 20, 25, 22, 24, 22],
       [24, 22, 25, 20, 21, 22, 21, 22],
       [22, 20, 21, 22, 25, 23, 22, 21]])

In [68]: sieve=np.random.randint(2, size=(4,8))
In [69]: sieve
Out[69]: 
array([[0, 1, 0, 1, 1, 0, 1, 0],
       [1, 1, 1, 0, 0, 1, 1, 1],
       [0, 1, 1, 0, 0, 1, 1, 0],
       [0, 0, 0, 1, 1, 1, 1, 1]])
In [70]: not_sieve=sieve^1  # Complement of sieve

In [71]: pn = p1*sieve + p2*not_sieve

In [72]: pn
Out[72]:
array([[23, 15, 24, 14, 12, 20, 12, 25],
       [14, 11, 11, 20, 25, 12, 10, 12],
       [24, 11, 14, 20, 21, 10, 13, 22],
       [22, 20, 21, 13, 14, 13, 12, 13]])

Числа в подростках получены от p1, когда сито равно 1 Числа в двадцатых получены от p2, когда сито равно 0

Это может быть сделано более эффективным, но ожидаете ли вы этого в качестве результата?

...