Индекс строки Python вне диапазона ошибок и лучшие способы реализации спаривания и воспроизведения в генетическом программировании - PullRequest
0 голосов
/ 29 мая 2018

Недавно я посмотрел на 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 и я открыт для любых мнений о том, как улучшить мой код.Спасибо за чтение!

1 Ответ

0 голосов
/ 29 мая 2018
child1 = tempxstr[0:10]+tempystr[14:20]+tempxstr[21:26]
child2 = tempystr[0:10]+tempxstr[14:20]+tempystr[21:26]

Мне это не подходит.Каждая из этих строк будет иметь длину 21. Но внутри fitnessCheck вы сравниваете их с STRING_NAME, который имеет длину 27. Поэтому, как только x достигнет 21 внутри fitnessCheck, вы получитеIndexError.

Вы должны изменить способ создания child1 и child2, чтобы они имели ту же длину, что и STRING_NAME.

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