如何使用其他 def 值?
How to use other def values?
我想使用其他 def 值。
比如我在'clean_beds_process'定义中添加了一个'pt',在'run'定义中添加了'Patients'。
我想在调用 'clean_beds_process' 函数时获取患者信息。
但是,这会导致此错误“AttributeError: type object 'Patients' has no attribute 'id'”
我不知道为什么会这样。
也许我对 simpy 的机制有一些错误的理解。
请让我知道调用 'clean_beds_process' 函数时如何使用患者信息。
谢谢。
import simpy
import random
class Patients:
def __init__(self, p_id):
self.id = p_id
self.bed_name = ""
self.admission_decision = ""
def admin_decision(self):
admin_decision_prob = random.uniform(0, 1)
if admin_decision_prob <= 0.7:
self.admission_decision = "DIS"
else:
self.dmission_decision = "IU"
return self.admission_decision
class Model:
def __init__(self, run_number):
self.env = simpy.Environment()
self.pt_ed_q = simpy.Store(self.env )
self.pt_counter = 0
self.tg = simpy.Resource(self.env, capacity = 4)
self.physician = simpy.Resource(self.env, capacity = 4)
self.bed_clean = simpy.Store(self.env)
self.bed_dirty = simpy.Store(self.env)
self.IU_bed = simpy.Resource(self.env, capacity = 50)
def generate_beds(self):
for i in range(77):
yield self.env.timeout(0)
yield self.bed_clean.put(f'bed{i}')
def generate_pt_arrivals(self):
while True:
self.pt_counter += 1
pt = Patients(self.pt_counter)
yield self.env.timeout(5)
self.env.process(self.process(pt))
def clean_beds_process(self, cleaner_id, pt):
while True:
print(pt.id)
bed = yield self.bed_dirty.get()
yield self.env.timeout(50)
yield self.bed_clean.put(bed)
def process(self, pt):
with self.tg.request() as req:
yield req
yield self.env.timeout(10)
bed = yield self.bed_clean.get()
pt.bed_name = bed
pt.admin_decision()
if pt.admission_decision == "DIS":
with self.IU_bed.request() as req:
dirty_bed_name = pt.bed_name
yield self.bed_dirty.put(dirty_bed_name)
yield self.env.timeout(600)
else:
dirty_bed_name = pt.bed_name
yield self.bed_dirty.put(dirty_bed_name)
def run(self):
self.env.process(self.generate_pt_arrivals())
self.env.process(self.generate_beds())
for i in range(2):
self.env.process(self.clean_beds_process(i+1, Patients))
self.env.run(until = 650)
run_model = Model(0)
run_model.run()
因此,如果患者可以使用干净的床或脏的床,那么患者需要提出两个请求(每种床一个)并使用 env.any_of 等待第一个请求触发.您还需要处理两个事件同时触发的情况。不要忘记取消您不使用的请求。如果触发的请求是一张干净的床,那么事情基本保持不变。但是如果请求是一张脏床,那么你需要添加一个清洁床的步骤。为此,我会制作清洁工资源而不是流程。所以病人会要求一个清洁器,并为清洁时间做一个超时,释放清洁器。为了收集患者数据,我会创建一个包含患者 ID、关键事件、时间的日志,然后处理这些 post sim 以获得我需要的统计数据。为了处理日志,我经常创建一个数据框来过滤第一个日志,第二个数据框过滤第二个事件,在患者 ID 上加入两个数据框。现在,患者的两个事件都在一行中,因此我可以获得增量。一旦有了增量,我就可以进行求和和计数。例如,如果我的两个事件是患者到达时和患者上床时,求出增量总和除以计数,我就得到了平均上床时间。
如果你还记得的话,我刚才给你的第一个答案有一个例子,从两个不同的队列中得到第一个可用的床位
我没有很多时间知道,但我希望这篇论文能有点帮助
我想使用其他 def 值。 比如我在'clean_beds_process'定义中添加了一个'pt',在'run'定义中添加了'Patients'。 我想在调用 'clean_beds_process' 函数时获取患者信息。 但是,这会导致此错误“AttributeError: type object 'Patients' has no attribute 'id'” 我不知道为什么会这样。 也许我对 simpy 的机制有一些错误的理解。 请让我知道调用 'clean_beds_process' 函数时如何使用患者信息。 谢谢。
import simpy
import random
class Patients:
def __init__(self, p_id):
self.id = p_id
self.bed_name = ""
self.admission_decision = ""
def admin_decision(self):
admin_decision_prob = random.uniform(0, 1)
if admin_decision_prob <= 0.7:
self.admission_decision = "DIS"
else:
self.dmission_decision = "IU"
return self.admission_decision
class Model:
def __init__(self, run_number):
self.env = simpy.Environment()
self.pt_ed_q = simpy.Store(self.env )
self.pt_counter = 0
self.tg = simpy.Resource(self.env, capacity = 4)
self.physician = simpy.Resource(self.env, capacity = 4)
self.bed_clean = simpy.Store(self.env)
self.bed_dirty = simpy.Store(self.env)
self.IU_bed = simpy.Resource(self.env, capacity = 50)
def generate_beds(self):
for i in range(77):
yield self.env.timeout(0)
yield self.bed_clean.put(f'bed{i}')
def generate_pt_arrivals(self):
while True:
self.pt_counter += 1
pt = Patients(self.pt_counter)
yield self.env.timeout(5)
self.env.process(self.process(pt))
def clean_beds_process(self, cleaner_id, pt):
while True:
print(pt.id)
bed = yield self.bed_dirty.get()
yield self.env.timeout(50)
yield self.bed_clean.put(bed)
def process(self, pt):
with self.tg.request() as req:
yield req
yield self.env.timeout(10)
bed = yield self.bed_clean.get()
pt.bed_name = bed
pt.admin_decision()
if pt.admission_decision == "DIS":
with self.IU_bed.request() as req:
dirty_bed_name = pt.bed_name
yield self.bed_dirty.put(dirty_bed_name)
yield self.env.timeout(600)
else:
dirty_bed_name = pt.bed_name
yield self.bed_dirty.put(dirty_bed_name)
def run(self):
self.env.process(self.generate_pt_arrivals())
self.env.process(self.generate_beds())
for i in range(2):
self.env.process(self.clean_beds_process(i+1, Patients))
self.env.run(until = 650)
run_model = Model(0)
run_model.run()
因此,如果患者可以使用干净的床或脏的床,那么患者需要提出两个请求(每种床一个)并使用 env.any_of 等待第一个请求触发.您还需要处理两个事件同时触发的情况。不要忘记取消您不使用的请求。如果触发的请求是一张干净的床,那么事情基本保持不变。但是如果请求是一张脏床,那么你需要添加一个清洁床的步骤。为此,我会制作清洁工资源而不是流程。所以病人会要求一个清洁器,并为清洁时间做一个超时,释放清洁器。为了收集患者数据,我会创建一个包含患者 ID、关键事件、时间的日志,然后处理这些 post sim 以获得我需要的统计数据。为了处理日志,我经常创建一个数据框来过滤第一个日志,第二个数据框过滤第二个事件,在患者 ID 上加入两个数据框。现在,患者的两个事件都在一行中,因此我可以获得增量。一旦有了增量,我就可以进行求和和计数。例如,如果我的两个事件是患者到达时和患者上床时,求出增量总和除以计数,我就得到了平均上床时间。
如果你还记得的话,我刚才给你的第一个答案有一个例子,从两个不同的队列中得到第一个可用的床位
我没有很多时间知道,但我希望这篇论文能有点帮助