定期从 SimPy 中的一个 Dataframe 接收任务
Periodically receiving tasks from one Dataframe in SimPy
我开始使用 SimPy 来模拟制造环境。我有一个生成的 DataFrame,其中包含一定数量的任务(每个任务的属性:ID、start_location、end_location、时间、距离)。
我想在 SimPy 中实现一个过程,将上述 DataFrame 的第一个任务(第一行)传递给模拟中的另一个 DataFrame。每个 Taks 应在随机生成的时间 random.normalvariat(45s, 15s)
后定期传递。之后它应该被执行。
有人知道如何在 SimPy 环境中实现它吗?使用 env.timeout(random.normalvariate(45s, 15s)
函数有意义吗?如果是,实施方法究竟是怎样的?
如有任何帮助,我将不胜感激。
听起来需要一个主控制器模拟进程,您可以将所有数据输入传递给该进程。然后该控制器使用传入的数据来构建和管理 sim。这是一个非常简单的示例,但我已经完成了运输模拟,其中我的输入是位置、旅行时间和卡车时间表以及出发地点、出发时间和目的地地点。控制器将创建位置,并用于根据需要安排创建和移动卡车。
"""
quick sim demo with a controler process that
works through a dataframe generating processes
that model what is being simulated
Programmer: Michael R. Gibbs
"""
from pkg_resources import Environment
import simpy
import random
import pandas as pd
def sim_process(env, id, dur):
"""
This would be one of several processes
that would make up the simulation
"""
print(f'{env.now} starting task {id}')
yield env.timeout(dur)
print(f'{env.now} finished task {id}')
def controlProcess(env, df):
"""
controls the simulation by reading
a dataframe and generating sim processes as needed.
This controler is building the sim.
This example just has one sim porcess, but can be
much more complicated
"""
# loop the dataframe and gen sim processes
for _, row in df.iterrows():
# wait
yield env.timeout(random.normalvariate(45, 15))
# not no yield here, create and move on
env.process(sim_process(env,row['id'], row['dur']))
# start up
# get dataframe
df = pd.DataFrame(
[
['task 1', 40],
['task 2', 50],
['task 3', 60],
['task 4', 40],
['task 5', 50],
['task 6', 60],
['task 7', 40],
['task 8', 50],
['task 9', 60],
['task 10', 40]
],
columns=['id','dur']
)
# boot sime
env = simpy.Environment()
env.process(controlProcess(env, df))
env.run(1000)
我开始使用 SimPy 来模拟制造环境。我有一个生成的 DataFrame,其中包含一定数量的任务(每个任务的属性:ID、start_location、end_location、时间、距离)。
我想在 SimPy 中实现一个过程,将上述 DataFrame 的第一个任务(第一行)传递给模拟中的另一个 DataFrame。每个 Taks 应在随机生成的时间 random.normalvariat(45s, 15s)
后定期传递。之后它应该被执行。
有人知道如何在 SimPy 环境中实现它吗?使用 env.timeout(random.normalvariate(45s, 15s)
函数有意义吗?如果是,实施方法究竟是怎样的?
如有任何帮助,我将不胜感激。
听起来需要一个主控制器模拟进程,您可以将所有数据输入传递给该进程。然后该控制器使用传入的数据来构建和管理 sim。这是一个非常简单的示例,但我已经完成了运输模拟,其中我的输入是位置、旅行时间和卡车时间表以及出发地点、出发时间和目的地地点。控制器将创建位置,并用于根据需要安排创建和移动卡车。
"""
quick sim demo with a controler process that
works through a dataframe generating processes
that model what is being simulated
Programmer: Michael R. Gibbs
"""
from pkg_resources import Environment
import simpy
import random
import pandas as pd
def sim_process(env, id, dur):
"""
This would be one of several processes
that would make up the simulation
"""
print(f'{env.now} starting task {id}')
yield env.timeout(dur)
print(f'{env.now} finished task {id}')
def controlProcess(env, df):
"""
controls the simulation by reading
a dataframe and generating sim processes as needed.
This controler is building the sim.
This example just has one sim porcess, but can be
much more complicated
"""
# loop the dataframe and gen sim processes
for _, row in df.iterrows():
# wait
yield env.timeout(random.normalvariate(45, 15))
# not no yield here, create and move on
env.process(sim_process(env,row['id'], row['dur']))
# start up
# get dataframe
df = pd.DataFrame(
[
['task 1', 40],
['task 2', 50],
['task 3', 60],
['task 4', 40],
['task 5', 50],
['task 6', 60],
['task 7', 40],
['task 8', 50],
['task 9', 60],
['task 10', 40]
],
columns=['id','dur']
)
# boot sime
env = simpy.Environment()
env.process(controlProcess(env, df))
env.run(1000)