Недавно я посмотрел на 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
Я искал в Интернете ошибку вне индекса, и кажется, что я увеличил слишком много или искал индекс, который несуществует, но я не могу найти причину ошибки.Что не так с моим кодом?
Кроме того, в настоящее время моя функция mate () работает, добавляя строки в отдельный список, умноженный на их пригодность, затем случайным образом выбирая 2 из них и обменивая треть их «генов» ивыскакивают 2 детей.Это единственный способ, который я мог придумать, чтобы дать более подходящим объектам более высокий шанс для спаривания, но это кажется ужасно неоптимизированным, поскольку поколения идут, и уровни пригодности растут.Что может быть хорошим способом сделать это и реализовать мутацию?
Я новичок в Python и я открыт для любых мнений о том, как улучшить мой код.Спасибо за чтение!