В чем разница между следующими двумя циклами while? - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь реализовать следующий код.Я попробовал 2 подхода (2 цикла).которые идентичны, по крайней мере для меня.но одно из решений, т. е. подход 2, сходящийся к решению.пока подхода 1 нет.Можете ли вы помочь мне выяснить, в чем разница между двумя подходами.Примечание: я использовал loopIndex только для того, чтобы отслеживать, в каком цикле выполняется выполнение.Я пытаюсь завершить цикл, если слишком долго.спасибо.

# this program tries to guess the target string
# using genetic algorithm.

import random
genList = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"
target = "Hello"

# generates a random string under provided length
def generateGuess(_length):
    gene = []
    for i in range(_length) :
        gene.append(random.choice(genList))
    return "".join(gene)

# gets the total no of letters matched from string provided, to target string
def getFitness(gene):
    return sum(1 for geneVar, targetVar in zip(gene, target) if geneVar == targetVar)

# changes 1 letter of the string provided, at a random position.
def mutate (gene):
    newGene, alternate = random.sample(genList, 2)
    gene = list(gene)
    index = random.randint(0, len(gene) - 1)
    gene[index] = alternate if gene[index] == newGene else newGene
    return "".join(gene)

# to display the string provided with its fitness calculated.
def display(gene):
    print("Gene : {0}, Fitness : {1}".format(gene, getFitness(gene)))


# Approach 1 -------------------------------------
child = generateGuess(len(target))
bestFitness = 0
loopIndex = 0

while True :  
    loopIndex = loopIndex + 1
    child = mutate(child)
    if loopIndex > 16800 :
        break
    childFitness = getFitness(child)
    display(child)
    print(loopIndex)
    if childFitness > bestFitness :
        bestFitness = childFitness
    if childFitness >= len(target):
        break

# Approach 2 -------------------------------------
bestParent = generateGuess(len(target))
bestFitness = getFitness(bestParent)
display(bestParent)
loopIndex = 0 

while True:
    loopIndex = loopIndex + 1
    child = mutate(bestParent)
    childFitness = getFitness(child)
    display(child)
    print(loopIndex)
    if bestFitness > childFitness:
        continue
    if childFitness >= len(bestParent):
        break
    bestFitness = childFitness
    bestParent = child

1 Ответ

0 голосов
/ 19 сентября 2018

Разница заключается в следующем:

  • При первом подходе вы всегда заменяете текущий ген, даже если его пригодность хуже (вы всегда устанавливаете child=mutate(child)).
  • Во втором подходе вы продолжаете мутировать один и тот же базовый ген снова и снова (не заменяя его), пока не улучшите приспособленность, и только тогда вы замените его натолько что полученный улучшенный ген (вы устанавливаете bestParent=child только когда улучшается физическая форма).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...