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中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Java序列化之serialVersionUID的用法解读

《Java序列化之serialVersionUID的用法解读》Java序列化之serialVersionUID:本文介绍了Java对象的序列化和反序列化过程,强调了serialVersionUID的作... 目录JavChina编程a序列化之serialVersionUID什么是序列化为什么要序列化serialV

python3中正则表达式处理函数用法总结

《python3中正则表达式处理函数用法总结》Python中的正则表达式是一个强大的文本处理工具,用于匹配、查找、替换等操作,在Python中正则表达式的操作主要通过内置的re模块来实现,这篇文章主要... 目录前言re.match函数re.search方法re.match 与 re.search的区别检索

JavaScript装饰器从基础到实战教程

《JavaScript装饰器从基础到实战教程》装饰器是js中一种声明式语法特性,用于在不修改原始代码的情况下,动态扩展类、方法、属性或参数的行为,本文将从基础概念入手,逐步讲解装饰器的类型、用法、进阶... 目录一、装饰器基础概念1.1 什么是装饰器?1.2 装饰器的语法1.3 装饰器的执行时机二、装饰器的

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

MySQL 中的 JSON_CONTAIN用法示例详解

《MySQL中的JSON_CONTAIN用法示例详解》JSON_CONTAINS函数用于检查一个JSON文档中是否包含另一个JSON文档,这篇文章给大家介绍JSON_CONTAINS的用法、语法、... 目录深入了解 mysql 中的 jsON_CONTAINS1. JSON_CONTAINS 函数的概述2

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础