我目前正在尝试做一个遗传算法来匹配一个浮点数列表和另一个浮点数列表(我知道这有点“毫无意义”,因为我已经有了数据,但我只想在尝试解决更复杂的遗传算法问题之前有能力做到这一点)。我用Python编写了以下代码。在
from random import random
ofInterest = [
5.76260089714,
7.87666520017,
9.53163269149,
9.72801578613,
5.20002737716,
0.50133290228,
8.58820041647,
9.65056792475,
3.07043110493,
1.13232332178
]
print(ofInterest)
fits = []
for i in range(100):
fits.append([])
for j in range(10):
fits[i].append(random()*10)
fitness = []
for i in range(100):
fitness.append(100000000)
def makeFitnessList():
for i in range(100):
fitValue = 0
for j in range(10):
fitValue += (fits[i][j] - ofInterest[j])**2
fitness[i] = fitValue
topTenFitness = []
for i in range(10):
topTenFitness.append(10000000000000)
print(topTenFitness)
def sortByFitness():
makeFitnessList()
temp = []
count = 0
while len(temp) < 10:
k = 100000000000000000000000000
index = -1
for i in range(len(fitness)):
if k > fitness[i]:
k = fitness[i]
index = i
temp += [index]
topTenFitness[count] = fitness[index]
print(fitness[index])
fitness[index] = 1000000000000
count += 1
temp2 = fits
for i in range(10):
fits[i] = temp2[temp[i]]
#sortByFitness()
#print(fitness[0])
#print(fits[0])
def cross(rate):
for i in range(10,100):
parent1Place = int(random()*10.01)
if (i*random()) > rate:
parent2Place = int(random()*10.01)
crossPoint = int(random()*10.01)
for i in range(crossPoint):
tempOne = fits[parent1Place][i]
tempTwo = fits[parent2Place][i]
fits[parent1Place][i] = tempOne
fits[parent2Place][i] = tempTwo
else:
fits[i] = fits[parent1Place]
def mutate(rate):
for i in range(10,100):
for gene in range(10):
if random() < rate:
fits[i][gene] = random()*10
for i in range(10):
makeFitnessList()
sortByFitness()
print("")
cross(.6)
mutate(.4)
sortByFitness()
print(fits[0])
该计划运行,但对健康没有好处:
^{pr2}$
如果你能更容易地使用你的电脑,那就试试看吧:
以下是一些可能导致不良结果的因素:
你的突变率太高了。每个基因40%意味着每10个基因每个个体平均会有4个变化。实际上,你应该选择突变率,使每一代在整个群体中只引入很少的突变。
你的
cross
功能在选择的父母之间交换基因,而不是让父母保持不变,将父母双方的部分基因复制给新创造的孩子。如果你使一个基因突变,你就用一个新的独立随机变量来代替它。这是无效的,因为它使得算法运行的环境非常粗糙。如果只向原始值添加小的随机变量,例如在范围[-0.1,0.1]范围内,则可以获得更平滑的景观和更好的拟合效果。
与其为基因组选择一个交叉点,不如在双亲之间完全随机地选择基因,因为基因的顺序在你的模型中没有意义。
你等待的时间不够长,10代人不会带你走远。
据我所见,你没有正确地测量健身增益。你应该打印出人口的平均健康状况(可能是最好的健康状况或前10名的平均值)。
因为遗传算法很有趣。。。:)
请记住,这对遗传算法来说是一个很糟糕的问题,而且还有很多改进的余地(即一起摆脱精英主义)
相关问题 更多 >
编程相关推荐