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

1

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

Может кто-нибудь исправить мой код или, если он полностью неверен, покажите мне, как выполнить частичное сопоставление с двумя списками с целыми числами от 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)
Теги:
python-3.x
magic-square
genetic-algorithm
crossover

1 ответ

0
import numpy as np

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

firstCrossPoint = np.random.randint(0,len(parent1)-2)
secondCrossPoint = np.random.randint(firstCrossPoint+1,len(parent1)-1)

print(firstCrossPoint, secondCrossPoint)

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

temp_child1 = parent1[:firstCrossPoint] + parent2MiddleCross + parent1[secondCrossPoint:]

temp_child2 = parent2[:firstCrossPoint] + parent1MiddleCross + parent2[secondCrossPoint:]

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

print(relations)

def recursion1 (temp_child , firstCrossPoint , secondCrossPoint , parent1MiddleCross , parent2MiddleCross) :
    child = np.array([0 for i in range(len(parent1))])
    for i,j in enumerate(temp_child[:firstCrossPoint]):
        c=0
        for x in relations:
            if j == x[0]:
                child[i]=x[1]
                c=1
                break
        if c==0:
            child[i]=j
    j=0
    for i in range(firstCrossPoint,secondCrossPoint):
        child[i]=parent2MiddleCross[j]
        j+=1

    for i,j in enumerate(temp_child[secondCrossPoint:]):
        c=0
        for x in relations:
            if j == x[0]:
                child[i+secondCrossPoint]=x[1]
                c=1
                break
        if c==0:
            child[i+secondCrossPoint]=j
    child_unique=np.unique(child)
    if len(child)>len(child_unique):
        child=recursion1(child,firstCrossPoint,secondCrossPoint,parent1MiddleCross,parent2MiddleCross)
    return(child)

def recursion2(temp_child,firstCrossPoint,secondCrossPoint,parent1MiddleCross,parent2MiddleCross):
    child = np.array([0 for i in range(len(parent1))])
    for i,j in enumerate(temp_child[:firstCrossPoint]):
        c=0
        for x in relations:
            if j == x[1]:
                child[i]=x[0]
                c=1
                break
        if c==0:
            child[i]=j
    j=0
    for i in range(firstCrossPoint,secondCrossPoint):
        child[i]=parent1MiddleCross[j]
        j+=1

    for i,j in enumerate(temp_child[secondCrossPoint:]):
        c=0
        for x in relations:
            if j == x[1]:
                child[i+secondCrossPoint]=x[0]
                c=1
                break
        if c==0:
            child[i+secondCrossPoint]=j
    child_unique=np.unique(child)
    if len(child)>len(child_unique):
        child=recursion2(child,firstCrossPoint,secondCrossPoint,parent1MiddleCross,parent2MiddleCross)
    return(child)

child1=recursion1(temp_child1,firstCrossPoint,secondCrossPoint,parent1MiddleCross,parent2MiddleCross)
child2=recursion2(temp_child2,firstCrossPoint,secondCrossPoint,parent1MiddleCross,parent2MiddleCross)

print(child1)
print(child2)
  • 0
    Объяснение того, что делает код, полезно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню