Генетический алгоритм на python 3.7
Вот код:
"""
Simple experement with Genetic Algorithms
Hello world via bunch of evolving strings.
theory http://en.wikipedia.org/wiki/Genetic_algorithm
"""
import sys
import time
import string
import random
import logging
from optparse import OptionParser
__version__ = "1.0"
logger = logging.getLogger('helloworld')
# form genetic codes
GENES = "".join(map(lambda x, y: x + y, string.ascii_uppercase, string.ascii_lowercase)) + \
string.punctuation + " "
# goal string C.O.
GOAL = "Hello world! Genetic Algorithm ver."
def fitness(dnk, goal):
f = 0
for index, gene in enumerate(dnk):
if gene != goal[index]:
f -= 1
return f
def sample_wr(population, k):
"Chooses k random elements (with replacement) from a population"
n = len(population)
_random, _int = random.random, int # speed hack
result = [None] * k
for i in xrange(k):
j = _int(_random() * n)
result[i] = population[j]
return result
class GeneticCode:
def __init__(self, dnk="", goal=GOAL):
if dnk == "":
self.dnk = "".join(sample_wr(GENES, len(goal)))
else:
self.dnk = dnk
self.goal = goal
def get(self):
return self.dnk
def fitness(self):
return fitness(self.dnk, self.goal)
def mutate(self, turns=5):
"""
mutate dnk sequence "on place"
turns - how much elements will be changed
"""
_dnk = list(self.dnk)
for item in range(turns):
rnd_elem_index = random.randint(0, len(_dnk) - 1)
if _dnk[rnd_elem_index] == self.goal[rnd_elem_index]:
pass
else:
_dnk[rnd_elem_index] = random.choice(GENES)
self.dnk = "".join(_dnk)
def replicate(self, another_dnk):
"""
breed 2 dnk sequences
cut one, cut two and mix it together
return offspring dnk string
"""
part = random.randint(0, len(self.dnk) - 1)
return "".join(self.dnk[0:part] + another_dnk.get()[part:])
class GenePool():
pool_size = 100
def __init__(self, goal=GOAL):
self.pool = [GeneticCode(goal=goal) for item in range(self.pool_size)]
self.goal = goal
def _print(self):
for item in self.pool:
print
item.get() + " - " + str(item.fitness())
def get_random(self):
"Get random element from pool"
return self.pool[random.randint(0, len(self.pool) - 1)]
def darvin(self, winners=0.1):
"""
choose only good dnk sequences
winners - part of population to breed
"""
all_fitness = [(item.fitness(), item) for item in self.pool]
new_pool = [item[1] for item in
sorted(all_fitness, key=lambda x: x[0], reverse=True)]
self.pool = new_pool[:int(round(self.pool_size * winners))]
while len(self.pool) < self.pool_size:
new_life = self.get_random().replicate(self.get_random())
new_gc = GeneticCode(dnk=new_life, goal=self.goal)
self.pool.append(new_gc)
def evolution(self, turns=1000):
"""Evalute pool"""
iterations = 0
while (iterations < turns) and (self.pool[0].get() != self.goal):
for index, item in enumerate(self.pool):
self.pool[index].mutate()
self.darvin()
logger.info(self.pool[0].get())
time.sleep(0.1)
iterations += 1
return iterations
def main():
usage = '%s [options] [text]' % sys.argv[0]
parser = OptionParser(usage)
parser.add_option('-l', '--log', default='-',
help='redirect logs to file')
opts, args = parser.parse_args()
if opts.log == '-':
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
else:
logging.basicConfig(filename="helloworld.log", level=logging.INFO)
if args:
text = args[0]
else:
text = GOAL
gp = GenePool(goal=text)
# gp._print()
steps = gp.evolution()
logger.info("Steps: %d" % steps)
start_time = time.time()
main()
print("Estimatied time:\t%s" % (time.time() - start_time))
выдаёт ошибку:
Traceback (most recent call last):
File "C:/Users/kiber/Desktop/animated-bg/aaa.py", line 151, in <module>
main()
File "C:/Users/kiber/Desktop/animated-bg/aaa.py", line 144, in main
gp = GenePool(goal=text)
File "C:/Users/kiber/Desktop/animated-bg/aaa.py", line 86, in __init__
self.pool = [GeneticCode(goal=goal) for item in range(self.pool_size)]
File "C:/Users/kiber/Desktop/animated-bg/aaa.py", line 86, in <listcomp>
self.pool = [GeneticCode(goal=goal) for item in range(self.pool_size)]
File "C:/Users/kiber/Desktop/animated-bg/aaa.py", line 47, in __init__
self.dnk = "".join(sample_wr(GENES, len(goal)))
File "C:/Users/kiber/Desktop/animated-bg/aaa.py", line 38, in sample_wr
for i in xrange(k):
NameError: name 'xrange' is not defined
Я так понял что он не знает такого имени 'xrange' (или он просто думает что это имя, а это на самом деле атрибут). Как решить такую проблему?
Ответы (1 шт):
Автор решения: Александр
→ Ссылка
В Python в 3 версии функция range() ведет себя как xrange() во второй версии питона, а функция xrange() убрана вовсе.