Simpy 中的高峰需求时间建模

问题描述

也许这真的是一个很平衡的问题,但我还没有找到解决方案。

我正在模拟充电站上的充电行为。充电或等待的简单过程。我通过 expovariate 函数初始化了到达,它就像一个魅力。但是,现在我想实施高峰时段,其中到达率正在发生变化。

因为我需要模拟一整周,高峰时间基本保持不变,所以我已经这样实现了

def run_cs(env,num_charging_lots):
cs = CS(env,num_charging_lots)
ev = 1

while True:
    arrival_time = env.Now
    if 2880 >= arrival_time > 1440:
        print('Tuesday')
    elif 4320 >= arrival_time > 2880:
        print('Wednesday')
    elif 5760 >= arrival_time > 4320:
        print('Thursday')
    elif 7200 >= arrival_time > 5760:
        print('Friday')
    elif 8640 >= arrival_time > 7200:
        print('Saturday')
    elif 10080 >= arrival_time > 8640:
        print('Sunday')

    hour = arrival_time / 60

    if (hour % 24) < 0.9 and hour != 0:
        print('es ist 0 Uhr')
        while (hour % 24) < 0.9:
            print('EV %s arrives at %d' % (ev,env.Now))
            env.process(charging_EV(env,ev,cs))
            ev += 1
            yield env.timeout(random.expovariate(2))

    elif (hour % 7) < 0.9 and (hour != 0):
        print('es ist 7 Uhr')
        while (hour % 7) < 0.9 or 1440 <= (env.Now % 1860) <= 1449 and (hour != 0):
            print('EV %s arrives at %d' % (ev,cs))
            ev += 1
            yield env.timeout(random.expovariate(1))

    elif (hour % 12) < 0.9 and (hour != 0):
        print('es ist 12 Uhr')
        while (hour % 12) < 0.9 and (hour != 0):
            print('EV %s arrives at %d' % (ev,cs))
            ev += 1
            yield env.timeout(random.expovariate(1))

    elif (hour % 18) < 0.9 or 1440 <= (env.Now % 2520) <= 1449 and (hour != 0):
        while (hour % 18) < 0.9 and (hour != 0):
            print('EV %s arrives at %d' % (ev,cs))
            ev += 1
            yield env.timeout(random.expovariate(1))

    else:
        print('EV %s arrives at %d' % (ev,env.Now))
        env.process(charging_EV(env,cs))
        ev += 1
        yield env.timeout(random.expovariate(2))  # pace of EV arrivals

我的想法是检查当前时间是否是高峰时间。这样,时间段的 while 循环开始并改变到达率。如果一切都失败,则应使用普通的到达间隔时间。我现在的问题是模拟没有完成。我的高峰时间是上午 0:00 或中午 12 点、上午 7:00/上午 7 点、中午 12:00/12 点和下午 18:00/6 点

是否有更好的方法来做到这一点或跟踪一天中的时间?

解决方法

我觉得你这里可能有无限循环

while (hour % 24) < 0.9:
        print('EV %s arrives at %d' % (ev,env.now))
        env.process(charging_EV(env,ev,cs))
        ev += 1
        yield env.timeout(random.expovariate(2))

您在哪里更新小时变量以打破 while 循环条件? 与您的其他 while 循环相同的问题

或者所有这些while语句都应该是if语句吗?

或者你甚至需要while语句,只需执行一次,让外循环做它的事情