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

news2024/11/14 23:02:55

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名片即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

07-案例-图书管理

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

vue 依赖注入(Provide、Inject )和混入(mixins)

Prop 逐级透传问题​ 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。想象一下这样的结构&#xff1a;有一些多层级嵌套的组件&#xff0c;形成了一棵巨大的组件树&#xff0c;而某个深层的子组件需要一个较远的祖先组件中的部分数据。…

九州未来再度入选2024边缘计算TOP100

随着数智化转型的浪潮不断高涨&#xff0c;边缘计算作为推动各行业智能化升级的重要基石&#xff0c;正在成为支持万物智能化的关键点。近日&#xff0c;德本咨询(DBC)联合《互联网周刊》(CIW)与中国社会科学院信息化研究中心(CIS)&#xff0c;共同发布《2024边缘计算TOP100》榜…

git相关知识

前言&#xff1a;在学习git之前首先需要了解几个概念&#xff1a;工作区&#xff0c;暂存区&#xff0c;版本库。 工作区&#xff1a;是电脑上写代码或者文件的目录。 暂存区&#xff1a;一般存放在.git目录下的index中&#xff0c;也称索引。&#xff08;git add&#xff09…

应用程序部署(IIS的相关使用,sql server的相关使用)

数据服务程序&#xff08;API&#xff09;部署 1、修改配置文件 打开部署包中的web.config配置文件&#xff0c;确认数据库登录名和密码正确 修改ip为电脑IP&#xff08;winR输入cmd&#xff0c;输入ipconfig&#xff0c;IPv4对应的就是本机IP&#xff09; 2、打开IIS&#x…

conda和conda的常用命令

目录 一、什么是conda 1. conda的定义和作用 2. conda的特点 3. conda与pip的区别 二、conda的常用命令 1. 环境管理 2.包管理 3. 查看信息 4. 清理和维护 5. 频道(channel)管理 6. 导出和复制环境 7. 加速相关(镜像) 一、什么是conda 1. conda的定义和作用 2. co…

mysql每日一题(上升的温度,date数据的计算)

日期之间的运算 日期类型的加法运算 data_add(now_data,interval 1 month) select date_add(now(), interval 1 day); -- 加1天 select date_add(now(), interval 1 hour); -- 加1小时 select date_add(now(), interval 1 minute); -- 加1分钟 select date_add(now(), inter…

kafka生产经验——消费者事务

如果想完成Consumer端的精准一次性消费&#xff0c;那么需要Kafka消费端将消费过程和提交offset 过程做原子绑定。此时我们需要将Kafka的offset保存到支持事务的自定义介质&#xff08;比 如MySQL&#xff09;。这部分知识会在后续项目部分涉及。 事务的四大特征&#xff1a;AC…

2024 年 Apifox 和 Postman 对比介绍详细版

Apifox VS Postman &#xff0c;当下流行的的两款 API 开发工具&#xff0c;2024 版对比&#xff01;

Rust @绑定(Rust@绑定)(在模式匹配的同时将值绑定到变量)

文章目录 Rust中的绑定基础概念示例&#xff1a;基本模式匹配 绑定的使用示例&#xff1a;范围匹配并绑定变量 深入探索绑定的好处示例&#xff1a;复杂数据结构中的应用 总结 附加 Rust中的绑定 Rust 语言以其强类型系统和内存安全的特性著称。在进行模式匹配时&#xff0c;R…

可靠UDP协议(KCP)使用说明

希望这篇文章&#xff0c;对学习和使用 KCP 协议的读者&#xff0c;有帮助。 1. KCPUDP 流程图 2. 示例代码&#xff08;待补充&#xff09; #include <iostream>int main() {// TODO: kcp examplereturn 0; }

《Python网络安全项目实战》项目4 编写网络扫描程序

《Python网络安全项目实战》项目4 编写网络扫描程序 项目4 编写网络扫描程序任务4.1 扫描内网有效IP地址任务描述任务分析任务实施任务拓展 任务4.2 编写端口扫描工具任务描述任务分析任务实施相关知识任务评价任务拓展项目评价 项目4 编写网络扫描程序 许多扫描工具是由Pytho…

CSS:导航栏三角箭头

用CSS实现导航流程图的样式。可根据自己的需求进行修改&#xff0c;代码精略的写了一下。 注&#xff1a;场景一和场景二在分辨率比较低的情况下会有一个1px的缝隙不太优雅&#xff0c;自行处理。有个方法是直接在每个外面包一个DIV&#xff0c;用动态样式设置底色。 场景一、…

【Python系列】浅析流式模式:基于 SSE 的实时响应体验

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python3.11.9+selenium,选择证书用多线程+键盘enter解决

Python3.11.9+selenium,选择证书用多线程+键盘enter解决 1、遇到问题:弹出证书选择,无法点击确定 import pyautogui pyautogui.press(enter) 键盘enter也无法点击 2、解决办法:用多线程解决同时执行click链接和Enter点击证书的确定 1、点击操作 # # 通过文本链接文本…

前端开发快速进行 Mock 数据的方法

前端开发快速进行 Mock 数据的方法 在前端开发中&#xff0c;模拟数据&#xff08;Mock Data&#xff09;是不可或缺的一部分&#xff0c;它可以帮助开发者在没有后端接口的情况下快速推进项目进度。然而&#xff0c;在使用如 Mock.js 这样的工具时&#xff0c;开发者可能会遇…

Unity学习---IL2CPP打包时可能遇到的问题

写这篇主要是怕自己之后打包的时候出问题不知道怎么搞&#xff0c;所以记录一下。 问题一&#xff1a;类型裁剪 IL2CPP打包后会自动对Unity工程的dll进行裁剪&#xff0c;将代码中没有引用到的类型裁剪掉。特别是通过反射等方式调用一些类的时候&#xff0c;很容易出问题。 …

Unity学习笔记(4):人物和基本组件

文章目录 前言开发环境新增角色添加组件RigidBody 2D全局项目设置Edit 给地图添加碰撞体 总结 前言 今天不加班&#xff0c;有空闲时间。争取一天学一课&#xff0c;养成习惯 开发环境 Unity 6windows 11vs studio 2022Unity2022.2 最新教程《勇士传说》入门到进阶&#xff…

vue3使用element-plus,树组件el-tree增加引导线

vue3使用element-plus&#xff0c;树组件el-tree增加引导线 vue3项目element-plus&#xff0c;树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求&#xff0c;UI图&#xff0c;所以对el-tree进行增加了引导线 修改样式如下&am…

比ChatGPT更酷的AI工具

相较于寻找比ChatGPT更酷的AI工具&#xff0c;这听起来似乎是个挑战&#xff0c;因为ChatGPT已经以它强大的综合性能在AI界大名鼎鼎。然而&#xff0c;每个工具都有其独特的优势&#xff0c;特别是在特定的应用场景下&#xff0c;其他AI工具可能会展现出与ChatGPT不同的魅力。接…