Simpy离散事件仿真(4)——共享资源——充电站充电

1 共享资源

SimPy提供了三种资源来帮助您进行建模,解决多个进程使用有限的资源问题(例如,汽车在加油站使用数量有限的加油泵或典型的生产-消费问题)。

在本节中,我们将简要介绍SimPy的Resource类。

 

2 资源的基础用法

稍微修改一下在上一节中介绍的电动汽车模型。

这辆车现在将开到一个充电站(battery charging station,BCS),使用两个充电桩中间的一个进行充电。如果这两个点都在使用,汽车将等待其中一个点直至其再次可用,然后开始给充电,完成后离开充电站。

(1)创建仿真环境,以及容量为2的充点桩资源

import simpy
env = simpy.Environment()
bcs = simpy.Resource(env, capacity=2)

(2)修改电动汽车模型

def car(env, name, bcs, driving_time, charge_duration):
    # 模拟驶向充电站
    yield env.timeout(driving_time)

    # 请求充点桩
    print('%s 到达时间: %d' % (name, env.now))
    with bcs.request() as req:
        yield req

        # 充点进程
        print('%s 充点开始时间: %s' % (name, env.now))
        yield env.timeout(charge_duration)
        print('%s 驶离时间: %s' % (name, env.now))

资源(resource)的request()方法生成一个事件(event), 该事件会等待直至资源可用。您将“拥有”资源,直至资源被释放。

在代码中使用with构造资源的请求使用,资源在使用后将自动释放。如果没通过with使用request(),您需要自行使用release()释放资源。

当您释放资源后,下一个等待的进程将激活,“占用”资源。资源的排队规则遵循先进先出(first in—first out,FIFO)策略。

(3)创建汽车进程,运行仿真

for i in range(4):
    env.process(car(env, '第 %d 辆汽车 ' % (i+1), bcs, i*2, 5))

现在我们创建了四个汽车进程,并向resource传递了一些参数。

env.run()

最后,我们可以开始仿真。由于在本次仿真中,car进程都会自行终止,因此我们不需要指定仿真的指定。

第 1 辆汽车  到达时间: 0
第 1 辆汽车  充点开始时间: 0
第 2 辆汽车  到达时间: 2
第 2 辆汽车  充点开始时间: 2
第 3 辆汽车  到达时间: 4
第 1 辆汽车  驶离时间: 5
第 3 辆汽车  充点开始时间: 5
第 4 辆汽车  到达时间: 6
第 2 辆汽车  驶离时间: 7
第 4 辆汽车  充点开始时间: 7
第 3 辆汽车  驶离时间: 10
第 4 辆汽车  驶离时间: 12

注意,前两辆车到达BCS后可以立即开始充电,而第3和第4辆车必须等待。

你可能感兴趣的:(离散事件仿真,学习教程,python,仿真器)