import Data, InitPeolple, DrawFirst, Rule, Income import matplotlib.pyplot as plt import matplotlib.animation import numpy as np import time init = InitPeolple.InitPeople() draw = DrawFirst.draw() # move=Rule.PeopleMove() income = Income.outDirection() # allPeople=init.creatPeople() allPeople = init.creatAppointPeo() allWall = init.creatWall() allExit = init.creatExit() # while Data.flag: # for p in allPeople: # income.outDirection(p,allPeople) # direction=max(p.allInComeBySort.items(),key=lambda x:x[1])[0] # print('direction ==',direction) while Data.flag: for p in allPeople: income.outDirection(p, allPeople) direction = max(p.allInComeBySort.items(), key=lambda x: x[1])[0] Rule.chickOverAround(p, allPeople) Rule.PeopleMove(p, direction) # print(p.grendIncome) # print(p.isInGrend) print(p.allInComeBySort)
def run_f(case_s, P, R, steps): resultData = [] #返回总列表 if case_s == 0: #危险源位置设置 Data.FX_N = 19 elif case_s == 1: Data.FX_N = 15 elif case_s == 2: Data.FX_N = 10 elif case_s == 3: Data.FX_N = 5 elif case_s == 4: Data.FX_N = 2 Data.PEOPLE_DENSYTY = P #行人密度 Data.PEOPLE_NUMBER = int(Data.ROOM_N * Data.ROOM_M * Data.PEOPLE_DENSYTY) #行人数量 Data.FX_SIGMA_2 = R #危险源大小 Data.FX_R = 2 * np.sqrt(Data.FX_SIGMA_2) # 影响范围半径 Data.FX_P = 2 * Data.FX_SIGMA_2 # 系数 p越大 高斯函数的圆形越大 init = InitPeolple.InitPeople() #实例化 产生行人类 # draw = DrawFirst.draw()#实例化 画图类 # income = Income.outDirection() allPeople = init.creatPeople() #产生随机行人 # allPeople=init.creatAppointPeo()#产生指定行人 allWall = init.creatWall() #创建墙壁 allExit = init.creatExit() #创建出口 T = [] #疏散时间 S = [] #剩余行人 V = [] #行人速度 Q = [] #出口流量 Q.append(0) #将出口流量[0]设为0 Q列表少一个数 evac_time = 0 #疏散时间 while Data.flag: #循环开始 move_on_num = 0 #本次时间步移动的行人 move_off_num = 0 #本次时间步静止的行人 vector = 0 #本次时间步行人速度 for p in allPeople: #遍历行人 Income.outDirection(p, allPeople) #计算收益 direction = max(p.allInComeBySort.items(), key=lambda x: x[1])[0] #获取方向 if direction == 5: #如果行人静止 move_off_num = move_off_num + 1 #计数器+1 else: move_on_num = move_on_num + 1 #计数器+1 Rule.chickOverAround(p, allPeople) #检测是否到达出口 Rule.PeopleMove(p, direction) #行人移动 # draw.drawPeople(allPeople)#绘制行人 # print(evac_time,"---",len(allPeople),"---",move_on_num/len(allPeople)) if len(allPeople) == 0: #如果行人全部疏散完毕 vector = 1 #速度设为1 Data.flag = False #循环标志--停止 else: vector = move_on_num / len(allPeople) #行人速度=移动的行人/总行人 if vector > 1: #如果行人速度>1 vector = 1.0 #设置为1 T.append(evac_time) #将疏散时间添加到T S.append(len(allPeople)) #将剩余行人添加到S V.append(vector) #将行人速度添加到V evac_time = evac_time + 1 #疏散时间+1 for i in range(len(S) - 1): #遍历行人 quar = S[i] - S[i + 1] #出口流量=上一步的行人总数-下一步的行人总数 Q.append(quar) #将出口流量添加到Q '''将各种参数添加到返回列表''' resultData.append(case_s) resultData.append(P) resultData.append(R) resultData.append(steps) resultData.append(T) resultData.append(S) resultData.append(V) resultData.append(Q) return resultData