这是遗传算法吗?

时间:2017-08-22 21:10:37

标签: python python-3.x genetic-algorithm genetic-programming

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

main.py:

--from-app

population.py:

from population import Population

target = input()
maxPop = 10
mutation = 100

print("\n\n\n")

pop = Population(target, maxPop, mutation)

ADN.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
        #"""

如果它不是一个完整的遗传算法,那么缺少什么?

3 个答案:

答案 0 :(得分:2)

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

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))

答案 1 :(得分:0)

直到你看到初始化 - &gt;健身 - &gt;遗传算子(突变,交叉) - &gt;健身 - &gt;替换周期你不能说它是遗传/进化算法:))

答案 2 :(得分:0)

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

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