2011-05-01 88 views
0

作为练习,作为一个更复杂,更大的项目的先驱,我记住,我已经使用Turtle模块创建了一个随机行走脚本。我意识到有更简单的方法来做随机游走而无需找到相邻的坐标,但据我所知,这对于较大的实现是必要的。随机行走问题(逃逸递归)

我遇到的问题是,当python发现它已经访问了getnext()函数中的每个相邻单元时,它正在达到其最大递归深度。我不确定我会如何逃脱那个循环,并且如果发生这种情况,将继续照常进行。

import turtle 
import random 




class cell(object): 
def __init__(self, pos, visited = False): 
    self.xCoord = pos[0] 
    self.yCoord = pos[1] 
    self.visited = visited 
    self.neigh = [] 
    self.neighbors = self.getneighbors() 

def getneighbors(self): 
    for j in (-1, 0, 1): 
     for i in (-1, 0, 1): 
      self.neigh.append((self.xCoord+i, self.yCoord+j)) 



def getnext(): 
    nextindex = random.randint(0, len(c.neigh)-1) 
    nextcoordt = c.neigh[nextindex] 
    nextcoord = list(c.neigh[nextindex]) 
    if nextcoordt in coords: 
     getnext() 
    else: 
     turtle.goto(nextcoord[0], nextcoord[1]) 



coords = {} 

turtle.setup(width =200, height = 200, startx = 0, starty = 0) 
turtle.trace = False 

for i in range(1000): 
    c = cell(list(turtle.pos())) 
    coords[turtle.pos()] = (c) 
    getnext() 

此外,这实际上是我的第一个真正的应用程序的OOP,我想知道这是否是一个很好的方式来使用它。

非常感谢!

回答

2

如果你的随机游走发现它已经访问了每个相邻的单元格,它将永远循环。由于您正在使用递归,它很快就会超过最大递归限制。

我确定这可以用OOP方式编写,但问题在于使用递归比使用cell类更有用。例如,我简化了代码以线性方式运行。更改如下:

  • 消除(0,0)方向,因为它没有进展。 (根据您的目标可选,即如果您认为“保持投入”有效举动)。使用random.choice()来挑选下一步的方向。
  • 删除递归,以便通过将方向向量添加到当前位置来计算下一个坐标。一个简单的循环就足够了。
  • 由于返回先前空间对随机性完全有效,因此不会检查下一个仓位与最近仓位历史的位置。

代码:

import itertools 
import random 
import turtle 

# change step size if you like 
STEP = 1 
PTS = [-STEP, 0, STEP] 
DIRS = [(x, y) for x in PTS for y in PTS if x or y] 

turtle.setup(width=400, height=400, startx=0, starty=0) 
turtle.trace = False 
pos = turtle.pos() 

for i in range(1000): 
    px, py = turtle.pos() 
    # direction of next move 
    xd, yd = random.choice(DIRS) 
    # set pos to current pos + direction vector 
    turtle.goto(px + xd, py + yd) 
+0

谢谢您的回答。我使用单元类的理由是,我正在尝试制作一个基本的绘图机器人,它会在图像文件中追踪一条可能弯曲的路径,该路径没有设定的宽度。例如在白色背景上的填充黑色圆圈。我的意图是获取每个当前坐标相邻者的颜色值,并根据颜色移动到给定坐标。因此,我认为可以很容易地创建一个具有颜色属性的类,当然我还没有添加它......我的方法是否远程正确/可行?哈哈 – danem 2011-05-01 03:23:50

+0

这听起来有点像[区域种植](https://secure.wikimedia.org/wikipedia/en/wiki/Region_growing),你可以在图像编辑软件中找到它。您选择一个初始种子像素,然后通过选择与您的种子颜色相同或相似的相邻像素(在某个阈值内)来增大选择范围。这通常是通过扫描所有相邻的像素来完成的,但我没有看到为什么你无法将颜色的权重合并到随机游走中。 – samplebias 2011-05-01 03:33:31

+0

当你说“但我看不出为什么你不能在你的随机游走中加入一些颜色的权重”时,你的意思是我写的还是你的版本?我打算最终这样做,但我希望首先获得基本的功能。我有困难抓住的概念是,如果我确实使用OOP,并且我有一个具有颜色属性的类,那么这意味着在每一步我需要声明5(或9,如果我包括对角线)对象?对于我认为可以通过程序完成的数据结构,我还不够精通。谢谢您的帮助。 – danem 2011-05-01 03:46:58