在python中识别并替换nxn数组中的元素以制作细胞自动机

问题描述 投票:0回答:1

我一直在努力开始这项关于细胞自动机的大学任务。给定波纹管形式的数组,其前提非常简单,其中1代表黑色方块(或活细胞),0代表白色方块(或死细胞)。

world1 = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
 [0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
 [0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
 [0 0 0 0 1 1 1 0 0 0 1 1 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 1 1 1 0 0 0 1 1 1 0 0 0 0]
 [0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
 [0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
 [0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 1 1 0 0 0 1 1 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]]

在每个时间步骤(“刻度”),所有单元同时发生以下转换:

具有少于两个活邻居的任何活细胞死亡,似乎是由于人口不足造成的。

任何有两个或三个活邻居的活细胞都可以存活到下一代。

任何一个有三个以上活邻居的活细胞都会死亡,好像是人口过剩。

具有完全三个活邻居的任何死细胞都变成活细胞,好像通过繁殖。这里的邻居指的是每个元素周围的8个正方形

现在,作为一名物理专业的学生,​​我可以看到数学很简单,但是我真的不知道如何构造代码并如此做,以便以后可以将其转换为动画。我还可以看到边缘的元素应该有一些例外。到目前为止,贝娄是我的尝试...它可以运行,但是什么也没有返回。可以肯定的是,您可以在编程时告诉我相当新的东西!

import numpy as np
world1 = np.loadtxt('data/Pulsar.txt',dtype=np.int8) #loading data
def tick(world):
    north = world[i,i-1] #defining neighboughs as se, ne , n etc ..
    south = world[i,i+1]
    west = world[i+1,i]
    east = world[i-1,i]
    se = world[i+1,i+1]
    sw = world[i+1,i-1]
    ne = world[i-1,i+1]
    nw = world[i-1,i-1]
    neibours = (north, south, west, east, se, sw, ne, nw) #list of neighbough values
    np.where(world.all==0 and sum(neibours)==3, 1, world ) #replacing elements in array 
    np.where(world.all==1 and sum(neibours)<=2, 0, world )
    np.where(world.all==1 and sum(neibours)==2 or 3, 1, world )
    np.where(world.all==1 and sum(neibours)>=4, 0, world )


print(tick(world1))
python arrays matrix conways-game-of-life automaton
1个回答
0
投票

[我认为主要的问题是您将tick函数中单个单元格和整个矩阵的处理混合在一起。

[它开始似乎是处理单个单元格(我认为引用i是'当前'单元格的索引,尽管在任何地方都没有真正定义...),但是随后您似乎正在尝试使用一些numpy将其作为矢量化操作应用于所有单元格的魔力。可能是有可能的,但是为了简单起见,我将首先更加明确。

您可能应该考虑的其他几件事:

  • 您需要执行一些计算针对每个矩阵的单元格-应该有一个循环迭代矩阵的所有单元格...
  • 单元格滴答声的状态可能不会影响相邻单元格滴答声的计算-对于每个滴答声,您要创建矩阵的新副本并将其填充为新状态,而不必在其中写入更改放置并允许矩阵处于滴答状态之间的“污染”状态。

因此,非常粗略(在伪python中:)>

for tick in range(ticks):
  new_state = <matrix>
  for i in range(X):
    for j in range(Y):
      # this is where most of your `tick` function comes in,
      # adjusted to compute new state for a single given cell
      new_state[i][j] = handle_tick_for_cell(i,j,matrix) 
  matrix = new_state
  print(matrix)
© www.soinside.com 2019 - 2024. All rights reserved.