Python: как реализовать пересечение двух целых чисел? - PullRequest
0 голосов
/ 15 марта 2020

Я экспериментирую с генеральным алгоритмом поиска c, и после того, как я случайно собрал начальную популяцию, а затем выбрал две верхние наиболее подходящие записи, мне нужно «спарить» их (с некоторой случайной мутацией), чтобы создать 64 ' дети'. Часть кроссовера, объясненная здесь:

https://towardsdatascience.com/introduction-to-genetic-algorithms-including-example-code-e396e98d8bf3

кажется легкой для понимания, но я не могу понять, как реализовать ее в Python , Как я могу реализовать это пересечение двух целых чисел?

Ответы [ 2 ]

1 голос
/ 15 марта 2020
def crossover(a, b, index):
    return b[:index] + a[index:], a[:index] + b[index:]

Должно быть немного быстрее решения Джеймса, поскольку это позволяет Python делать всю работу!

0 голосов
/ 15 марта 2020

Вот функция, называемая кроссовером, которая принимает двух родителей и точку кроссовера. У родителей должны быть списки целых чисел одинаковой длины. Точка пересечения - это точка, до которой происходит обмен генами, как определено в статье, с которой вы связаны. Он возвращает двух потомков родителей.

def crossover(a, b, crossover_point):
    a1 = a[:]
    b1 = b[:]
    for i in range(crossover_point):
        a1[i], b1[i] = b1[i], a1[i]
    return [a1, b1]

А вот код, демонстрирующий его использование. Он создает совокупность, состоящую из двух списков длиной 10, один из которых содержит только нули, а другой - только один. Он пересекает их в точке 4 и добавляет детей в совокупность.

def test_crossover():
    a = [0]*10
    b = [1]*10
    population = [a,b]
    population += crossover(a,b,4)
    return population

print (test_crossover())

Результат вышеупомянутого:

[
   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
   [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
   [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
   [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...