Python 如何定义两个对立政党之间的平衡

Python 如何定义两个对立政党之间的平衡,python,arrays,cellular-automata,Python,Arrays,Cellular Automata,我有两个政党A=1和B=0,用于2d数组中每个政党的选票分布模型。在我的代码中,我设定了规则,如果在一个中心单元(包括中心单元)周围的九个单元中的大多数邻居,那么中心单元将与多数人一起投票 这一部分很好,但我试图实施的下一步是,当这个系统达到平衡时,我们必须改变规则 我搞不清楚如何定义平衡。最初我以为会有50%的细胞投票支持A,其余的细胞投票支持B。但在研究了这个系统后,我注意到它通常有稳定的状态,分布不是50 所以现在我认为我应该测量变化率?也就是说,当A的变化率等于b的变化率时,系统将达到平

我有两个政党A=1和B=0,用于2d数组中每个政党的选票分布模型。在我的代码中,我设定了规则,如果在一个中心单元(包括中心单元)周围的九个单元中的大多数邻居,那么中心单元将与多数人一起投票

这一部分很好,但我试图实施的下一步是,当这个系统达到平衡时,我们必须改变规则

我搞不清楚如何定义平衡。最初我以为会有50%的细胞投票支持A,其余的细胞投票支持B。但在研究了这个系统后,我注意到它通常有稳定的状态,分布不是50

所以现在我认为我应该测量变化率?也就是说,当A的变化率等于b的变化率时,系统将达到平衡。我似乎没有正确地实现这一点(或者这个想法根本不起作用),python中是否有一个预先存在的函数可以给我一个变化率,或者我必须构建某种函数来计算它

编辑:我已经在下面添加了我的代码,很抱歉没有把这个放在上面。我不是这个特殊堆栈交换上的一个多产的海报,所以我不确定我应该放多少

def update_world(frameNum,world,N):

#复制网格,因为我们需要8个邻居进行计算
#我们一行一行地走
newworld=world.copy()
坏的=假的
对于范围(N)中的i:
对于范围(N)内的j:
#使用环形边界条件计算8负或和
#x和y环绕,以便模拟
#发生在环形表面上
Num_neights=int(世界[i,(j-1)%N]+世界[i,(j+1)%N]+
世界[(i-1)%N,j]+世界[(i+1)%N,j]+
世界[(i-1)%N,(j-1)%N]+世界[(i-1)%N,(j+1)%N]+
世界[(i+1)%N,(j-1)%N]+世界[(i+1)%N(j+1)%N]+世界[i,j]))
相等=np.和((世界))
如果[i,j]==1:
如果Num_>=5:
新世界[i,j]=1
elif Num_=6:
新世界[i,j]=1

elif Num_neighbourse我假设你的2D数组是一个numpy数组;如果没有,请编辑问题,使其更加具体。不管怎么说,你的问题没有明确说明,但是一旦你决定了你需要的数学,实现它就会很容易。如果“A的变化率”只是A的单元数减去前一步中A的单元数,那么δA将始终是-δB,因此您的规则只是测试它们都是0,这很容易,只需从当前一步的数组中减去最后一步的数组,求和结果,然后查看它是否为0。更一般地说:“我似乎没有正确地实施这一点“这是一个很难解决的问题,不需要看到一个新的解决方案。如果您向我们展示不起作用的代码,以及输入和期望的与实际的输出,那么应该很容易展示如何修复它。但是只是给我们一个模糊的问题说明,然后告诉我们一些我们看不见的代码似乎以某种未指明的方式错了,我们如何帮助?@abarnert如果你想看一下,我添加了我的代码?快速浏览:
如果[I,j]==1
永远不会是真的。你在问两个整数的列表是否等于一个整数,这是不可能的。你至少还有一个
IndentationError
@abarner如果代码的第一部分起作用,我不是问两个整数的列表是否是一个整数,我是问I,j位置的网格值是否等于1,如果该单元格投票给一个
# copy grid since we require 8 neighbors for calculation
# and we go line by line 

newworld = world.copy()
broken=False

for i in range(N):

  for j in range(N):

        # compute 8-neghbor sum using toroidal boundary conditions

        # x and y wrap around so that the simulation

        # takes place on a toroidal surface

        Num_neighbours = int((world[i, (j-1)%N] + world[i, (j+1)%N] + 
                     world[(i-1)%N, j] + world[(i+1)%N, j] + 
                     world[(i-1)%N, (j-1)%N] + world[(i-1)%N, (j+1)%N] + 
                     world[(i+1)%N, (j-1)%N] + world[(i+1)%N (j+1)%N]+world[i,j]))
     equal= np.sum((world)) 


  if [i, j] == 1:
        if Num_neighbours >= 5:
           newworld[i, j] = 1

     elif Num_neighbours <5:
        newworld[i,j] =0
     else:
        if Num_neighbours <5 :
           newworld[i, j] = 0

        elif Num_neighbours >=5:
           newworld[i,j] =1
        #break from the sytem when status quo hits equibrium
        if equal ==N/2:
           broken = True
           break
  if broken == True:
     break
        for i in range(N):
            for j in range(N):
              if [i, j] == 1:
                if Num_neighbours >= 6:
                 newworld[i, j] = 1

              elif Num_neighbourse <6:
                 newworld[i,j] =0
           else:
              if Num_neighbours <4 :
                 newworld[i, j] = 0

              elif Num_neighbours >=4:
                 newworld[i,j] =1

world[:] = newworld[:]
return world