2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛

B题 城市轨道交通列车时刻表优化问题

原题再现:

  列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。列车时刻表规定了列车在每个车站的到达和出发(或通过)时刻,其在实际运用过程中,通常用列车运行图来表示。图1为某一运行图的示例,图中每一条线表示一趟列车,横轴表示车站,纵轴表示时间,每一条线反映了一趟列车在不同时刻所处的相对位置,也称为运行线。比如,图中红色运行线表示,列车于9:02分从D站出发,于9:05分到达C站,停留1分钟后出发,于9:09分到达B站,停留1分钟后出发,于10:03分到达A站。
在这里插入图片描述
  实际运营中,在铺画列车运行图之前,首先得先确定列车开行方案,列车开行方案包括列车编组方案、列车停站方案和列车交路计划三部分。
  列车编组方案规定了列车的车型和编组数量(即列车的节数),在本问题中采用统一的车型和编组数量。
  列车停站方案是规定列车在哪些站点停站的方案,在本问题中均采用站站停的停站方案(即列车在每个经过的车站都会停车)。
  列车交路计划是指列车在规定的运行线路上往返运行的方式,即规定了列车在哪些站点之间运行以及开行的数量。大小交路模式是城轨运营中常用的交路模式,是指城市轨道交通运行线路的长短区间。通俗讲,大交路是指列车跑完全程,小交路是指将全程中的某两个站作为临时起点或终点来跑,需要注意的是,只有具有折返能力的车站(能让列车调头的车站)才能作为交路的起点或终点。图2为某大小交路方案示意图,表示以A站为起点的,D站为终点大交路区间开行10对列车,以A站为起点,C站为终点小交路区间开行5对列车。
  在大小交路方案中,大小交路列车开行列数通常为1:n或n:1两种模式,即每开行n列大(小)交路列车后,开行一列小(大)交路列车,并且小交路所经过的车站数量需有一定限制:小交路区间过短会导致列车的折返频繁,使运营成本增加;小交路区间过长则无法体现大小交路运营模式的作用。
在这里插入图片描述
  在大小交路的运营模式下,乘客通常会被分为6种类型,如图3所示,
其中𝑠1 −𝑠n为大交路区间,𝑠a −𝑠b为小交路区间。
  第Ⅰ,Ⅱ,Ⅲ类乘客起点均位于[𝑠1 , 𝑠a ],终点无论位于哪个区间,乘客都只能乘坐大交路列车。
  第Ⅳ,Ⅴ类乘客起点均位于[𝑠a , 𝑠b ]。其中第Ⅳ类乘客终点位于[𝑠a , 𝑠b ],乘客既可乘坐大交路列车,也可乘坐小交路列车;第Ⅴ类乘客终点位于[𝑠b ,𝑠n ],乘客可以乘坐小交路列车之后到𝑠b进行换乘,也可直接乘坐大交路列车。
  第Ⅵ类乘客起点位于[𝑠b , 𝑠n ],终点位于[𝑠b , 𝑠n ],乘客只能乘坐大交路列车。
在这里插入图片描述
  在列车开行方案的制定中,需要以最小的企业运营成本和最大的服务
水平(乘客在车时间和乘客等待时间)来满足客流的需求,企业的运营成本包括固定成本(所需车辆的数量)和变动成本(列车总走行公里)两部分组成。受到车站通过能力的制约和服务水平的要求,在一定时间内,列车的发车数量也有一定的限制。
  在制定好列车开行方案后,可根据该方案同样以企业运营成本最小化
和服务水平最大化为目标铺画列车运行图,即确定每趟列车的出发和到达的具体时刻。现有的列车时刻表通常为等间隔的平行运行图,即发车间隔(如每5分钟开行一趟列车)和在同一站点的停站时间相等。发车间隔的长短会有一定的限制:发车间隔过短,则会影响列车运行的安全;发车间隔过长,则会增长乘客的平均等待时间,从而影响服务水平。同样地,停站时间也需受到一定限制,一般来说列车在车站的停站时间正比于在该站上、下车的乘客数量。另外,需要注意的是,两列车在同一区间追踪运行时,需保留一定的安全间隔(追踪间隔时间)。
  采用大小交路运营模式的列车运行图,大交路列车和小交路列车一般
会交替开行,比如当大交路列车与小交路列车的比例为2:1时,则会以每3 列车为一个组合(前 2 列车为大交路列车,第三列车为小交路列车)滚动发车。
  在下列问题中,只需制定单向的列车时刻表即可。
  问题一:在满足客流需求的条件下,以企业运营成本最小化和服务水平最大化为目标,制定列车开行方案。即确定大交路区间列车的开行数量,小交路的运行区间以及开行数量。(输出格式详见附件6)
  问题二:在问题一制定的列车开行方案下,同样以企业运营成本最小化和服务水平最大化且尽量满足客流需求为目标,制定等间隔的平行运行图。(输出格式详见附件7,并将附件7单独上传到竞赛系统中)
  问题三:对于降低企业运营成本和提高服务水平,你们团队有哪些好的方法或建议?基于客流和车站数据,提供相应的量化分析支持。
  输入输出数据:
  所给数据为某实际轨道交通线路的真实数据,沿途共有30座车站,客流数据的时段为7:00 - 8:00。数据详见附件。
  附件1:车站数据.xlsx
  附件2:区间运行时间.xlsx
  附件3:OD客流数据.xlsx
  附件4:断面客流数据.xlsx
  附件5:其他数据.xlsx
  附件6:问题一输出示例.xlsx
  附件7:问题二输出示例.xlsx

整体求解过程概述(摘要)

  随着城市化进程的加快,轨道交通成为人们出行的重要一环。列车运营商在提高服务水平的同时,为尽可能的降低列车的运营成本,则需要对列车的开行方案进行优化。本文利用提供的数据,针对目前的问题,做出以下工作:
  针对问题一:在满足客流需求的情况下,为达到企业运营成本最小和服务水平最高。首先,对提供的数据进行处理,得到每个时段的客流量和列车基本参数。其次,以运营成本和服务水平为优化目标,建立多元优化模型。其中运营成本和服务水平展开为:车辆成本、车辆里程、运营成本和车辆运行时间、乘客等待时间、乘客出行成本、乘车舒适度七个权重不同的相关因素。最后使用优化GA-SA(遗传-模拟退火)算法结合约束条件,求解开行方案为:大交路(1-30车站)开行列数为9、小交路(5-14站)开行列数为4、小交路(8-14站)开行列数为4、小交路(8-17站)开行列数为3、小交路(10-14站)开行列数为6和小交路(14-22站)开行列数为8并以图例展示。
  针对问题二,在问题一求解的开行方案下,为达到企业运营成本最小和服务水平最高。首先,确定开行方案中的车辆里程。其次,以运营成本和服务水平为优化目标,建立多元优化模型。其中运营成本和服务水平展开为:每站发车时间、每站到达时间、每站停车时间以及追踪间隔时间等权重不同的相关因素。同样采用优化GA-SA(遗传-模拟退火)算法结合约束条件,求解列车平行时刻表,如:小交路(10-14站),第一辆列车于7:00:00时从10起点站出发,于7:01:36到达11站,停留02:19后出发,于7:05:09 到达12站,停留01:15后出发,于7:08:37到达13站,停留01:14后出发,于7:11:13到达14终点站。并以平行运营图展示。
  针对问题三,为进一步降低企业运营成本和提高服务水平。根据数据可得,不同时间段的客流量差异巨大。以此为依据,从发车间隔、停站时间动态调整、列车站点起/终点优化出发,设定客流量阈值,将其划分为客流高峰、中峰和低峰时段,做出优化如下:
  (1) 发车间隔:客流高峰6分钟、中峰10分钟和低峰时段15分钟;
  (2) 停战时间:客流高峰110s、中峰74s和低峰时段15s;
  (3) 起/终点列车:车站6、7、11设置为起始车站、车站27设置为非起始车站;得到了进一步降低企业运营成本和提高服务水平的开行方案。
  最后,提出采用先进技术、加强客流管理等建立以及对模型进行了评价。

模型假设:

  假设1:车辆在运行时不会发生交通事故。
  假设2:无论在车站还是区间,都不允许列车发生越行或避让。
  假设3:乘客在上车时遵守规则。
  假设4:本文中车次的区间运行时分和车站停站时分均是提前给定好的。
  假设5:车站中的基础设施不存在损耗。
  假设6:列车编组固定后不再改变。
  假设7:列车在行驶路线中匀速行驶。

问题分析:

  问题一中提出,在满足客流需求的条件下,以企业运营成本最小化和服务水平最大化为目标,制定列车开行方案。首先结合问题和实际,将影响企业运营成本和影响服务水平的主要因素提取出。建立多目标优化模型,对问题一进行求解。

  问题二要求在问题一制定的列车开行方案下,同样以企业运营成本最小化和服务水平最大化且尽量满足客流需求为目标,制定等间隔的平行运行图。与问题二不同的是,问题一中满足客流量需求是前提条件,问题一中制定的方案必须满足客流量的需求,问题二中要求尽量满足客流量的需求。因此结合问题一中的基于多元优化的SA-NA模型,将设置满足客流量的目标函数,将其输出的结果赋予较高的权重。最后任然使用加权平均的方式来制定出等间隔运行图。

  问题三中提出,提出相关建议以及方法,以更好的降低企业运营成本和提高服务水平,同时基于客流和车站数据,提供相应的量化分析支持。结合第一,第二问建立的多目标优化模型以及结合对实际生活中列车发车的观察,我们提出了如下建议:
  1.动态调整发车间隔
  2.优化列车停站方案
  3.优化列车起始点

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

import numpy as np
 import matplotlib.pyplot as plt
 # Read data from file
 import pandas as pd
 import numpy as np
 # 读取Excel文件
df = pd.read_excel('附件 3:OD 客流数据.xlsx', sheet_name='Sheet1', header=None)
 # 将DataFrame 转换为NumPy数组
df = df.fillna(0)
 data = df.to_numpy()[1:, 1:]
 num_stations = len(data)
 # Calculate the total number of passengers getting on/off at each station
 passengers_get_on = np.sum(data, axis=1)
 passengers_get_off = np.sum(data, axis=0)
 # Create x-axis values (stations) and y-axis values (passengers)
 x =np.arange(num_stations) + 1
 y_get_on = passengers_get_on
 y_get_off =-passengers_get_off # 将负数转为正数,后面在y轴上显示负号
plt.rcParams['font.size'] = 14
 # Plot the data
 plt.rcParams['font.family'] = 'SimHei'
 plt.plot(x, y_get_on, label='上车')
 plt.plot(x, y_get_off, label='下车')
 #Add labels and legend
 plt.xlabel('车站')
 plt.ylabel('人数')
 plt.title('每个车站上下车人数')
 plt.legend()
 #Add minus sign to y-axis ticks
 plt.gca().yaxis.set_tick_params(which='both', direction='in')
plt.gca().yaxis.set_ticklabels([f'{abs(tick):.0f}' if tick != 0 else '0' for tick in
 plt.gca().get_yticks()])
 plt.gca().yaxis.get_ticklabels()[0].set_horizontalalignment('left')
 plt.gca().yaxis.get_ticklabels()[-1].set_horizontalalignment('right')
 plt.gca().yaxis.get_ticklabels()[int(len(plt.gca().get_yticks())/2)].set_horizontalalignment('cent
 er')
 plt.gca().yaxis.get_ticklabels()[int(len(plt.gca().get_yticks())/2)].set_verticalalignment('botto
 m')
 plt.gca().yaxis.get_ticklabels()[-1].set_verticalalignment('bottom')
 # Showthe plot
 plt.show()
import matplotlib.pyplot as plt
 plt.rcParams['font.family'] = 'SimHei'
 # 定义车站类型
stations = {
 1: 'square',
 2: 'square',
 3: 'circle',
 4: 'circle',
 5: 'square',
 6: 'circle',
 7: 'circle',
 8: 'square',
 9: 'circle',
 10: 'square',
 11: 'circle',
 12: 'circle',
 13: 'circle',
 14: 'square',
 15: 'circle',
 16: 'circle',
 17: 'square',
 18: 'square',
 19: 'circle',
 20: 'circle',
 21: 'square',
 22: 'square',
 23: 'circle',
 24: 'circle',
 25: 'square',
 26: 'square',
 27: 'square',
 28: 'circle',
 29: 'circle',
 30: 'square'
 }
 # 定义车站之间的连接关系
connections = [
 (1, 2), (2, 5), (5, 8), (8, 10), (10, 14), (14, 17), (17, 18),
 (18, 21), (21, 22), (22, 25), (25, 26), (26, 27), (27, 30)
 ]
 # 绘制图像
fig, ax = plt.subplots(figsize=(10, 5))
 for i in range(1, 31):
 if stations[i] == 'square':
 ax.scatter(i, 0, marker='s', s=300, color='black')
 else:
 ax.scatter(i, 0, marker='o', s=300, color='gray')
 for c in connections:
 ax.plot([c[0], c[1]], [0, 0], linewidth=5, color='blue')
 ax.scatter(24, 0.8, marker='s', s=200, color='black')
 ax.text(25, 0.8, '可作为起点/终点', fontsize=12, color='black')
 ax.scatter(24, 0.6, marker='o', s=200, color='gray')
 ax.text(25, 0.6, '不可作为起点/终点', fontsize=12, color='black')
 ax.set_xlim([0, 31])
 ax.set_ylim([-1, 1])
 ax.set_xticks(range(1, 31))
 ax.set_yticks([])
 ax.set_title('车站示意图')
 ax.tick_params(labelsize=14)
 plt.show()
import pandas as pd
 # 假设您已经将文件读取到了以下数据框中
station_data = pd.read_excel("附件 1:车站数据.xlsx")
 section_time_data = pd.read_excel("附件 2:区间运行时间.xlsx")
 od_data = pd.read_excel("附件 3:OD 客流数据.xlsx")
 section_flow_data = pd.read_excel("附件 4:断面客流数据.xlsx")
 other_data = pd.read_excel("附件 5:其他数据.xlsx")
 # 提取车站间距离数据
 station_distances = {}
 for i, row in section_time_data.iterrows():
 section = f"车站{i+1}->车站{i+2}"
 station_distances[section] = row["站间距/km"]
 # 提取区间运行时间数据
section_times = {}
 for i, row in section_time_data.iterrows():
 section = f"车站{i+1}->车站{i+2}"
 section_times[section] = row["区间运行时间/s"]
 # 提取OD客流数据
od_matrix = od_data.to_numpy()
 # 提取断面客流量数据
section_flow = {}
 for i, row in section_flow_data.iterrows():
 section = f"车站{i+1}->车站{i+2}"
 section_flow[section] = row["断面客流量/人"]
 # 提取其他数据
min_max_departure_interval = [120, 360]
 min_tracking_interval = 108
 min_max_station_stay_time = [20, 120]
 train_capacity = 1860
 min_max_small_circuit_stations = [3, 24]
 avg_boarding_alighting_time = 0.04
 def decode_individual(individual):
 big_circuit_start = max(1, int(individual[0]))
 big_circuit_end = int(individual[1])
 small_circuit_start = max(1, int(individual[2]))
 small_circuit_end = int(individual[3])
 while big_circuit_end <= big_circuit_start or small_circuit_end <= small_circuit_start:
 big_circuit_start = max(1, int(individual[0]))
 big_circuit_end = int(individual[1])
 small_circuit_start = max(1, int(individual[2]))
 small_circuit_end = int(individual[3])
 big_circuit_distance = sum(station_distances[f"车站{i}->车站{i+1}"] for i in
 range(big_circuit_start, big_circuit_end + 1))
 small_circuit_distance = sum(station_distances[f"车站{i}->车站{i+1}"] for i in
 range(small_circuit_start, small_circuit_end + 1))
 solution = {
 '大交路': {
 '运行区间':(big_circuit_start, big_circuit_end),
 '运营里程':big_circuit_distance,
 '开行数量':individual[4]
 },
 '小交路': {
 '运行区间':(small_circuit_start, small_circuit_end),
 '运营里程':small_circuit_distance,
 '开行数量':individual[5]
 }
 }
 return solution
 def calculate_service_level(solution):
 big_circuit_start, big_circuit_end = solution['大交路']['运行区间']
 small_circuit_start, small_circuit_end = solution['小交路']['运行区间']
 big_circuit_service = od_matrix.iloc[big_circuit_start- 1:big_circuit_end,
 big_circuit_start- 1:big_circuit_end].sum().sum()
 small_circuit_service = od_matrix.iloc[small_circuit_start- 1:small_circuit_end,
 small_circuit_start- 1:small_circuit_end].sum().sum()
 service_level = (big_circuit_service + small_circuit_service) / total_passenger_flow
 return service_level
 def objective_function(individual):
 solution = decode_individual(individual)
 if solution is None:
 return float('inf'), float('-inf') # 如果解决方案为空(不满足限制条件),返回
极大的成本和极小的服务水平
big_circuit = solution['大交路']
 small_circuit = solution['小交路']
 # 计算成本
big_circuit_cost = big_circuit['运营里程'] * big_circuit['开行数量']
 small_circuit_cost = small_circuit['运营里程'] * small_circuit['开行数量']
 cost = big_circuit_cost + small_circuit_cost
 # 计算服务水平
service_level = calculate_service_level(solution)
return cost, service_level
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大&#xff0c;也被企业广泛采用&#xff0c;然后也存着在诸如学习曲线陡峭&#xff0c;上手难度大&#x…

构建SSH僵尸网络

import argparse import paramiko# 定义一个名为Client的类&#xff0c;用于表示SSH客户端相关操作 class Client:# 类的初始化方法&#xff0c;接收主机地址、用户名和密码作为参数def __init__(self, host, user, password):self.host hostself.user userself.password pa…

小白快速上手 labelme:新手图像标注详解教程

前言 本教程主要面向初次使用 labelme 的新手&#xff0c;详细介绍了如何在 Windows 上通过 Anaconda 创建和配置环境&#xff0c;并使用 labelme 进行图像标注。 1. 准备工作 在开始本教程之前&#xff0c;确保已经安装了 Anaconda。可以参考我之前的教程了解 Anaconda 的下…

AB矩阵秩1乘法,列乘以行

1. AB矩阵相乘 2. 代码测试 python 代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # FileName :ABTest.py # Time :2024/11/17 8:37 # Author :Jason Zhang import numpy as np from abc import ABCMeta, abstractmethodnp.set_printoptions(suppressTrue, pr…

JS学习日记(jQuery库)

前言 今天先更新jQuery库的介绍&#xff0c;它是一个用来帮助快速开发的工具 介绍 jQuery是一个快速&#xff0c;小型且功能丰富的JavaScript库&#xff0c;jQuery设计宗旨是“write less&#xff0c;do more”&#xff0c;即倡导写更少的代码&#xff0c;做更多的事&#xf…

stm32下的ADC转换(江科协 HAL版)

十二. ADC采样 文章目录 十二. ADC采样12.1 ADC的采样原理12.2 STM32的采样基本过程1.引脚与GPIO端口的对应关系2.ADC规则组的四种转换模式(**)2.2 关于转换模式与配置之间的关系 12.3 ADC的时钟12.4 代码实现(ADC单通道 & ADC多通道)1. 单通道采样2. 多通道采样 19.ADC模数…

124. 二叉树中的最大路径和【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 124. 二叉树中的最大路径和 一、题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径…

【安全科普】NUMA防火墙诞生记

一、我为啥姓“NUMA” 随着网络流量和数据包处理需求的指数增长&#xff0c;曾经的我面对“高性能、高吞吐、低延迟”的要求&#xff0c;逐渐变得心有余而力不足。 多CPU技术应运而生&#xff0c;SMP&#xff08;对称多处理&#xff09;和NUMA&#xff08;非一致性内存访问&a…

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点&#xff0c;博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体&#xff0c;Blog站点所形成的网状结构促成了不同于以往社区的Blog文化&#xff0c;Blog技术缔造了“博客”文化。本文课题研究的“…

数字IC后端实现之Innovus specifyCellEdgeSpacing和ICC2 set_placement_spacing_rule的应用

昨天帮助社区IC训练营学员远程协助解决一个Calibre DRC案例。通过这个DRC Violation向大家分享下Innovus和ICC2中如何批量约束cell的spacing rule。 数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案 下图所示为T12nm A55项目的Ca…

IntelliJ+SpringBoot项目实战(七)--在SpringBoot中整合Redis

Redis是项目开发中必不可少的缓存工具。所以在SpringBoot项目中必须整合Redis。下面是Redis整合的步骤&#xff1a; &#xff08;1&#xff09;因为目前使用openjweb-sys作为SpringBoot的启动应用&#xff0c;所以在openjweb-sys模块的application-dev.yml中增加配置参数&…

深挖C++赋值

详解赋值 const int a 10; int b a;&a 0x000000b7c6afef34 {56496} &a 0x000000b7c6afef34 {10} 3. &b 0x000000b7c6afef54 {10} 总结&#xff1a; int a 10 是指在内存中&#xff08;栈&#xff09;中创建一个int &#xff08;4 byte&#xff09;大小的空间…

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器&#xff08;Program Counter Register&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;它在 JVM 的内存模型中扮演着非常…

11.12机器学习_特征工程

四 特征工程 1 特征工程概念 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 …

STL序列式容器之list

相较于vector的连续性空间&#xff0c;list相对比较复杂&#xff1b;list内部使用了双向环形链表的方式对数据进行存储&#xff1b;list在增加元素时&#xff0c;采用了精准的方式分配一片空间对数据及附加指针等信息进行存储&#xff1b; list节点定义如下 template<clas…

算法日记 26-27day 贪心算法

接下来的题目有些地方比较相似。需要注意多个条件。 题目&#xff1a;分发糖果 135. 分发糖果 - 力扣&#xff08;LeetCode&#xff09; n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每…

Linux下编译MFEM

本文记录在Linux下编译MFEM的过程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1Boost1.74.0oneAPI2024.2.1 一、安装依赖 二、编译代码 附录I: CMakeUserPresets.json {"version": 4,"configurePresets": [{&quo…

Pytest-Bdd-Playwright 系列教程(9):使用 数据表(DataTable 参数) 来传递参数

Pytest-Bdd-Playwright 系列教程&#xff08;9&#xff09;&#xff1a;使用 数据表&#xff08;DataTable 参数&#xff09; 来传递参数 前言一、什么是 datatable 参数&#xff1f;Gherkin 表格示例 二、datatable 参数的基本使用三、完整代码和运行效果完整的测试代码 前言 …

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…

使用 Prompt API 与您的对象聊天

tl;dr&#xff1a;GET、PUT、PROMPT。现在&#xff0c;可以使用新的 PromptObject API 仅使用自然语言对存储在 MinIO 上的对象进行总结、交谈和提问。在本文中&#xff0c;我们将探讨这个新 API 的一些用例以及代码示例。 赋予动机&#xff1a; 对象存储和 S3 API 的无处不在…