python - 我正在使用遗传算法来解决迷宫,但它似乎不起作用,并且想知道是否有人可以指出我所做的错误(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')
解决方案
推荐阅读
- sql - Maximo/Oracle SQL 语句从连接表中返回不需要的数据
- c++ - 模板化函数静态成员
- python - 如何为 python 列表的特定部分添加价值?
- google-data-studio - Google 数据洞察 - 用户特定仪表板
- bash - 将 gradle 命令结果保存到 Gitlab CI/CD 中的变量中
- postgresql - 我需要使用 Sequelize 进行查询以检查 2 个不同的 user_id 是否具有相同的 conversation_id
- reactjs - 为什么 react-router 更改 URL 而不是页面内容?
- android - 使用查询进行分页的更好方法(Firebase/Java)
- python - 使用 ascii 从列表中用 Python 编写 CSV 文件
- python - find_element_by_xpath() 仅通过从 Safari 复制粘贴 Xpath 给我语法错误