首页 > 解决方案 > 我正在使用遗传算法来解决迷宫,但它似乎不起作用,并且想知道是否有人可以指出我所做的错误(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')

标签: pythonalgorithmgenetic-algorithmmaze

解决方案


推荐阅读