问题描述
该代码用于模拟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 次。虽然这可能展示了资源的使用方式,但我同意这段代码可能有点令人困惑。