Как выполнить кроссовер с частичным сопоставлением в python3?

Я новичок в генетических алгоритмах и на днях сделал один, который воссоздал целевую строку. Поэтому я попытался сделать такой, который мог бы составить Магический квадрат. Все было нормально, пока я не перешел к кроссоверу, поняв, что не могу просто сделать кроссовер в одной точке. Итак, я попытался выполнить частично сопоставленный кроссовер, но не смог и до сих пор не могу заставить его работать. Я понимаю, как работает частично сопоставленный кроссовер, я просто не могу реализовать его в python. Поскольку мой код еще не завершен, я изолировал функцию кроссовера в другой программе и изменил ее, чтобы родители были фиксированным списком.

Может ли кто-нибудь исправить мой код или, если он совершенно неверен, показать мне, как выполнить кроссовер с частичным сопоставлением для 2 списков с целыми числами от 1 до 9? Кроме того, я сожалею и понимаю, что мои имена переменных не очень хороши, но я просто пытался заставить программу работать, делая постоянные изменения.

import random

parent1 = [1,2,3,4,5,6,7,8,9]
parent2 = [5,4,6,7,2,1,3,9,8]

firstCrossPoint = random.randint(0,len(parent1)-1)              #Creating parameters for random sublist
secondCrossPoint = random.randint(firstCrossPoint+1,len(parent1))

parent1MiddleCross = parent1[firstCrossPoint:secondCrossPoint]
parent2MiddleCross = parent2[firstCrossPoint:secondCrossPoint]

child1 = (parent1[:firstCrossPoint] + parent2MiddleCross + parent1[secondCrossPoint:])
child2 = (parent2[:firstCrossPoint] + parent1MiddleCross + parent2[secondCrossPoint:])

relationsWithDupes = []
for i in range(len(parent1MiddleCross)):
    relationsWithDupes.append([parent2MiddleCross[i], parent1MiddleCross[i]])

relations = []
for pair in relationsWithDupes:

    for i in range(len(relationsWithDupes)):
        if pair[0] in relationsWithDupes[i] or pair[1] in relationsWithDupes[i]:
            if pair != relationsWithDupes[i]:
                if pair[0] == relationsWithDupes[i][1]:
                    pair[0] = relationsWithDupes[i][0]

                else:
                    pair[1] = relationsWithDupes[i][1]

    if pair not in relations and pair[::-1] not in relations:
        relations.append(pair)

for i in child1[:firstCrossPoint]:
    for x in relations:
        if i == x[0]:
            i = x[1]

for i in child1[secondCrossPoint:]:
    for x in relations:
        if i == x[0]:
            i = x[1]

for i in child2[:firstCrossPoint]:
    for x in relations:
        if i == x[1]:
            i = x[0]

for i in child2[secondCrossPoint:]:
    for x in relations:
        if i == x[1]:
            i = x[0]

print(child1)
print(child2)

person Sam    schedule 11.11.2018    source источник


Ответы (1)


person    schedule
comment
Пожалуйста, не публикуйте ответы, в которых функции имеют непонятные имена, такие как recursion1 и recursion2. - person Herbert; 22.06.2020