解释 SimPy 注册台问题的工作原理

问题描述

代码用于模拟2人10名学生注册台,5分钟完成注册,3分钟等待时间一个学生可以开始注册

我是模拟新手,我无法理解标记#line1#line2

代码的目的/使用/工作

另外,为什么代码不在 #line2 之前先执行 for 循环?

 import simpy
    class Student(object):
      def __init__(self,env,reg):
        self.env=env
        self.action=env.process(self.run())       #line 1
        self.reg=reg
      def run(self):
        with reg.request() as r:
          yield r
          print("Start registration at at %d" % env.Now)
          yield env.timeout(5)
          print("Start waiting at %d "% env.Now)
          yield env.timeout(3)
    env=simpy.Environment()
    reg=simpy.Resource(env,capacity=2)
    student=Student(env,reg)
    for i in range (9):
      env.process(student.run())                   
    env.run(until=80)                              #line2

解决方法

#Line 2 实际开始模拟 80 个单位的时间。其余代码设置模拟的起始状态。这个 env.run() 不是 Student 类中定义的 run()

#Line 1 更有趣。有几种模式可以进行模拟。一种模式使用类,当一个类对象被实例化/创建时,它也会启动它的模拟过程,所以你不需要自己调用 student.run() 。 __init__() 在您创建类对象时被调用。但是,如果您使用此模式,则应该将#line 2 之前的循环从

更改为
student = Student(env,reg)
for i in range(9):
    env.process(student.run())

students = [Student(env,reg) for _ in range(10)]

这将创建 10 个学生,每个学生都在等待注册。创建 10 个学生的好处是每个学生都可以有自己的状态,比如一个唯一的 ID 号,并收集关于他们自己的统计信息。这在更复杂的模拟中非常有用

这段代码应该是这样写的。

另一种模式是您自己调用 Student.run() 的地方。为此,您可以注释掉#line 1 并将#line 2 上方循环中的循环计数器从9 更改为10。这里的缺点是所有学生都使用相同的类变量。使用这种模式的一种更常见的方法是不使用类,只使用 def 函数并调用此函数 10 次,将 env 和 reg 直接传递给函数

正如所写的那样,这段代码的真正作用是创建一个学生,并且该学生注册 10 次,一次是在创建时,然后在循环中再注册 9 次。虽然这可能展示了资源的使用方式,但我同意这段代码可能有点令人困惑。