定期从 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)