Python 字符串索引超出范围错误以及在遗传编程中实现交配和繁殖的更好方法

Python string index out of range error and better ways to implement mating and reproduction in genetic programming

我最近在 Youtube 上看到一个关于遗传算法的视频,觉得很有趣,决定试一试。我是编程新手,除 Python 外没有任何其他语言的经验,认为 C# 似乎是遗传算法中使用最广泛的语言,太难了,决定在 Python。我目前因为一个错误而卡住了,我不太明白代码有什么问题。

这是代码:

import random

#Wanted String
STRING_NAME = "this is a genetic algorithm"
LENG = len(STRING_NAME)
#Used Characters
VALID_CHARACTERS = "abcdefghijklmopqrstuvwxyz "
#Generation Size
POPULATION_SIZE = 200
#List of String Objects
POPULATION = []
closest = 100
choiceList = []


#Generating random strings
def randomStringGeneration(size=len(STRING_NAME)):
    return ''.join(random.choice(VALID_CHARACTERS) for _ in range(size))

#string object
class ranString:

    def __init__(self,manualstr=""):
        if manualstr == "":
            self.string = randomStringGeneration()
        else:
            self.string = manualstr
        self.fitness = fitnessCheck(self)

#fitness checking
def fitnessCheck(String):
        result = 0;
        for x in range(0,LENG-1):
            if (String.string[x] == STRING_NAME[x]):
                result += 1
        return result

#order population list by fitness decrementaly
def sortByFitness(Obj):
    Obj.sort(key=lambda x: x.fitness, reverse=True)

#mating two strings
def mate(x,y):
    tempxstr = x.string
    tempystr = y.string
    child1 = tempxstr[0:10]+tempystr[14:20]+tempxstr[21:26]
    child2 = tempystr[0:10]+tempxstr[14:20]+tempystr[21:26]
    ranchild1 = ranString(manualstr = child1)
    ranchild2 = ranString(manualstr = child2)
    POPULATION.append(child1,child2)

#main function
def generatePopulation(num):
    generation = 1
    for x in range(num):
        if (generation == 1):
            for x in range(POPULATION_SIZE):
                f = ranString()
                POPULATION.append(f)
            sortByFitness(POPULATION)
            for x in POPULATION:
                print(x.string + "    " + str(x.fitness))
            generation +=1
        else:
            sortByFitness(POPULATION)
            del POPULATION[100:]
            for x in POPULATION:
                for j in range(x.fitness):
                    choiceList.append(x)
            for j in range(100):
                x = random.choice(choiceList)
                y = random.choice(choiceList)
                mate(x,y)

            print("\n\n\n\nGeneration"+generation)
            for x in POPULATION:
                print(x.string + "    " + str(x.fitness))
            generation += 1

generatePopulation(10)

这是日志(你称这些日志文件吗?)文件错误:

egf ukcob uf oyhtuikmdritiz    4
ouaelyf ef wufsjh aqkcyacef    3
rbuwptsdjmwskfzyccsfgzlwdyo    3
fqyg zhhhswesdfetqjy ohrpyj    3
qfirzajzhafdv dicmueavdrguv    3
pxqsxtehe bckbvadapezgrqdkb    3
zvosvvsspgbpmxhadwxkfzkqjhi    3
tfsofiurlpyakhhwqqexoafhtxi    3
qkmslihwskukcecldykkp caiqo    3
fhfh ctluzbr vty skgozgqclg    3
dglsfwimwqfxdhdzx lkcvrraev    3
jbuwaoxua uteissqfpxodciaoa    3
if qpvpcsixe kagmxyludcicwl    3
vspwdxwqkewcaethcs g dxcxao    3
 d jpylld gzuojvccuh gzjxbs    3
pvzsjkxtzrjgjegimalvcaxjbjw    3
zolqfli sdahohjiryerabkvmme    2
ufslbdexaa wrfuscfbkfdulzfr    2
             *
             *  (middle part omitted because it would be too long)
             *
 jcjigwzhyxwwyikfoiyrtolclg    0
srjqfxjbuppfd drlrkjkuqegvb    0
zbsbkedazmxyghrmhzdzjytcqza    0
xqxmtxrkhctqayrmkvefkpy zad    0
waxpeefkvqjjwvylre jfvedyfa    0
udyetsjd lmhuzamrwt rip dqv    0

Traceback (most recent call last):
  File "/Users/Johnwon/Desktop/Genetic String.py", line 80, in <module>
    generatePopulation(10)
  File "/Users/Johnwon/Desktop/Genetic String.py", line 73, in generatePopulation
    mate(x,y)
  File "/Users/Johnwon/Desktop/Genetic String.py", line 48, in mate
    ranchild1 = ranString(manualstr = child1)
  File "/Users/Johnwon/Desktop/Genetic String.py", line 28, in __init__
    self.fitness = fitnessCheck(self)
  File "/Users/Johnwon/Desktop/Genetic String.py", line 34, in fitnessCheck
    if (String.string[x] == STRING_NAME[x]):
IndexError: string index out of range

我在互联网上搜索了out of index错误,似乎是我增加了太多或搜索了一个不存在的索引,但我找不到错误的原因。我的代码有什么问题?

此外,目前我的 mate() 函数的工作原理是将字符串添加到一个单独的列表中,乘以它们的适应度,然后随机选择其中的 2 个并交换它们的三分之一 'genes' 并弹出 2 个婴儿。这是我能想到的让更健康的对象有更高交配机会的唯一方法,但随着世代相传和健康水平的提高,这似乎没有得到优化。执行此操作并实施突变的好方法是什么?

我是 Python 的初学者,我乐于接受任何关于如何改进我的代码的意见。感谢阅读!

child1 = tempxstr[0:10]+tempystr[14:20]+tempxstr[21:26]
child2 = tempystr[0:10]+tempxstr[14:20]+tempystr[21:26]

我觉得这不对。这些字符串的长度均为 21。但是在 fitnessCheck 中,您将它们与长度为 27 的 STRING_NAME 进行比较。因此,一旦 x 在 [=11] 中达到 21 =], 你会得到一个 IndexError.

您应该更改创建 child1child2 的方式,使它们的长度与 STRING_NAME 相同。