病毒扩散模拟器,python也可以。事情的概要如下。B站UP主@eleLab写了一个简单的疫情传播模拟程序,告诉大家宅在家里的重要性。视频相信大家都看过了,UP主也放出了源码。因为是Java开发的,所以一开始并没有太在意。后来看到有人分析代码,发现自己也能看懂,然后就想怎么用Python实现。Java版程序将一个人分析为一个(x,y)坐标点,每个人都有一个状态。publicclassPersonextendsPoint{privateintstate=State.NORMAL;}在每一轮迭代中,遍历每个人,每个人根据自己的状态采取一定的动作,包括:移动状态的变化影响其他人的动作具体变化取决于定义的各种系数。一轮迭代完成后,打印这些点,不同的状态对应不同的颜色。绘图部分直接使用的Java绘图类Graphics。Python版的思路如果我们想用Python来实现,应该怎么做呢?如果完全照搬Java版,每次迭代都需要遍历所有的人,计算与他人的距离,也就是N^2次计算。如果是1000人,需要循环100万次。这个Python的性能一定很着急。不过Python有numpy,可以快速操作数组。结合matplotlib,可以绘制图形。importnumpyasnpimportmatplotlib.pyplotasplt如何模拟人群为了减少函数间的互参传递和全局变量的使用,我们还定义了一个类:classPeople(object):def__init__(self,count=1000,first_infected_count=3):self.count=countself.first_infected_count=first_infected_countself.init()所有人的坐标数据是一个N行2列的数组,伴随着某种状态:definit(self):self._people=np.random.normal(0,100,(self.count,2))self.reset()状态值和定时器也是数组,同时每次随机选择指定人数感染:defreset(self):self._round=0self._status=np.array([0]*self.count)self._timer=np.array([0]*self.count)self.random_people_state(self.first_infected_count,1)关键这里的重点是,辅助数组的大小和人数是一致的,这样就可以形成一一对应的关系。状态改变的人顺便记录时间:defrandom_people_state(self,num,state=1):"""随机选择人设置状态"""assertself.count>num#TODO:在极端情况下,将发生无限循环n=0whilen
