2011-05-01 83 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