从一个例子出发, 说一下自己对于python中的simpy进行模拟的一些理解

问题:

现在,我们来仿真“每天的商店营业额”这个复合泊松过程吧。首先,我们假设每个小时进入商店的平均人数为:[10, 5, 3, 6, 8, 10, 20, 40, 100, 80, 40, 50, 100, 120, 30, 30, 60, 80, 100, 150, 70, 20, 20, 10],每位顾客的平均花费为:10元(大约一份早餐吧),请问每天商店的营业额是多少?

python代码:

# 模拟仿真研究该商店一天的营业额
import simpy

class Store_Money:
    def __init__(self, env):
        self.store_money_container = simpy.Container(env, capacity = 1e8, init = 0)
    
def buy(env, store_money, lmd, avg_money):
    while True:
        body_time = np.random.exponential(1.0/(lmd/60))  # 经过指数分布的时间后,泊松过程记录数+1
        yield env.timeout(body_time)
        money = np.random.poisson(lam=avg_money)
        yield store_money.store_money_container.put(money)

hours = 24  # 一天24h
minutes = 60  # 一个小时60min
days = 3   # 模拟3天
avg_money = 10
lmd_ls = [10, 5, 3, 6, 8, 10, 20, 40, 100, 80, 40, 50, 100, 120, 30, 30, 60, 80, 100, 150, 70, 20, 20, 10]   # 每个小时平均进入商店的人数
money_sum = []  # 存储每一天的商店营业额总和
print('仿真开始:')
for day in range(days):
    day_money_sum = 0   # 记录每天的营业额之和
    for hour, lmd in enumerate(lmd_ls):
        env = simpy.Environment()
        store_money = Store_Money(env)
        store_money_process = env.process(buy(env, store_money, lmd, avg_money))
        env.run(until = 60)  # 每次仿真60min
        if hour % 4 == 0:
            print("第"+str(day+1)+"天,第"+str(hour+1)+"时的营业额:", store_money.store_money_container.level)
        day_money_sum += store_money.store_money_container.level
    money_sum.append(day_money_sum)
print("每天商店的的营业额之和为:", money_sum)

理解:

1. env 的作用envsimpy.Environment 的一个实例,它管理模拟的时间流逝和事件的调度。所有与时间有关的操作,比如事件的等待、进程的执行,都是通过 env 来进行的。

2. Store_Money 包含一个 simpy.Container 实例 store_money_container。这个容器用于模拟商店中的金钱存储,它的所有操作(例如存储金钱和提取金钱)都依赖于 env,因为这些操作都是在模拟时间上进行的。

3. env.process(buy(env,store_money,lmd,avg_money)) 实际上是在模拟环境中注册了一个新的进程(即 buy 函数),这个进程会在模拟的时间内运行。这里, 不是直接使用 env 来调用 Store_Money 的方法,而是 env 通过 store_money.store_money_container.put(money) 间接影响了 Store_Money 的状态。env 确保了 Store_Money 中的 store_money_container 能在模拟时间内进行正确的操作。这是因为 store_money_container 是在 env 上下文中创建的,它的所有操作都与 env 的时间管理相关。

4. env.timeout(time) 是用来让模拟暂停 time 单位时间的操作。也就是说, 这一段时间在模拟中是直接就过去了(timeout了), 我们的其他动作(销售额增加没有花费时间). 但是在实际中, 是使用了timeout的时间, 实现了我们的动作. 

5. env.run(until = 60) 这里的时间单位主要考虑两个点,一个是我们的run是在hour里面进行的, 所以说这里的单位应该是min. 另外, 我们的平均人数是每个小时进入商店的平均人数, 然后在成成body_time的时候使用了/60,就变成了单位min的平均人数.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值