0

特定の時間帯での顧客の到着をシミュレートしたい (統計分布に従って生成されていない)。到着時間は、pandas データフレームに読み込んだ csv ファイルで定義されていますdf

df.head()

arrival_time  start_service  end_service  waiting_time  service_duration
09:00:20      09:01:00       09:06:00     0.40      5.00
09:01:00      09:02:20       09:04:00     1.20      1.40

dfこれは私の現在のコードですが、エンティティ (クライアント) を で定義されたスケジュール(たとえば at 09:00:20、次に at09:01:00など) に従って強制的に到着させる方法がわかりません。 Environment、しかし、どうすればいいですか?(リアルタイム シミュレーションは必要ありません):

import random
import simpy
import pandas as pd

def source(env, df, counter):
    for i, row in df.iterrows():
        c = client(env, 'Client%02d' % i, counter, row, time_in_bank=row["service_duration"])
        env.process(c)   

def client(env, name, counter, row, time_in_bank):
    arrive = env.now # probably some changes to be done here
    print('%s arrived at %7.4f' % (name,arrive))

    with counter.request() as req:
        results = yield req

        wait = env.now - row["waiting_time"]

        print('%s waited %6.3f' % (name, wait))

        yield env.timeout(time_in_bank)
        print('%s exited the office at %7.4f' % (name, env.now))


df = pd.read_csv("arrivals.csv",sep=",",header=0)

env = simpy.Environment()

counter = simpy.Resource(env, capacity=1)
env.process(source(env, df.head(), counter))
env.run()
4

1 に答える 1

0

必要がある:

  • datetime オブジェクトをタイムスタンプに変換し、これらを操作する
  • 渡すinitial_timeを定義しますEnvironment()
  • SimPy の 1 ステップの長さを定義します。1 step == 1 sec

例 (矢印を使用):

import arrow
import simpy

start = arrow.get('2016-11-05T00:00:00')
env = simpy.Environment(initial_time=start.timestamp)

def proc(env):
    print('Proc start at', env.now, arrow.get(env.now))
    yield env.timeout(10)  # 10 seconds
    print('Proc stop at ', env.now, arrow.get(env.now))

p = env.process(proc(env))
env.run(p)

出力:

Proc start at 1478304000 2016-11-05T00:00:00+00:00
Proc stop at  1478304010 2016-11-05T00:00:10+00:00
于 2016-11-04T17:15:42.747 に答える