我如何用simpy的语句缩进多个?

发布于 2025-01-21 17:41:25 字数 6982 浏览 1 评论 0原文

我试图构建一个带有多个“带有”语句的小型模型,如下所示。 但是,基于压痕,结果是不同的。 请让我知道缩进的明确规则是什么。

import simpy
import random

class Pre_Define:
    warmup_period = 1440
    sim_duration = 14400
    number_of_runs = 1 #3
    n_edbed = 77

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)  
        self.bed_transporter = simpy.Resource(self.env, capacity = 10) 
        # self.bed_cleaner = simpy.Resource(self.env, capacity = 2)
        self.run_number = run_number
        
    def generate_beds(self):
        for i in range(Pre_Define.n_edbed):
            yield self.env.timeout(0)
            yield self.bed_clean.put(f'bed{i}')
       # print(self.bed_clean.items)
       
    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.ed_process(pt))

    def clean_beds_process(self, cleaner_id):
        while True:
            bed = yield self.bed_dirty.get()
            #print(f'{self.env.now:.2f}  cleaner {cleaner_id} has started to clean bed {bed}')
            # clean bed
            yield self.env.timeout(50)
            #print(f'{self.env.now:.2f}  cleaner {cleaner_id} has finish cleaning bed {bed}')
            # put bed in clean bed queue, loop to wait for next dirty bead
            yield self.bed_clean.put(bed)

    def ed_process(self, pt):
        # process for treating a patient
        #print(f'{self.env.now:.2f}  patient  {pt.id} has arrived')
        with self.tg.request() as req:
            yield req
            yield self.env.timeout(10)
        #print(f'{self.env.now:.2f}  patient  {pt.id} has been triaged')
        bed = yield self.bed_clean.get()
        pt.bed_name = bed
        #print(f'{self.env.now:.2f}  patient {pt.id} has a clean EU bed {bed}')

        with self.physician.request() as req:
            yield req
            yield self.env.timeout(10)
        
        pt.admin_decision()
        #print(f'{self.env.now:.2f} patient {pt.id} has admission descesion of {pt.admission_decision}')

        if pt.admission_decision == "DIS":
            with self.IU_bed.request() as req:
                print(f'{self.env.now:.2f} patient {pt.id} is waiting IU bed')
                yield req
                with self.bed_transporter.request() as transreq:
                    print(f'{self.env.now:.2f} patient {pt.id} is waiting transporter')
                    yield transreq
                    yield self.env.timeout(15)   
                    
                dirty_bed_name = pt.bed_name
                yield self.bed_dirty.put(dirty_bed_name)
                print(f'{self.env.now:.2f} patient {pt.id} moved to IU and give up {dirty_bed_name}')
    
                yield self.env.timeout(600)
                print(f'{self.env.now:.2f} IU bed is available')
        else:
            # patient leaves EU
            dirty_bed_name = pt.bed_name
            #Bed_Mgmt.check_q(pt_id, self.pt_ed_q, self.bed_clean, self.bed_dirty, self.bed_cleaner)
            yield self.bed_dirty.put(dirty_bed_name)
            #print(f'{self.env.now:.2f}  patient {pt.id} left EU giving up bed {dirty_bed_name}')

    def run(self):
        self.env.process(self.generate_pt_arrivals())
        self.env.process(self.generate_beds())

        # creating and starting two cleaners
        for i in range(2):
            self.env.process(self.clean_beds_process(i+1))
        
        #self.env.run(until = Pre_Define.warmup_period + Pre_Define.sim_duration)
        self.env.run(until = 650)

for run in range(Pre_Define.number_of_runs):
    run_model = Model(run)
    run_model.run()
    print()

没有错误,但是结果因凹痕而有所不同。

例如, case1&gt;

if pt.admission_decision == "DIS":
            with self.IU_bed.request() as req:
                print(f'{self.env.now:.2f} patient {pt.id} is waiting IU bed')
                yield req
                with self.bed_transporter.request() as transreq:
                    print(f'{self.env.now:.2f} patient {pt.id} is waiting transporter')
                    yield transreq
                    yield self.env.timeout(15)   
                    
                dirty_bed_name = pt.bed_name
                yield self.bed_dirty.put(dirty_bed_name)
                print(f'{self.env.now:.2f} patient {pt.id} moved to IU and give up {dirty_bed_name}')
    
                yield self.env.timeout(600)
                print(f'{self.env.now:.2f} IU bed is available')

case2&gt;

                if pt.admission_decision == "DIS":
            with self.IU_bed.request() as req:
                print(f'{self.env.now:.2f} patient {pt.id} is waiting IU bed')
                yield req
                with self.bed_transporter.request() as transreq:
                    print(f'{self.env.now:.2f} patient {pt.id} is waiting transporter')
                    yield transreq
                    yield self.env.timeout(15)   
                    
                    dirty_bed_name = pt.bed_name
                    yield self.bed_dirty.put(dirty_bed_name)
                    print(f'{self.env.now:.2f} patient {pt.id} moved to IU and give up {dirty_bed_name}')
                yield self.env.timeout(600)
                print(f'{self.env.now:.2f} IU bed is available')

case3&gt;

        if pt.admission_decision == "DIS":
            with self.IU_bed.request() as req:
                print(f'{self.env.now:.2f} patient {pt.id} is waiting IU bed')
                yield req
                with self.bed_transporter.request() as transreq:
                    print(f'{self.env.now:.2f} patient {pt.id} is waiting transporter')
                    yield transreq
                    yield self.env.timeout(15)   
                    
                    dirty_bed_name = pt.bed_name
                    yield self.bed_dirty.put(dirty_bed_name)
                    print(f'{self.env.now:.2f} patient {pt.id} moved to IU and give up {dirty_bed_name}')
                    yield self.env.timeout(600)
                    print(f'{self.env.now:.2f} IU bed is available')

我不确定“与” ...

I tried to build a simpy model with multiple 'with' statement as below.
However, based on indentation, the result was different.
Please let me know what is the clear rule of indentation.

import simpy
import random

class Pre_Define:
    warmup_period = 1440
    sim_duration = 14400
    number_of_runs = 1 #3
    n_edbed = 77

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)  
        self.bed_transporter = simpy.Resource(self.env, capacity = 10) 
        # self.bed_cleaner = simpy.Resource(self.env, capacity = 2)
        self.run_number = run_number
        
    def generate_beds(self):
        for i in range(Pre_Define.n_edbed):
            yield self.env.timeout(0)
            yield self.bed_clean.put(f'bed{i}')
       # print(self.bed_clean.items)
       
    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.ed_process(pt))

    def clean_beds_process(self, cleaner_id):
        while True:
            bed = yield self.bed_dirty.get()
            #print(f'{self.env.now:.2f}  cleaner {cleaner_id} has started to clean bed {bed}')
            # clean bed
            yield self.env.timeout(50)
            #print(f'{self.env.now:.2f}  cleaner {cleaner_id} has finish cleaning bed {bed}')
            # put bed in clean bed queue, loop to wait for next dirty bead
            yield self.bed_clean.put(bed)

    def ed_process(self, pt):
        # process for treating a patient
        #print(f'{self.env.now:.2f}  patient  {pt.id} has arrived')
        with self.tg.request() as req:
            yield req
            yield self.env.timeout(10)
        #print(f'{self.env.now:.2f}  patient  {pt.id} has been triaged')
        bed = yield self.bed_clean.get()
        pt.bed_name = bed
        #print(f'{self.env.now:.2f}  patient {pt.id} has a clean EU bed {bed}')

        with self.physician.request() as req:
            yield req
            yield self.env.timeout(10)
        
        pt.admin_decision()
        #print(f'{self.env.now:.2f} patient {pt.id} has admission descesion of {pt.admission_decision}')

        if pt.admission_decision == "DIS":
            with self.IU_bed.request() as req:
                print(f'{self.env.now:.2f} patient {pt.id} is waiting IU bed')
                yield req
                with self.bed_transporter.request() as transreq:
                    print(f'{self.env.now:.2f} patient {pt.id} is waiting transporter')
                    yield transreq
                    yield self.env.timeout(15)   
                    
                dirty_bed_name = pt.bed_name
                yield self.bed_dirty.put(dirty_bed_name)
                print(f'{self.env.now:.2f} patient {pt.id} moved to IU and give up {dirty_bed_name}')
    
                yield self.env.timeout(600)
                print(f'{self.env.now:.2f} IU bed is available')
        else:
            # patient leaves EU
            dirty_bed_name = pt.bed_name
            #Bed_Mgmt.check_q(pt_id, self.pt_ed_q, self.bed_clean, self.bed_dirty, self.bed_cleaner)
            yield self.bed_dirty.put(dirty_bed_name)
            #print(f'{self.env.now:.2f}  patient {pt.id} left EU giving up bed {dirty_bed_name}')

    def run(self):
        self.env.process(self.generate_pt_arrivals())
        self.env.process(self.generate_beds())

        # creating and starting two cleaners
        for i in range(2):
            self.env.process(self.clean_beds_process(i+1))
        
        #self.env.run(until = Pre_Define.warmup_period + Pre_Define.sim_duration)
        self.env.run(until = 650)

for run in range(Pre_Define.number_of_runs):
    run_model = Model(run)
    run_model.run()
    print()

There is no error, but the result was different by indentation.

For example,
Case1>

if pt.admission_decision == "DIS":
            with self.IU_bed.request() as req:
                print(f'{self.env.now:.2f} patient {pt.id} is waiting IU bed')
                yield req
                with self.bed_transporter.request() as transreq:
                    print(f'{self.env.now:.2f} patient {pt.id} is waiting transporter')
                    yield transreq
                    yield self.env.timeout(15)   
                    
                dirty_bed_name = pt.bed_name
                yield self.bed_dirty.put(dirty_bed_name)
                print(f'{self.env.now:.2f} patient {pt.id} moved to IU and give up {dirty_bed_name}')
    
                yield self.env.timeout(600)
                print(f'{self.env.now:.2f} IU bed is available')

Case2>

                if pt.admission_decision == "DIS":
            with self.IU_bed.request() as req:
                print(f'{self.env.now:.2f} patient {pt.id} is waiting IU bed')
                yield req
                with self.bed_transporter.request() as transreq:
                    print(f'{self.env.now:.2f} patient {pt.id} is waiting transporter')
                    yield transreq
                    yield self.env.timeout(15)   
                    
                    dirty_bed_name = pt.bed_name
                    yield self.bed_dirty.put(dirty_bed_name)
                    print(f'{self.env.now:.2f} patient {pt.id} moved to IU and give up {dirty_bed_name}')
                yield self.env.timeout(600)
                print(f'{self.env.now:.2f} IU bed is available')

Case3>

        if pt.admission_decision == "DIS":
            with self.IU_bed.request() as req:
                print(f'{self.env.now:.2f} patient {pt.id} is waiting IU bed')
                yield req
                with self.bed_transporter.request() as transreq:
                    print(f'{self.env.now:.2f} patient {pt.id} is waiting transporter')
                    yield transreq
                    yield self.env.timeout(15)   
                    
                    dirty_bed_name = pt.bed_name
                    yield self.bed_dirty.put(dirty_bed_name)
                    print(f'{self.env.now:.2f} patient {pt.id} moved to IU and give up {dirty_bed_name}')
                    yield self.env.timeout(600)
                    print(f'{self.env.now:.2f} IU bed is available')

I'm not sure how indent after "with"...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暖风昔人 2025-01-28 17:41:25

资源在被起诉代码的末尾发布。有了任何“带有”,在缩进的末端被调用。另一个常见的用例是读取文件或流。由于肮脏的床商店是无限的,因此我认为情况1和2会运行。技术差异是在情况1的情况下,转运蛋白是在suff self.env.timeout(15)行之后释放的。在情况2中,它是在print之后发布的(f'{self.env.now:.2f}。 ....语句。 at the end, keeping the transported for the timeout(600)

I think case 1 is what you want

the resource is is released at the end of the indicted code. with any "with", close is called at the end of the indentation. The other common use case for "with" is reading files or streams. Since the dirty bed bed store is infinite I think case 1 and 2 would run the same. The tech difference is in case 1 the transporter is released after the yield self.env.timeout(15) line. while in case 2 it is release after the print(f'{self.env.now:.2f}..... statement. and in case 3 both the IU bed and the transporter are released at the end, keeping the transported for the timeout(600)

I think case 1 is what you want

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文