python实现元胞自动机——超简单的流言模型

关于元胞自动机,这个ppt讲得挺不错的:

https://wenku.baidu.com/view/86050cb9aeaad1f347933f28.html

下面实现一个流言模型:

from matplotlib import pyplot as plt
#元胞自动机、流言模型


def count_rumour(matrix,rumour):#二维矩阵,计算流言的数目
    sum_rumour=0
    for sublist in matrix:
        sum_rumour+=sublist.count([0,rumour])+sublist.count([rumour,rumour])
    return sum_rumour

def spread(size,rumour,start_x,start_y):
    # 初始化
    rumour_matrix = [[[0, 0] for i in range(size)] for j in range(size)]
    rumour_spread = []
    rumour_matrix[start_x][start_y] = [1, 1]
    rumour_spread.append(count_rumour(rumour_matrix, rumour))
    # 个体更新
    while count_rumour(rumour_matrix, rumour) < size * size:
        for i in range(size):
            for j in range(size):
                # 制定流言传播规则1、准备传播流言的传播给邻居(上下左右)2、上次听到流言的,变为准备传播流言
                if rumour_matrix[i][j][0] == rumour:
                    if i - 1 >= 0:
                        rumour_matrix[i - 1][j] = [rumour,rumour]#已经遍历了
                    if i + 1 < size:
                        rumour_matrix[i + 1][j][1] = rumour
                    if j - 1 >= 0:
                        rumour_matrix[i][j - 1] = [rumour,rumour]#已经遍历了
                    if j + 1 < size:
                        rumour_matrix[i][j + 1][1] = rumour
                elif rumour_matrix[i][j][1] == rumour:
                    rumour_matrix[i][j][0] = rumour
        rumour_spread.append(count_rumour(rumour_matrix, rumour))
    print(rumour_spread[:10])#打印前十个时间步流言传播的速度
    plt.plot(rumour_spread)



#设置参数
size=200
rumour=1
#最里面的列表中第2个元素为rumour说明更新刚听到流言,第1个元素为rumour说明准备传播流言
center_x,center_y=int(size/2),int(size/2)
spread(size,rumour,center_x,center_y)
spread(size,rumour,0,0)
plt.show()

输出:

[1, 5, 13, 25, 41, 61, 85, 113, 145, 181]
[1, 3, 6, 10, 15, 21, 28, 36, 45, 55]

还有张图:


蓝色代表流言在中心传播,橙色则是在最角落传播。可以做改进的地方很多,懒得去弄了,目的是简单地了解一下元胞自动机。


  • 10
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值