【问题标题】:Is this a genetic algorithm?这是遗传算法吗?
【发布时间】:2018-01-31 07:04:57
【问题描述】:

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

main.py:

from population import Population

target = input()
maxPop = 10
mutation = 100

print("\n\n\n")

pop = Population(target, maxPop, mutation)

人口.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

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

【问题讨论】:

  • 遗传算法没有严格的“模板”,因此不清楚“完整”与非“完整”的区别在哪里。
  • 既然你似乎同时缺少变异算子和交叉算子,为什么你认为它有资格作为遗传算法?看来这是一个不错的开始
  • 当正确的字母被传输到下一代时,我认为交叉已经完成
  • cmets 必须足够有用。太宽泛,无法回答。
  • 即使您有一个称为“适应度”的函数,但实际上并没有文献中通常理解的适应度函数。即使作为@EugeneSh。正确地指出,对于什么算作遗传算法没有官方标准,将您的代码称为遗传算法将是一个延伸。 “它缺少什么?”这个问题的答案。是“几乎所有东西”(适应度函数、选择算子、变异算子和交叉算子)。见:en.wikipedia.org/wiki/Genetic_algorithm

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2017-10-30
        • 2011-01-11
        • 2020-11-16
        • 2012-07-07
        • 2011-07-22
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多