simpy 10 分钟简介

今天把https://simpy.readthedocs.org/en/latest/simpy_intro/index.html里的简介搬运过来。


第一部分是安装。就一行命令就可以。

pip install simpy

第二部分是说的基本概念。

SimPy是一个离散事件仿真的库。所有活动组件(例如:汽车,用户)的行为都是用进程(processes)建模的。进程存活在环境(environment)中。进程和环境通过各自的事件(event)来交互。

这里有一个例子。

def car(env):
    while True:
        print('Start parking at %d' % env.now)
        parking_duration = 5
        yield env.timeout(parking_duration)

        print('Start driving at %d' % env.now)
        trip_duration = 2
        yield env.timeout(trip_duration)

这里定义了一个car进程,它在停车与开车之前切换。每次停车历时5s,开车历时2s。print语句就是打印它的状态和当前时间。(下面灰色的字都没啥用。)

这里定义了一个car进程,car需要一个Environment(env)才能创建新的事件。car的行为在死循环里描述的。它不会停止,它的作用是在执行到yield语句时,告诉模拟系统切换。当yield的语句执行完之后,模拟系统会恢复回这个函数。

这个car在停车跟开车之间轮换。他可以打印当前状态和时间(Environment.now)。它调用Environment.timeout()函数来创建一个timeout事件。这个事件描述car完成停车或者开车的时间。

当car的行为被建模好之后,我们可以创建一个car的实例来看看它是如果行动的。

>>> import simpy
>>> env = simpy.Environment()
>>> env.process(car(env))
<Process(car) object at 0x...>
>>> env.run(until=15)
Start parking at 0
Start driving at 5
Start parking at 7
Start driving at 12
Start parking at 14
我们首先需要创建一个Environment实例,然后把这个实例传给car函数。调用car函数,然后通过Environment.process()把它添加到Environment中。

最后,我们通过调用run函数开始模拟。

底下那5行是程序输出的结果。从0s时间开始,停车5s。然后从5s开始,开车2s,一直到15s的时候结束。


程序开始运行之后,这5行结果是瞬间打印出来的。并不需要等待15s。


待续。之后还有进程交互、共享资源的例子。


=====================================================

我看了下SimPy的源码,所有的文件加起来也没超过100kb,而且代码有很多是注释,所以应该可以全看。

可以做的工作有:一些它的功能扩展,或者把它改写成c++版。

04-03
### SimPy 的使用教程 SimPy 是一种用于离散事件仿真的 Python 库,它允许用户通过进程交互来模拟复杂的系统行为。以下是关于 SimPy 的一些核心概念及其应用。 #### 安装方法 由于某些环境可能无法直接通过 `conda` 安装 SimPy[^3],因此可以按照以下方式手动安装: 1. 从指定的百度网盘下载链接获取本地包。 2. 解压后,在命令行工具中切换到解压后的文件夹位置。 3. 执行以下命令完成安装: ```bash pip install simpy-3.0.11.tar.gz ``` #### 基本概念 在 SimPy 中,仿真过程主要由以下几个部分组成: - **Environment**: 表示仿真环境的核心对象,所有的仿真活动都在此环境中发生。 - **Process**: 进程表示仿真中的实体或参与者,它们可以通过延迟、等待等方式与其他进程互动。 - **Resources**: 资源类提供了对共享资源的竞争机制支持,例如服务器容量有限的情况。 #### 示例代码 下面是一个简单的例子,展示如何使用 SimPy 创建一个生产者消费者模型: ```python import simpy def producer(env, resource): while True: yield env.timeout(1) # 生产间隔时间 with resource.request() as req: yield req print(f'Producer produced at {env.now}') yield env.timeout(0.5) # 处理时间 def consumer(env, resource): while True: with resource.request() as req: yield req print(f'Consumer consumed at {env.now}') yield env.timeout(2) # 消费间隔时间 # 初始化仿真环境 env = simpy.Environment() resource = simpy.Resource(env, capacity=1) # 启动生产和消费进程 env.process(producer(env, resource)) env.process(consumer(env, resource)) # 开始仿真 env.run(until=10) ``` 上述代码定义了一个简单场景:生产者每隔一段时间向资源池提交请求;而消费者则会尝试消耗该资源。整个过程中涉及到了资源竞争和同步操作。 #### 符号计算与 SymPy 配合 如果需要将符号表达式引入仿真逻辑,则可借助于 SymPy 来构建动态方程式组。例如,假设某设备的工作效率随负载变化呈非线性关系,可以用 Symbol 类型变量描述其特性函数[^2]: ```python from sympy import symbols, Eq, solve load, efficiency = symbols('load efficiency') eq = Eq(efficiency, (1 / load)**2 * 100) # 效率公式 solution = solve(eq.subs(load, 5), efficiency)[0] print(f"Efficiency under a load of 5 is {solution}") ``` 这样就可以把解析得到的结果嵌入到 SimPy 的仿真流程里去调整参数或者评估性能指标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值