如何使用其他 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 上加入两个数据框。现在,患者的两个事件都在一行中,因此我可以获得增量。一旦有了增量,我就可以进行求和和计数。例如,如果我的两个事件是患者到达时和患者上床时,求出增量总和除以计数,我就得到了平均上床时间。

如果你还记得的话,我刚才给你的第一个答案有一个例子,从两个不同的队列中得到第一个可用的床位

我没有很多时间知道,但我希望这篇论文能有点帮助