我正在使用遗传算法来解决迷宫,但它似乎不起作用,想知道是否有人可以指出我所做的错误python

问题描述

我正在使用随机迷宫生成器,然后尝试对其实施 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 (将#修改为@)