Python学习笔记#9:病毒传播模拟程序

本文通过Python模拟病毒传播,介绍两种方法:面向对象和矩阵运算。面向对象方式中,每个人为独立对象,算法涉及多层循环;矩阵运算方式利用快速的矩阵处理,降低时间复杂度。两种方法分别详细阐述了实现步骤和关键点。
摘要由CSDN通过智能技术生成

概述

本章借助matplotlib包,模拟疫情传播,有两种思路:

  1. 使用面向对象的方式,每个人为一个独立对象
  2. 使用矩阵的方式

方法1. 面向对象方式

面向对象的方式,每个人为一个独立对象,算法:

  1. 遍历所有对象:
    1. 更新当前对象位置(移动)
    2. 计算当前对象到其他所有人的相对距离
    3. 根据距离,感染率等因素,改变对象邻居当前的状态。

算法逻辑非常简单,但是可以看到会嵌套多次循环,时间复杂度为: O ( n 2 ) O(n^2) O(n2)

1. 导入包

import numpy as np
import matplotlib.pyplot as plt

2. 全局参数

# 地图宽度
width = 100

# 总人口
pop = 2000

# 初始病人数量
n = 10

# 感染半径
sd = 10

# 感染几率 50%
sr = 0.5

3. 定义人

  1. 坐标:随机分布
  2. 颜色:绿色代表健康,红色代表感染
  3. 运动函数:人随机运动
# 人
class People(object):
    def __init__(self):
    	# 随机坐标
        self.x = np.random.rand() * width
        self.y = np.random.rand() * width
        self.loc = np.array([self.x, self.y])
        self.color = 'g'

    # 随机运动
    def move(self):
        self.x += np.random.randn()
        self.y += np.random.randn()

4. 环境

  1. 按照人口生成不同的人口对象
  2. 随机选择病源
# 人群
all_people = np.array([People() for i in range(pop)])

# 初始化患病人群
sick_people = np.random.choice(all_people, size=n, replace=False)
for p in sick_people:
    p.color = "r"

5. 病毒感染

  1. 遍历所有人群,区分患者与普通人
  2. 遍历患者:
    1. 遍历所有人,计算与当前患者的距离
      1. 当目标与患者距离小于传播半径,则有一定几率感染。
  3. 返回患病熟料
# 病毒感染函数
def affect(all_people):
    sick_people = []
    healthy_people = []
    n = 0
    for p in all_people:
        if p.color == "r":
            sick_people.append(p)
            n += 1
        if p.color == "g":
            healthy_people.append(p)

    for sp in sick_people:
        for hp in healthy_people:
            dist = np.linalg
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值