Simpy基础系列——基础Resource对象的用法

2023-12-25 07:12

本文主要是介绍Simpy基础系列——基础Resource对象的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 案例背景
  • 示例代码
    • request & release 的形式
    • with 的形式


案例背景

在用simpy仿真过程中,有些对象具有竞争性和排他性,在实际中往往称为资源,例如原材料(接近)无穷,而产能有限的情况下,生产设备就被视为资源。在仿真环境中,可以把这种容量有限,具有竞争性的资源建模为 R e s o u r c e Resource Resource 对象,当资源被占满时,请求服务的对象只能进行等待,当资源有空缺时,才会对请求服务的对象进行处理。

假设现有一个充电站,充电站内只有两个充电桩,当有电动车来充电时,有空闲的充电桩则可立马充电,若无则需要进行等待,直至有充电桩可用,其中,等待充电的电动车按先到先服务的原则,按序占用空闲出来的充电桩。

示例代码

request & release 的形式

在simpy中,我们将上述例子中的充电站建模为 s i m p y . R e s o u r c e simpy.Resource simpy.Resource 对象,容量设置为2(充电桩2个,可同时为两辆电动车充电),示例中我们假设每2个单位时间来1辆电动车,电动车充电需要5个单位时间,代码如下:

import simpyclass City(object):def __init__(self, env, num_bcs, num_car):self.env = envself.bcs = simpy.Resource(env, capacity=num_bcs)for i in range(num_car):env.process(self.car(name='%d号车' % i,driving_time=i * 2,charge_duration=5))def car(self, name, driving_time, charge_duration):yield self.env.timeout(driving_time)print('%s 到达充电装桩 %d' % (name, self.env.now))req = self.bcs.request()yield reqprint('%s 开始充电 %s' % (name, self.env.now))yield self.env.timeout(charge_duration)print('%s 充电完成 %s' % (name, self.env.now))self.bcs.release(req)env = simpy.Environment()
city = City(env, num_car=4, num_bcs=2)
env.run()

上述代码船创建了4辆电动车对象,并为每辆电动车创建一个 Process 事件,分别对应4个事件生成器 car(),生成器的逻辑为:当电动车到达充电站时,会向充电站发出请求 request(),当请求得到回应,说明充电站有空闲充电桩,此时该电动车占用一个充电桩,仿真时间向前推进充电时长,充电结束后将请求释放,此时电动车离开充电桩,原本占用的充电桩被释放,等待下一个电动车来占用。

with 的形式

另一种更加紧凑的方式,就是用 with 来替代,这种形式更加常用

import simpyclass City(object):def __init__(self, env, num_bcs, num_car):self.env = envself.bcs = simpy.Resource(env, capacity=num_bcs)for i in range(num_car):env.process(self.car(name='%d号车' % i,driving_time=i * 2,charge_duration=5))def car(self, name, driving_time, charge_duration):yield self.env.timeout(driving_time)print('%s 到达充电装桩 %d' % (name, self.env.now))with self.bcs.request() as req:yield reqprint('%s 开始充电 %s' % (name, self.env.now))yield self.env.timeout(charge_duration)print('%s 充电完成 %s' % (name, self.env.now))env = simpy.Environment()
city = City(env, num_car=4, num_bcs=2)
env.run()

这种 with 形式与前一种形式的区别是不用额外对请求进行释放,有点类似于用 with 打开文件而不必把文件进行 close 的逻辑一样。这里电动车到达充电站之后,发出充电请求,当请求被响应时,电动车占用充电桩,仿真时间向前推进(充电时长),结束后自动释放 request,完成充电。

两种形式的代码是等价的,运行后打印的结果为:

0号车 到达充电装桩 0
0号车 开始充电 0
1号车 到达充电装桩 2
1号车 开始充电 2
2号车 到达充电装桩 4
0号车 充电完成 5
2号车 开始充电 5
3号车 到达充电装桩 6
1号车 充电完成 7
3号车 开始充电 7
2号车 充电完成 10
3号车 充电完成 12

这篇关于Simpy基础系列——基础Resource对象的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/534648

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

Mysql中isnull,ifnull,nullif的用法及语义详解

《Mysql中isnull,ifnull,nullif的用法及语义详解》MySQL中ISNULL判断表达式是否为NULL,IFNULL替换NULL值为指定值,NULLIF在表达式相等时返回NULL,用... 目录mysql中isnull,ifnull,nullif的用法1. ISNULL(expr) → 判