我试图用python写一个简单的生成算法,应该给我提供“ Hello World”.它工作正常,但无法通过“最大迭代”常量给出核心答案.它只是在无限循环中工作.
这是我的代码如下:
import random
class GAHello():
POPULATION_SIZE = 1000
ELITE_RATE = 0.1
SURVIVE_RATE = 0.5
MUTATION_RATE = 0.2
TARGET = "Hello World!"
MAX_ITER = 1000
def InitializePopulation(self):
tsize: int = len(self.TARGET)
population = list()
for i in range(0,self.POPULATION_SIZE):
str = ''
for j in range(0,tsize):
str += chr(int(random.random() * 255))
citizen: Genome = Genome(str)
population.append(citizen)
return population
def Mutation(self,strng):
tsize: int = len(self.TARGET)
ipos: int = int(random.random() * tsize)
delta: chr = chr(int(random.random() * 255))
return strng[0: ipos] + delta + strng[ipos + 1:]
def mate(self,population):
esize: int = int(self.POPULATION_SIZE * self.ELITE_RATE)
tsize: int = len(self.TARGET)
children = self.select_elite(population,esize)
for i in range(esize,self.POPULATION_SIZE):
i1: int = int(random.random() * self.POPULATION_SIZE * self.SURVIVE_RATE)
i2: int = int(random.random() * self.POPULATION_SIZE * self.SURVIVE_RATE)
spos: int = int(random.random() * tsize)
strng: str = population[i1][0: spos] + population[i2][spos:]
if(random.random() < self.MUTATION_RATE):
strng = self.Mutation(strng)
child = Genome(strng)
children.append(child)
return children
def go(self):
popul = self.InitializePopulation()
for i in range(0,self.MAX_ITER):
popul.sort()
print("{} > {}".format(i,str(popul[0])))
if(popul[0].fitness == 0):
break
popul = self.mate(popul)
def select_elite(self,population,esize):
children = list()
for i in range(0,esize):
children.append(population[i])
return children
class Genome():
strng = ""
fitness = 0
def __init__(self,strng):
self.strng = strng
fitness = 0
for j in range(0,len(strng)):
fitness += abs(ord(self.strng[j]) - ord(GAHello.TARGET[j]))
self.fitness = fitness
def __lt__(self,other):
return self.fitness - other.fitness
def __str__(self):
return "{} {}".format(self.fitness,self.strng)
def __getitem__(self,item):
return self.strng[item]
谢谢你的建议.我真的是菜鸟,并且我只是训练和试验这样的算法和优化的东西来探索人工智能方法.
更新
运行的地方
if __name__ == '__main__':
algo = GAHello()
algo.go()
我的输出:
0 > 1122 ü<p?s?á×oR??
1 > 1015 ÷z??5Aà??
2 > 989 "?t?Zi±Pmê
3 > 1076 - ?áíAà??
4 > 1039 #?t?R?′ìos?
5 > 946 ×ZíG¤'òù?
6 > 774 $àPé
7 > 1194 A??§?
Y? D
8 > 479 @r=q^ü′{J
9 > 778 X'YtH_???
10 > 642 z?$oKD{
...
172 > 1330 ê?E??à??£ü
173 > 1085 ?O???e·à×?òU
174 > 761 O???¤ˉ£+}
175 > 903 P??-′??m|4?
176 > 736 àPSèe<1
177 > 1130 aê/*?¤??1?^
178 > 772 ODS8′°jó£
...
990 > 1017 6ó¨Q???¨úí
991 > 1006 |5?DR·ü??í
992 > 968 ×5Qí??1V í
993 > 747 B?a?*?R·ü$F
994 > 607 ?`aLa?VLo
995 > 744 ìx7e?i;?Y[
996 > 957 18/?^ ¤
997 > 916 ú'dúy8}?? [
998 > 892 ?WòeTùv-6??
999 > 916 ?g8g?}à3à
样本输出应该是:
0 > 419 Un~?z^Kr??p┬
1 > 262 Un~?z^Kr?j??
2 > 262 Un~?z^Kr?j??
…
15 > 46 Afpdm'Ynosa"
16 > 46 Afpdm'Ynosa"
17 > 42 Afpdm'Ynoia"
18 > 27 Jfpmm↓Vopoa"
…
33 > 9 Ielmo▼Wnole"
34 > 8 Ielmo▲Vopld"
35 > 8 Ielmo▲Vopld"
…
50 > 1 Hello World"
51 > 1 Hello World"
52 > 0 Hello World!
我相信,您的列表排序是您的主要问题.
popul.sort()
尝试
popul.sort(key = lambda x:x.fitness)
这将按照他们的健康水平对他们进行排序,这就是我认为您想要的.
我也将所有int(random.random()* 255)更改为random.randint(30,125)以仅获取有效字符,因为我在运行时遇到了麻烦.