当前位置: 首页 > news >正文

simpy仿真

模拟服务台

一共5个顾客,2个服务台

import simpy
import randomdef customer(env, name, service_time_mean):arrival_time = env.nowprint(f'{arrival_time}: {name} 到达服务台,开始排队')with server.request() as req:yield reqwait_time = env.now - arrival_timeprint(f'{env.now}: {name} 开始接受服务,等待了 {wait_time} 时间')yield env.timeout(random.expovariate(1 / service_time_mean))print(f'{env.now}: {name} 服务完成')# 创建仿真环境
env = simpy.Environment()
# 创建服务台资源,容量为 1
server = simpy.Resource(env, capacity=2)
# 启动多个顾客的到达和服务进程
for i in range(5):arrival_interval = random.expovariate(1 / 2)  # 平均到达间隔为 2env.process(customer(env, f'顾客 {i}', 3))  # 平均服务时间为 3env.timeout(arrival_interval)
# 运行仿真
env.run()

模拟车辆

import simpy# 定义车辆行为
def vehicle(env, name, speed, total_distance, positions):position = 0  # 初始位置print(f"Time {env.now:.2f}: 车辆 {name} 从起点出发")while position < total_distance:# 检查前方是否有车辆front_vehicle_position = Nonefor pos in positions.values():if pos > position and (front_vehicle_position is None or pos < front_vehicle_position):front_vehicle_position = pos# 根据前方车辆调整速度if front_vehicle_position is not None and front_vehicle_position - position <= speed:move_distance = front_vehicle_position - position - 1  # 禁止超车,保持最小间距move_distance = max(move_distance, 0)  # 确保移动距离非负else:move_distance = speed# 如果没有移动距离,则等待一段时间再检查if move_distance == 0:yield env.timeout(0.1)  # 等待 0.1 秒后重新检查continue# 计算到达下一位置的时间time_to_move = move_distance / speedlast_position = position  # 记录上一位置start_time = env.now      # 记录开始时间# 按照较小的时间步实时打印位置while env.now - start_time < time_to_move:elapsed_time = env.now - start_timecurrent_position = last_position + (elapsed_time * speed)if current_position > position + move_distance:  # 防止超出目标位置breakpositions[name] = current_positionprint(f"Time {env.now:.2f}: 车辆 {name} 当前位置: {current_position:.2f}")yield env.timeout(0.1)  # 每 0.1 秒更新一次# 更新最终位置position += move_distanceif position > total_distance:  # 防止超出终点position = total_distanceprint(f"Time {env.now:.2f}: 车辆 {name} 到达终点")del positions[name]  # 到达终点后移除该车辆# 模拟函数
def simulate_vehicle_traffic(env, num_vehicles, speed, total_distance, start_interval):positions = {}  # 记录所有车辆的位置for i in range(num_vehicles):# 每辆车按顺序发车,发车间隔为 start_intervalyield env.timeout(i * start_interval)env.process(vehicle(env, i + 1, speed, total_distance, positions))# 主程序
if __name__ == "__main__":# 参数设置num_vehicles = 4       # 车辆数量speed = 4              # 每辆车的速度(单位/秒)total_distance = 20    # 路程长度(单位)start_interval = 2      # 每辆车的发车间隔(秒)# 初始化模拟环境env = simpy.Environment()# 启动模拟env.process(simulate_vehicle_traffic(env, num_vehicles, speed, total_distance, start_interval))# 运行模拟直到所有车辆到达终点env.run()


http://www.mrgr.cn/news/98129.html

相关文章:

  • 第十六届蓝桥杯大赛软件赛省赛 Python 大学 B 组 部分题解
  • ChatRex: Taming Multimodal LLM for Joint Perception and Understanding 论文理解和翻译
  • 电感、互感器、变压器和磁珠综合对比——《器件手册--电感/线圈/变压器/磁珠篇》
  • 如何优化多线程上下文切换?
  • Webpack中的文件指纹:给资源戴上个“名牌”
  • ”插入排序“”选择排序“
  • 【unity游戏开发介绍之UGUI篇】UGUI概述和基础使用
  • 蓝桥杯嵌入式考前模块总结
  • 四月第二周C++,信息学,洛谷,字符串
  • STM32HAL库学习笔记
  • 【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈实现单一删除图书、批量删除图书接口
  • PowerBI 条形图显示数值和百分比
  • 行星际激波数据集 (2023)
  • conda如何安装和运行jupyter
  • 后端面试问题收集以及答案精简版
  • 十二、C++速通秘籍—静态库,动态库
  • 【sgSpliter】自定义组件:可调整宽度、高度、折叠的分割线
  • 用infoNCE微调Embedding模型
  • 十四种逻辑器件综合对比——《器件手册--逻辑器件》
  • qt pyqt5的开发, 修改psd图像