这是遗传算法吗?

Is this a genetic algorithm?

我正在尝试制作一种遗传算法来查找控制台输入中给出的单词。但是我不知道我是否成功地做了一个完整的遗传算法。 这是代码:

main.py:

from population import Population

target = input()
maxPop = 10
mutation = 100

print("\n\n\n")

pop = Population(target, maxPop, mutation)

population.py:

import random
from ADN import genetic

class Population:
    def __init__(self, target, maxPop, mut):
        adn = genetic()
        self.popul = []
        i = 0
        while i < maxPop:
            self.popul.append(adn.genFirst(len(target)))
            print(self.popul[i])
            i+=1

        #oldPop = self.popul
        #adn.fitness(oldPop, target)
        #"""
        while target not in self.popul:
            oldPop = self.popul
            self.popul = adn.fitness(oldPop, target)
            if target in self.popul:
                return
        #"""

ADN.py:

import random

class genetic:
    def genFirst(self, length):
        bestGenes = ""
        self.letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890[],. "
        word = ""
        i = 0
        while i < length:
            word += random.choice(self.letters)
            i+=1
        return word

    def fitness(self, oldPop, target):
        newPop = []

        j = 0
        for word in oldPop:
            newW = ""
            for letter in word:
                if(letter not in target):
                    letter = random.choice(self.letters)
                else:
                    if(target.index(letter) != word.index(letter)):
                        letter = random.choice(self.letters)
                newW += letter
            newPop.append(newW)

        print(newPop)
        return newPop

如果不是全遗传算法,还缺什么?

不,这不是遗传算法。它甚至不是进化算法。它错过了适应度函数,该函数应该计算计算中每个成员的好坏程度。之后,您应该决定要编写哪种代码:遗传的还是进化的。作为初学者你应该尝试进化算法,它更容易并且它不包含交叉功能(这对初学者来说很难)。 试试这个:

import random

genes = "abcdefghijklmnopqrsttuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-[]()1234567890;<>?/ "
target = input()

def genPar(length):
    parent = []
    for i in range(length):
        parent.append(random.choice(genes))

    return "".join(parent)

def fitness(parent):
    total = 0
    for i in range(len(parent)):
        if(parent[i] == target[i]):
            total += 1
    return total

def mutate(parent):
    index  = random.choice(range(len(parent)))
    child = []

    for i in range(len(parent)):
        if(i == index):
            letter = random.choice(genes)
        else:
            letter = parent[i]
        child.append(letter)

    return "".join(child)

parent = genPar(len(target))
bestPar = parent
bestFitness = fitness(parent)

print(parent)

generations = 1

while True:
    child = mutate(bestPar)
    childFit = fitness(child)

    if(childFit > bestFitness):
        bestFitness = childFit
        bestPar = child

    print(child)
    generations += 1

    if(child == target):
        break

print("\nGenerations: " + str(generations))

直到你看到初始化 -> 适合度 -> 遗传算子(变异,交叉) -> 适合度 -> 替换循环你不能说它是 Genetic/Evolutionary 算法 :)...

对于基本的遗传算法,需要用到一些算子选择、适应度、变异、交叉等。 您可以根据您的问题使用不同类型的选择、交叉和变异。 一个交叉和变异的简单例子。

def single_point_crossover(parent1,parent2):
        crossover_point = random.randint(1,9)
        #print("crossover point", crossover_point)
        child_1 = np.hstack((parent1[0:crossover_point], parent2[crossover_point:]))
        child_2 = np.hstack((parent2[:crossover_point],parent1[crossover_point:]))
        return child_1,child_2 


def mutation(parent1,parent2):
    n = len(parent1)
    pos_1 = random.randint(0,n-1)
    pos_2 = random.randint(0,n-1)
    #print(pos_1, pos_2)
    def swap(sol, posA, posB):
        result = sol.copy()
        elA = sol[posA]
        elB = sol[posB]
        result[posA] = elB
        result[posB] = elA
        return result
    child1 = swap(parent1, pos_1, pos_2)
    child2 = swap(parent2, pos_1, pos_2)
    return child1,child2