Simpy - 在特定时间设置资源请求
Simpy - setting resource requests at specific times
我正在尝试对一个系统建模,在该系统中,在定义了一个进程之后,有两组资源请求。在最初接收原始进程之后,立即请求一组新的资源请求。这很简单,可以使用 with resource.request() as req: yield req
类型的指令轻松完成。
我完全卡住的地方是第二组请求,需要定期安排,例如在流程实例化后的以下 10 个时间单位中的每一个。
因此,例如,如果原始进程在 t = 0.5 时开始,则会有一堆东西立即排队,但其他东西会在 t = 1.5、2.5、3.5 等时排队。有没有人对如何实施第二组请求有任何建议?
在搜索了我能找到的所有示例后,我找到了解决方案。最终,它基于文档 Event Latency 示例中的想法。我认为我对简单语法的理解只需要赶上我想做的事情。这是一个运行 returns 的示例,每 7 个时间步执行一次操作,同时还逐步执行另一个随机序列:
import simpy
import numpy as np
import random
random.seed(123)
env = simpy.Environment()
def roundup(x, b):
"""Round up x in base b"""
return b * np.ceil(x/b)
def stalling(env, base):
"""Something needs to get tasked repeatedly."""
while True:
yield env.timeout(max(0.01, roundup(env.now, base)-env.now))
if env.now >= base:
print("%.1f: New process called here" % env.now)
yield(env.timeout(0.01))
def parent(env, base):
env.process(stalling(env, base))
while True:
x = random.randint(1,10)
print("%.1f: Wait for %i" % (env.now, x))
yield(env.timeout(x))
env.process(parent(env, 7))
env.run(until = 50)
"""
0.0: Wait for 1
1.0: Wait for 5
6.0: Wait for 2
7.0: New process called here
8.0: Wait for 7
14.0: New process called here
15.0: Wait for 5
20.0: Wait for 2
21.0: New process called here
22.0: Wait for 1
23.0: Wait for 7
28.0: New process called here
30.0: Wait for 9
35.0: New process called here
39.0: Wait for 9
42.0: New process called here
48.0: Wait for 6
49.0: New process called here
"""
我正在尝试对一个系统建模,在该系统中,在定义了一个进程之后,有两组资源请求。在最初接收原始进程之后,立即请求一组新的资源请求。这很简单,可以使用 with resource.request() as req: yield req
类型的指令轻松完成。
我完全卡住的地方是第二组请求,需要定期安排,例如在流程实例化后的以下 10 个时间单位中的每一个。
因此,例如,如果原始进程在 t = 0.5 时开始,则会有一堆东西立即排队,但其他东西会在 t = 1.5、2.5、3.5 等时排队。有没有人对如何实施第二组请求有任何建议?
在搜索了我能找到的所有示例后,我找到了解决方案。最终,它基于文档 Event Latency 示例中的想法。我认为我对简单语法的理解只需要赶上我想做的事情。这是一个运行 returns 的示例,每 7 个时间步执行一次操作,同时还逐步执行另一个随机序列:
import simpy
import numpy as np
import random
random.seed(123)
env = simpy.Environment()
def roundup(x, b):
"""Round up x in base b"""
return b * np.ceil(x/b)
def stalling(env, base):
"""Something needs to get tasked repeatedly."""
while True:
yield env.timeout(max(0.01, roundup(env.now, base)-env.now))
if env.now >= base:
print("%.1f: New process called here" % env.now)
yield(env.timeout(0.01))
def parent(env, base):
env.process(stalling(env, base))
while True:
x = random.randint(1,10)
print("%.1f: Wait for %i" % (env.now, x))
yield(env.timeout(x))
env.process(parent(env, 7))
env.run(until = 50)
"""
0.0: Wait for 1
1.0: Wait for 5
6.0: Wait for 2
7.0: New process called here
8.0: Wait for 7
14.0: New process called here
15.0: Wait for 5
20.0: Wait for 2
21.0: New process called here
22.0: Wait for 1
23.0: Wait for 7
28.0: New process called here
30.0: Wait for 9
35.0: New process called here
39.0: Wait for 9
42.0: New process called here
48.0: Wait for 6
49.0: New process called here
"""