问题描述
我正在使用随机迷宫生成器,然后尝试对其实施 GA 以便它可以解决它,我确实得到了一个输出,但似乎每一代它都做得更糟或更好,但从未真正解决它,感觉就像我我错过了一些东西,想要一些指导!这是蟒蛇。
这是政策:
from random import shuffle,randrange
%pylab inline
import numpy
from pandas import *
def generaterandomPolicy(x,y):
policy=numpy.random.random((x,y,4))
for i in range(policy.shape[0]):
for j in range(policy.shape[1]):
policy[i][j]=policy[i][j]/policy[i][j].sum()
return policy
def mutatePolicy(policy,my=0.01):
newPolicy=policy
for i in range(newPolicy.shape[0]):
for j in range(newPolicy.shape[1]):
mustnormalize=False
for k in range(newPolicy.shape[2]):
if numpy.random.random()<my:
newPolicy[i][j][k]=numpy.random.random()
mustnormalize=True
if mustnormalize:
newPolicy[i][j]=newPolicy[i][j]/newPolicy[i][j].sum()
return newPolicy
mutatePolicy(generaterandomPolicy(1,1),my=0.1)
适应度函数(我认为这是我做错了)
def fitnessFunction(organism,target):
#target is the maze
actions=list()
while not maze.mazeSolved() and len(actions) < 5000:
action=numpy.random.choice([0,1,2,3],p=policy[maze.xPos][maze.yPos])
maze.moveAgent(action)
actions.append(action)
maze.resetAgent()
return 1.0/(1.0+len(actions))
在这里我们输入值并进行尝试
populationSize=10
mutationRate=0.01
generations=50
#generate population
population=list()
for n in range(populationSize):
population.append(generaterandomPolicy(17,17))
maxW=[]
meanW=[]
for generation in range(generations):
#evaluate fitness of each solution
W=[]
for organism in population:
W.append(fitnessFunction(organism,maze))
#selection for the next generation
Wmax=max(W)
nextPopulation=list()
best=population[W.index(Wmax)]
maxW.append(Wmax)
meanW.append(mean(W))
for n in range(populationSize):
who=numpy.random.randint(populationSize)
if n<2: #elite selection
who=W.index(Wmax)
else:
#selection function Roulette:
#while numpy.random.random()>W[who]/Wmax:
# who=numpy.random.randint(populationSize)
#selection function Tournament:
other=numpy.random.randint(populationSize)
if W[other]>W[who]:
who=other
#inheritance and mutation
nextPopulation.append(mutatePolicy(population[who],my=m)) #<-
#updating the old to the new poplution
population=nextPopulation
#housekeeping
#if (generation%100)==0:
print(generation,1.0/Wmax)
#visualizing results
plot(maxW,'r')
plot(meanW,'k')
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)