我正在研究使用Python中的turtle模块生成的迷宫。 我可以通过代理通过5个动作与迷宫互动。 这些动作(方法)是{前进,后退,右,左,IsSuccess},其中4个动作,一个是检查我是否到达迷宫的终点线。
了解范围所需的一些信息。
1:我可以访问他所在的特工的当前位置(x,y)
2:座席始终面对相同的方向,例如,如果命令他向右走,他将沿适当的方向旋转90度并向前移动一组给定的像素,然后转向- 90度再次面对相同的方向。
3:如果使用一种移动方法时他与迷宫中的墙壁相撞,则移动将被撤消,并返回 False 。如果移动有效,则他将保持在新位置并返回 True 。
4:无需回溯即可获得完成的路径。
5:迷宫以圆形方式构建,玩家从中间开始,目的是摆脱圆形迷宫。检查玩家是否赢得游戏的参数是玩家离中心的距离。例如,玩家可能从一个圆形值50开始,在内外圆之间移动会给该值+25或-25。虽然目标是达到特定值,例如125。
现在,我从一些简单的递归搜索算法开始,但是无论如何进行调整,在迷宫中浏览x步后,都会卡住。这是我到目前为止的内容:
def escape():
if isSuccess():
return True
position = (math.floor(agent.pos()[0]),math.floor(agent.pos()[1])) #Gets current agent position
if position in visistedPositions:
print("Already visited here")
return False
visistedPositions.append(position) #Adds agents position to visited list
if(Right(agent)):
print("Moved right")
escape()
else:
print("Could not move Right")
if(Backward(agent)):
print("Moved Back")
escape()
else:
print("Could not move Back")
if(Left(agent)):
print("Moved Left")
escape()
else:
print("Could not move Left")
if(Forward(agent)):
print("Moved Forward")
escape()
else:
print("Could not move Forward")
return False
关于如何仅使用给定操作就可以完成此任务的任何建议?我已经研究和探索了不同的算法,例如BFS,DFS和A *,但是我看不到如何使这些算法适合这个问题。欢迎任何建议。
编辑:
为了更清楚地了解代理如何移动,我发布了Right()
和Backward()
方法的摘要。
def Right(agent):
global circle_level
if circle_level < SUCCESS_LEVEL:
#turtle.home()
p1 = Point(agent.pos()[0], agent.pos()[1])
agent.circle(circle_level,-22.5)
p2 = Point(agent.pos()[0], agent.pos()[1])
if isBlocked(Line(p1,p2)):
print('blocked')
agent.circle(circle_level,22.5)
return False
return True
def Backward(agent):
global circle_level
if circle_level > 50 and circle_level < SUCCESS_LEVEL:
circle_level -= 20
p1 = Point(agent.pos()[0], agent.pos()[1])
agent.right(90)
agent.backward(20)
agent.right(-90)
p2 = Point(agent.pos()[0], agent.pos()[1])
if isBlocked(Line(p1,p2)):
print('blocked')
circle_level += 20
agent.right(90)
agent.forward(20)
agent.right(-90)
return False
return True
答案 0 :(得分:0)
尽管这似乎是一种递归函数,但我会继续尝试。我看到的主要问题是您递归调用escape()
,但忽略其返回值。您怎么会知道递归成功了?
以下是我对您的代码的重做,以解决此问题:
def escape():
if isSuccess():
return True
position = (math.floor(agent.xcor()), math.floor(agent.ycor())) # Get current agent position
if position in visitedPositions:
print("Already visited here")
return False
visitedPositions.append(position) # Add agent's position to visited list
if Right(agent):
print("Moved right")
return escape()
print("Could not move Right")
if Backward(agent):
print("Moved Back")
return escape()
print("Could not move Back")
if Left(agent):
print("Moved Left")
return escape()
print("Could not move Left")
if Forward(agent):
print("Moved Forward")
return escape()
print("Could not move Forward")
return False
如果将visitedPositions
[拼写更改]设为set
而不是list
,可能会更有效率。