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

相关文章

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Springboot中Jackson用法详解

《Springboot中Jackson用法详解》Springboot自带默认json解析Jackson,可以在不引入其他json解析包情况下,解析json字段,下面我们就来聊聊Springboot中J... 目录前言Jackson用法将对象解析为json字符串将json解析为对象将json文件转换为json

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close