2013-04-09 32 views
0

这是我在python(相当新的)创建的代码。For循环不工作,因为它应该在模拟

我试图做一个生物膜的模拟,但在我把它实现实际算法(增长的数学公式)和图形部分我希望我的代码以期望的方式运行之前。我正在面对生成部分中for循环的问题。

我面临的问题是,从第1代到第2代(按照印刷产出)的增长速度远远超过它应该增加。增长只应该到相邻的行,但在一个步骤中它变得很多。

有一个矩阵,我们称之为生成函数。假设在循环的开始有5个节点。现在,当我们在第一个节点上运行generate时,让我们说1个节点被添加。现在循环不应该在这一代的这个新添加的节点上运行生成。但它确实会导致指数增长。

请帮我找出这里的问题。

的代码(在Python版本2.7.4):

import math 
from random import choice 
from copy import deepcopy 

width=20 
height=20 

def checksuround(self,i,j): 
    memory=0 
    if(i+1<width and j+1<height and j-1>=0 and i-1>=0): 
     for m in range(-1,2): 
      for n in range(-1,2): 
       if(self[i+m][j+n]==0): 
        memory=1 
     if memory==1: 
      return 1 
     else: 
      return 0 

#comment 
def add(matrix,m,n,sites): 
    count=0 
    if(m+1<width and n+1<height and n-1>=0 and m-1>=0): 
     for q in range(-1,2): 
      for w in range(-1,2): 
       if(matrix[m+q][n+w]==0 and count<sites): 
        matrix[m+q][n+w]='.' 
        count=count+1 


def generate(substrate,self,i,j): 
    if(i+1<width and j+1<height and j-1>=0 and i-1>=0): 
     if(substrate[i][j]==1): 
      pick=[2,3,4,5,6] 
      add(self,i,j,choice(pick)) 
     else: 
      add(self,i,j,1) 

print "-----------------------------------------------" 
print "Basic floor for growth" 
grid=[] 
for x in range(width): 
    grid.append([]) 
    for y in range(height): 
     grid[x].append(0) 

for x in range(width): 
    print 
    for y in range(height): 
     print grid[x][y], 


print "-----------------------------------------------" 
print "Substrate matrix (1 represents sites with favorable growth conditions)" 
arr=[0,1,2,3,4,5,6,7] 
substrate=[] 
for x in range(width): 
    substrate.append([]) 
    for y in range(height): 
     substrate[x].append(choice(arr)) 

for x in range(width): 
    print 
    for y in range(height): 
     print substrate[x][y], 

print "-----------------------------------------------" 

for x in range(10,12): 
    for y in range(10,12): 
     grid[x][y]='.' 


for x in range(width): 
    print 
    for y in range(height): 
     print grid[x][y], 


print "-----------------------------------------------" 
generation=5 
undergrid=deepcopy(grid) 
flag=0 

for g in range(generation): 
    print "generation : ",g 
    for x in range(width): 
     for y in range(height): 
      flag=checksuround(grid,x,y) 
      if (grid[x][y]!=0 and flag==1): 
       generate(substrate,undergrid,x,y) 
    for x in range(width): 
     print 
     for y in range(height): 
      print undergrid[x][y], 
    grid=undergrid 
    print 
    print "----------------------------------------------" 

一个输出是这样的:(如果输出未对齐,请复制粘贴上面的代码并运行它,它应该工作的罚款)

generation : 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 . . 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 . . . . 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 . . 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

---------------------------------------------- 

generation : 1 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 . . 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 . . . . . . 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 . . . . . 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 . . . . 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

---------------------------------------------- 

generation : 2 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 . . 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . 0 0 0 0 0 
0 0 0 0 0 0 0 0 . . . . . . . 0 0 0 0 0 
0 0 0 0 0 0 0 0 . . . . . . . 0 0 0 0 0 
0 0 0 0 0 0 0 0 . . . . . . . . 0 0 0 0 
0 0 0 0 0 0 0 0 . . . . . . . . . 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . . . 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . . . 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . . . 0 0 0 
0 0 0 0 0 0 . . . . . . . . . . . 0 0 0 
0 0 0 0 0 0 . . . . . . . . . . . 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . . 0 0 0 0 
0 0 0 0 0 0 0 . . . . . 0 0 0 0 0 0 0 0 

---------------------------------------------- 

generation : 3 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 . . 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 . . . . . . . . . . 0 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . . 0 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . . 0 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . . . 0 0 0 
0 0 0 0 0 0 0 . . . . . . . . . . . . 0 
0 0 0 0 0 0 . . . . . . . . . . . . . 0 
0 0 0 0 0 . . . . . . . . . . . . . . 0 
0 0 0 0 0 . . . . . . . . . . . . . . 0 
0 0 0 0 0 . . . . . . . . . . . . . . 0 
0 0 0 0 0 . . . . . . . . . . . . . . . 
0 0 0 0 0 . . . . . . . . . . . . . . . 
0 0 0 0 0 0 . . . . . . . . . . . . . 0 
0 0 0 0 0 0 . . . . . . . . . . . . . 0 

---------------------------------------------- 

generation : 4 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 . . . . 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 . . . . . . . . . . . . 0 0 0 
0 0 0 0 0 . . . . . . . . . . . . 0 0 0 
0 0 0 0 0 0 . . . . . . . . . . . 0 0 0 
0 0 0 0 0 0 . . . . . . . . . . . . 0 0 
0 0 0 0 0 . . . . . . . . . . . . . . . 
0 0 0 0 0 . . . . . . . . . . . . . . . 
0 0 0 0 . . . . . . . . . . . . . . . . 
0 0 0 0 . . . . . . . . . . . . . . . . 
0 0 0 0 . . . . . . . . . . . . . . . . 
0 0 0 0 . . . . . . . . . . . . . . . . 
0 0 0 0 . . . . . . . . . . . . . . . . 
0 0 0 0 . . . . . . . . . . . . . . . . 
0 0 0 0 0 . . . . . . . . . . . . . . . 
0 0 0 0 0 . . . . . . . . . . . . . . . 

---------------------------------------------- 
+0

谢谢你保佑! :D – DK5 2013-04-09 11:44:17

+0

为什么你在'def cheururound(self,i,j)中有'self':'?你是否在课堂上复制它? – 2013-04-09 11:45:27

+0

@ user2246845随时欢迎您,欢迎来到StackOverflow :) – 2013-04-09 11:46:16

回答

2

在你的主循环,你用 grid = undergrid,这是一个浅拷贝。从这一点开始(即在以下迭代中)gridundergrid都是相同的python列表。代替 尝试grid = deepcopy(undergrid)

+0

啊哈!错误在于,我搜索并找到了一个类似的解决方案,因此在循环之前,我做了'undergrid = deepcopy(grid)',但没有注意到在循环'grid = undergrid'内部,非常感谢您的指示。好吧!! – DK5 2013-04-09 11:55:17

+0

,我仍在努力用formating -_- – DK5 2013-04-09 11:55:34