#coding:utf-8
import random
import datetime
start = datetime.datetime.now()
#定义病人结构体
class patient(object):
def __init__(self):
self.id = []
self.treatment = []
self.emergency = []
#病人初始化 n:未看病病人,m:病床数,p:已入住病人,w:等待人数
def patient_init():
#list = ['False','True']
inList = patient()
treatList = patient()
n = input("请输入还没有入院的病人数:")
n = int(n)
m = input("请输入病床数:")
m = int(m)
p = input("请输入已入院的病人数:")
p = int(p)
#创建已经入院的病人
for i in range(p):
treatList.id.append(i)
treatList.treatment.append(random.randint(1,20))
#创建还没有入院的病人
for j in range(n):
inList.id.append(j+p)
inList.treatment.append(random.randint(1,20))
if random.randint(0,1) == 0:
inList.emergency.append('F')
else:
inList.emergency.append('T')
#inList.emergency = list[random.randint(0,1)]
return n,m,p,inList,treatList
#显示目前状态
def patient_dispaly(n,w,p,inList,treatList,waitList):
print("即将问诊的病人 等待住院的病人 正在住院的病人")
print("序号 住院时间 外伤/非外伤 序号 住院时间 外伤/非外伤 序号 住院时间")
for i in range(max(len(inList.id),len(waitList.id),len(treatList.id))):
# 输出未入院病人
if i<len(inList.id):
print(inList.id[i],' ',inList.treatment[i],' ',inList.emergency[i],' ',end = '')
else:
print(" ",end = '')
#输出等待的病人
if i<len(waitList.id):
print(waitList.id[i],' ',waitList.treatment[i],' ',waitList.emergency[i],' ',end = '')
else:
print(" ",end = '')
#输出治疗中的病人
if i<len(treatList.id):
print(treatList.id[i],' ',treatList.treatment[i],' ',end = '')
else:
print(" ",end = '')
print("")
#按优先级排序:
def Sort(waitList):
temp = patient()
temp1 = patient()
temp2 = patient()
for a in range(len(waitList.id)):
if waitList.emergency[a] == 'T':
temp1.id.append(waitList.id[a])
temp1.treatment.append(waitList.treatment[a])
temp1.emergency.append(waitList.emergency[a])
else:
temp2.id.append(waitList.id[a])
temp2.treatment.append(waitList.treatment[a])
temp2.emergency.append(waitList.emergency[a])
#print(temp2.id,temp1.id)
for i in range(len(temp1.id)):
for j in range(i+1,len(temp1.id)):
if temp1.treatment[i]>temp1.treatment[j]:
temp1.id[i], temp1.id[j] = temp1.id[j], temp1.id[i]
temp1.treatment[i],temp1.treatment[j] = temp1.treatment[j],temp1.treatment[i]
temp1.emergency[i], temp1.emergency[j] = temp1.emergency[j], temp1.emergency[i]
for m in range(len(temp2.id)):
for n in range(m+1,len(temp2.id)):
if temp2.treatment[m]>temp2.treatment[n]:
temp2.id[m], temp2.id[n] = temp2.id[n], temp2.id[m]
temp2.treatment[m],temp2.treatment[n] = temp2.treatment[n],temp2.treatment[m]
temp2.emergency[m], temp2.emergency[n] = temp2.emergency[n], temp2.emergency[m]
temp1.id.extend(temp2.id)
temp1.treatment.extend(temp2.treatment)
temp1.emergency.extend(temp2.emergency)
return temp1
#病人看病n:未看病病人,m:病床数,p:已入住病人,w:等待人数
def see_doctor(n,w,p,m,inList,treatList,waitList,days):
sum = 0
j = []
print('days',days)
#patient_dispaly(n, w, p, inList, treatList, waitList)
#如果未入院病人>0,则进入等待列表
if len(inList.id)>0:
waitList.id.append(inList.id[0])
waitList.treatment.append(inList.treatment[0])
waitList.emergency.append(inList.emergency[0])
del inList.id[0]
del inList.treatment[0]
del inList.emergency[0]
# 正在治疗的病人 n:未看病病人,m:病床数,p:已入住病人,w:等待人数
for i in range(len(treatList.id)):
if treatList.treatment[i] > 1:
treatList.treatment[i] = treatList.treatment[i] - 1
'''if treatList.treatment[i] == 0:
del treatList.id[i]
del treatList.treatment[i]'''
else:
j.append(i)
j.sort(reverse=True)
for o in j:
del treatList.id[o]
del treatList.treatment[o]
# 如果存在空余病房,则入住n:未看病病人,m:病床数,p:已入住病人,w:等待人数
while(True):
if len(treatList.id) == m or len(waitList.id) == 0:
break
treatList.id.append(waitList.id[0])
treatList.treatment.append(waitList.treatment[0])
del waitList.id[0]
del waitList.treatment[0]
del waitList.emergency[0]
'''else:
if len(waitList.id)>0:
treatList.id[i] = waitList.id[0]
treatList.treatment[i] = waitList.treatment[0]
del waitList.id[0]
del waitList.treatment[0]
del waitList.emergency[0]'''
days = days + 1
waitList = Sort(waitList)
patient_dispaly(n, w, p, inList, treatList, waitList)
if len(inList.id) > 0 or len(waitList.id) > 0 or len(treatList.id) > 0:
see_doctor(n, w, p, m, inList, treatList, waitList, days)
#print(waitList.id)
'''for j in range(len(treatList.id)):
if treatList.treatment[j] == 0:
sum = sum + 1
if sum < len(treatList.id):
see_doctor(n,w,p,m,inList,treatList,waitList,days)'''
if __name__ == '__main__':
waitList = patient()
w = 0
days = 2
n, m, p, inList, treatList = patient_init()
print('days', 1)
patient_dispaly(n, w, p, inList, treatList, waitList)
see_doctor(n,w,p,m,inList,treatList,waitList,days)
end = datetime.datetime.now()
print(end - start)
医院病床安排算法
最新推荐文章于 2022-10-31 10:43:23 发布