2011-03-31 71 views
3

我有一些我決定在Python中執行的項目。簡而言之:我有清單列表。他們每個人都有名單,有時候是單一的,有時候更多。它看起來像這樣:python中的深度優先算法不起作用

rules=[ 
[[1],[2],[3,4,5],[4],[5],[7]] 
[[1],[8],[3,7,8],[3],[45],[12]] 
[[31],[12],[43,24,57],[47],[2],[43]] 
] 

的要點是從numpy的數組的值從該規則(規則表的元素)比較值。我們將一些[x] [y]點與第一個元素(例如第一個元素中的1)進行比較,然後,如果它爲true,則從列表中的第二個數組開始計算[x-1] [j],依此類推。要改變[x] [y]點的值,必須進行五次第一次比較。我已經寫了某事像這樣(主要功能是SimulateLoop,順序切換,因爲simulate2函數後,第二個寫):

def simulate2(self, i, j, w, rule): 
     data = Data(rule) 
     if w.world[i][j] in data.c: 
      if w.world[i-1][j] in data.n: 
       if w.world[i][j+1] in data.e: 
        if w.world[i+1][j] in data.s: 
         if w.world[i][j-1] in data.w: 
          w.world[i][j] = data.cc[0] 
         else: return 
        else: return 
       else: return 
      else: return 
     else: return 




def SimulateLoop(self,w): 
    for z in range(w.steps): 
      for i in range(2,w.x-1): 
       for j in range(2,w.y-1): 
        for rule in w.rules: 
         self.simulate2(i,j,w,rule) 

數據類:

class Data: 
    def __init__(self, rule): 
     self.c = rule[0] 
     self.n = rule[1] 
     self.e = rule[2] 
     self.s = rule[3] 
     self.w = rule[4] 
     self.cc = rule[5] 

NumPy的陣列是從世界一個對象類。規則列表如上所述,通過從另一個程序(GPL許可證)獲得的功能進行解析。

說實話,它似乎工作正常,但它沒有。我正在嘗試其他可能性,沒有運氣。它正在工作,解釋器不會返回任何錯誤,但不知何故數值更改錯誤。規則是好的,因爲它是由我從中獲得解析器的程序提供的(GPL許可證)。

也許它會有所幫助 - 它是Perrier的Loop,修改了Langton的循環(人造生命)。

非常感謝您的幫助! )

+0

如果你從一個實例提供的數據可能有幫助'World'這哪裏失敗。我在這裏看到的唯一看起來稍微不合適的是'i'和'j',從2開始而不是1. – 2011-03-31 22:40:41

+0

此外,所有'else:return'行都是不必要的,只需放入一個'return'語句在最外面的「if」之外,它會做同樣的事情。 – 2011-03-31 22:42:06

+0

不幸的是陣列是大的(至少50x50)。它由0到64的一些數字填充,形成適當的構形以創建迴路形狀。算法用於測試陣列中'像素'的4個鄰居。基於此,狀態由規則中的第6個值改變。但是,當然,首先5個值必須相等(狀態我們想改變,4個鄰居)爲規則(1-5)中的值。 它從2開始,而不是1或0,因爲我不想更改前兩列和2行。循環從第3行和第3列開始。 Thx諮詢與回報,我會做到這一點。 – 2011-03-31 23:39:29

回答

0

我對Perrier的Loop並不熟悉,但是如果你編寫了像着名的「遊戲生活」這樣的代碼,你會犯一個簡單的錯誤:將下一代存儲在同一個數組中,從而破壞它。

通常你的下一代存儲在臨時數組並在此草圖後掃做複製/交換,如:

def do_step_in_game_life(world): 
    next_gen = zeros(world.shape) # <<< Tmp array here 
    Nx, Ny = world.shape 
    for i in range(1, Nx-1): 
     for j in range(1, Ny-1): 
      neighbours = sum(world[i-1:i+2, j-1:j+2]) - world[i,j] 
      if neighbours < 3: 
       next_gen[i,j] = 0 
      elif ... 
    world[:,:] = next_gen[:,:]  # <<< Saving computed next generation 
+0

感謝您的迴應!我設法做到了這一點(這是前一段時間了)。我已經開始在每一步的開始清除整個數組,並且它工作正常。另一件事是速度,但這是未來一段時間。 – 2011-08-18 08:57:40