微观交通流仿真软件:VISSIM_(17).高级编程与脚本应用

高级编程与脚本应用

1. Python 脚本集成

1.1 使用 Python 脚本进行仿真控制

在微观交通流仿真软件中,Python 脚本可以用于实现高级的仿真控制和数据处理功能。通过 Python 脚本,用户可以动态地调整仿真参数、生成仿真数据、分析仿真结果等。

1.1.1 仿真参数动态调整

使用 Python 脚本可以动态调整仿真中的各种参数,例如车流密度、信号灯配时、车辆速度等。这在进行复杂的交通流分析时非常有用,可以在仿真过程中根据实际情况进行调整,从而获得更准确的结果。


# 导入 VISSIM API

import win32com.client



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 获取仿真配置

simulation_config = vissim.Simulation



# 动态调整仿真参数

# 例如,调整车流密度

vissim.Network.VehicleInput(1).SetAttValue('VehsPerHour', 1200)



# 例如,调整信号灯配时

vissim.Network.SignalControllers.ItemByKey(1).SGs.ItemByKey(1).SetAttValue('GreenTime', 30)



# 例如,调整车辆速度

vissim.Network.VehicleTypes.ItemByKey(1).SetAttValue('MaxSpeed', 60)



# 开始仿真

vissim.Simulation.RunContinuous()

1.1.2 生成仿真数据

Python 脚本可以用于生成仿真所需的输入数据,例如车辆输入、路径选择、交通信号等。这在进行大规模仿真时非常有用,可以自动生成复杂的输入数据,节省时间和提高准确性。


# 导入 VISSIM API

import win32com.client



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 生成车辆输入数据

for i in range(1, 5):

    vissim.Network.VehicleInput.ItemByKey(i).SetAttValue('VehsPerHour', 1000 + i * 100)



# 生成信号灯配时数据

for i in range(1, 3):

    vissim.Network.SignalControllers.ItemByKey(i).SGs.ItemByKey(1).SetAttValue('GreenTime', 30 + i * 10)



# 开始仿真

vissim.Simulation.RunContinuous()

1.1.3 分析仿真结果

Python 脚本还可以用于分析仿真结果,例如计算车辆延误、路径选择概率、交通流量等。通过 Python 的数据分析库(如 Pandas、NumPy),用户可以更方便地处理和分析仿真数据。


# 导入必要的库

import win32com.client

import pandas as pd

import numpy as np



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 运行仿真

vissim.Simulation.RunContinuous()



# 获取仿真结果

# 例如,获取车辆延误数据

vehicle_delays = []

for i in range(1, 101):

    vehicle = vissim.Network.Vehicles.ItemByKey(i)

    delay = vehicle.GetAttValue('DelayTotal')

    vehicle_delays.append({'VehicleID': i, 'Delay': delay})



# 将数据转换为 DataFrame

df = pd.DataFrame(vehicle_delays)



# 计算平均延误

average_delay = df['Delay'].mean()

print(f'平均延误: {average_delay} 秒')



# 计算最大延误

max_delay = df['Delay'].max()

print(f'最大延误: {max_delay} 秒')



# 计算最小延误

min_delay = df['Delay'].min()

print(f'最小延误: {min_delay} 秒')



# 计算延误的标准差

std_delay = df['Delay'].std()

print(f'延误标准差: {std_delay} 秒')

1.2 使用 VBA 脚本进行仿真控制

除了 Python,VBA 也是常用的脚本语言之一,可以用于实现高级的仿真控制和数据处理功能。VBA 脚本可以直接在 VISSIM 中编写和运行,具有较好的集成性和实时性。

1.2.1 仿真参数动态调整

使用 VBA 脚本可以动态调整仿真中的各种参数,例如车流密度、信号灯配时、车辆速度等。


' 连接 VISSIM

Dim vissim As Object

Set vissim = CreateObject("Vissim.Vissim")



' 打开 VISSIM 仿真文件

vissim.LoadNet "path_to_your_net.inpx"



' 动态调整仿真参数

' 例如,调整车流密度

vissim.Network.VehicleInput.ItemByKey(1).SetAttValue "VehsPerHour", 1200



' 例如,调整信号灯配时

vissim.Network.SignalControllers.ItemByKey(1).SGs.ItemByKey(1).SetAttValue "GreenTime", 30



' 例如,调整车辆速度

vissim.Network.VehicleTypes.ItemByKey(1).SetAttValue "MaxSpeed", 60



' 开始仿真

vissim.Simulation.RunContinuous

1.2.2 生成仿真数据

VBA 脚本可以用于生成仿真所需的输入数据,例如车辆输入、路径选择、交通信号等。


' 连接 VISSIM

Dim vissim As Object

Set vissim = CreateObject("Vissim.Vissim")



' 打开 VISSIM 仿真文件

vissim.LoadNet "path_to_your_net.inpx"



' 生成车辆输入数据

Dim i As Integer

For i = 1 To 4

    vissim.Network.VehicleInput.ItemByKey(i).SetAttValue "VehsPerHour", 1000 + i * 100

Next i



' 生成信号灯配时数据

For i = 1 To 2

    vissim.Network.SignalControllers.ItemByKey(i).SGs.ItemByKey(1).SetAttValue "GreenTime", 30 + i * 10

Next i



' 开始仿真

vissim.Simulation.RunContinuous

1.2.3 分析仿真结果

VBA 脚本还可以用于分析仿真结果,例如计算车辆延误、路径选择概率、交通流量等。


' 连接 VISSIM

Dim vissim As Object

Set vissim = CreateObject("Vissim.Vissim")



' 打开 VISSIM 仿真文件

vissim.LoadNet "path_to_your_net.inpx"



' 运行仿真

vissim.Simulation.RunContinuous



' 获取仿真结果

' 例如,获取车辆延误数据

Dim vehicle_delays As Variant

ReDim vehicle_delays(1 To 100, 1 To 2)

Dim i As Integer

For i = 1 To 100

    Dim vehicle As Object

    Set vehicle = vissim.Network.Vehicles.ItemByKey(i)

    Dim delay As Double

    delay = vehicle.GetAttValue("DelayTotal")

    vehicle_delays(i, 1) = i

    vehicle_delays(i, 2) = delay

Next i



' 计算平均延误

Dim total_delay As Double

total_delay = 0

For i = 1 To 100

    total_delay = total_delay + vehicle_delays(i, 2)

Next i

Dim average_delay As Double

average_delay = total_delay / 100

Debug.Print "平均延误: " & average_delay & " 秒"



' 计算最大延误

Dim max_delay As Double

max_delay = vehicle_delays(1, 2)

For i = 2 To 100

    If vehicle_delays(i, 2) > max_delay Then

        max_delay = vehicle_delays(i, 2)

    End If

Next i

Debug.Print "最大延误: " & max_delay & " 秒"



' 计算最小延误

Dim min_delay As Double

min_delay = vehicle_delays(1, 2)

For i = 2 To 100

    If vehicle_delays(i, 2) < min_delay Then

        min_delay = vehicle_delays(i, 2)

    End If

Next i

Debug.Print "最小延误: " & min_delay & " 秒"



' 计算延误的标准差

Dim mean_delay As Double

mean_delay = average_delay

Dim variance As Double

variance = 0

For i = 1 To 100

    variance = variance + (vehicle_delays(i, 2) - mean_delay) ^ 2

Next i

Dim std_deviation As Double

std_deviation = Sqr(variance / 100)

Debug.Print "延误标准差: " & std_deviation & " 秒"

2. 自定义仿真模型

2.1 创建自定义车辆类型

在微观交通流仿真软件中,用户可以通过自定义车辆类型来模拟不同类型的车辆,例如不同长度、不同速度、不同加减速特性的车辆。这在进行特定交通场景的仿真时非常有用。

2.1.1 自定义车辆类型的基本属性

自定义车辆类型的基本属性包括车辆长度、最大速度、加速度、减速度等。这些属性可以根据实际需求进行设置,以更准确地模拟特定类型的车辆。


# 导入 VISSIM API

import win32com.client



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 创建自定义车辆类型

vissim.VehicleTypes.AddVehicleType 1

vissim.VehicleTypes.ItemByKey(1).SetAttValue('Length', 5.0)  # 车辆长度

vissim.VehicleTypes.ItemByKey(1).SetAttValue('MaxSpeed', 120)  # 最大速度

vissim.VehicleTypes.ItemByKey(1).SetAttValue('Accel', 2.0)  # 加速度

vissim.VehicleTypes.ItemByKey(1).SetAttValue('Decel', 4.0)  # 减速度



# 保存仿真文件

vissim.SaveNet('path_to_your_net.inpx')

2.1.2 自定义车辆类型的高级属性

自定义车辆类型的高级属性包括车辆的舒适性、驾驶行为、优先级等。这些属性可以进一步细化车辆的行为,使仿真结果更加真实。


# 导入 VISSIM API

import win32com.client



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 创建自定义车辆类型

vissim.VehicleTypes.AddVehicleType 1

vissim.VehicleTypes.ItemByKey(1).SetAttValue('ComfortFactor', 0.8)  # 舒适性因子

vissim.VehicleTypes.ItemByKey(1).SetAttValue('DriverBeh', 'Aggressive')  # 驾驶行为

vissim.VehicleTypes.ItemByKey(1).SetAttValue('Priority', 2)  # 优先级



# 保存仿真文件

vissim.SaveNet('path_to_your_net.inpx')

2.2 创建自定义交通信号

在微观交通流仿真软件中,用户可以通过自定义交通信号来模拟不同的交通控制策略,例如自适应信号控制、固定配时信号控制等。这在研究交通信号优化和控制策略时非常有用。

2.2.1 自定义固定配时信号

自定义固定配时信号可以通过设置信号灯的绿灯时间、黄灯时间和红灯时间来实现。这些时间可以根据实际需求进行设置,以模拟特定的交通控制策略。


# 导入 VISSIM API

import win32com.client



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 创建自定义信号控制器

vissim.SignalControllers.AddSignalController 1

vissim.SignalControllers.ItemByKey(1).SetAttValue('Pos:Longitudinal', 100)

vissim.SignalControllers.ItemByKey(1).SetAttValue('Pos:Lateral', 0)



# 创建信号灯组

vissim.SignalControllers.ItemByKey(1).SGs.AddSignalGroup 1

vissim.SignalControllers.ItemByKey(1).SGs.ItemByKey(1).SetAttValue('GreenTime', 30)  # 绿灯时间

vissim.SignalControllers.ItemByKey(1).SGs.ItemByKey(1).SetAttValue('YellowTime', 3)  # 黄灯时间

vissim.SignalControllers.ItemByKey(1).SGs.ItemByKey(1).SetAttValue('RedTime', 30)  # 红灯时间



# 保存仿真文件

vissim.SaveNet('path_to_your_net.inpx')

2.2.2 自定义自适应信号

自定义自适应信号可以通过编写脚本来动态调整信号灯的配时,以适应交通流量的变化。这在实际交通控制中非常有用,可以提高交通效率和安全性。


# 导入 VISSIM API 和必要的库

import win32com.client

import numpy as np



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 创建自定义信号控制器

vissim.SignalControllers.AddSignalController 1

vissim.SignalControllers.ItemByKey(1).SetAttValue('Pos:Longitudinal', 100)

vissim.SignalControllers.ItemByKey(1).SetAttValue('Pos:Lateral', 0)



# 创建信号灯组

vissim.SignalControllers.ItemByKey(1).SGs.AddSignalGroup 1

vissim.SignalControllers.ItemByKey(1).SGs.ItemByKey(1).SetAttValue('GreenTime', 30)  # 初始绿灯时间

vissim.SignalControllers.ItemByKey(1).SGs.ItemByKey(1).SetAttValue('YellowTime', 3)  # 黄灯时间

vissim.SignalControllers.ItemByKey(1).SGs.ItemByKey(1).SetAttValue('RedTime', 30)  # 红灯时间



# 定义自适应信号控制函数

def adaptive_signal_control(signal_group, traffic_flow):

    if traffic_flow < 500:

        green_time = 30

    elif traffic_flow < 1000:

        green_time = 40

    else:

        green_time = 50

    signal_group.SetAttValue('GreenTime', green_time)



# 运行仿真

vissim.Simulation.RunContinuous



# 获取交通流量数据

traffic_flow = vissim.Network.VehicleInput(1).GetAttValue('VehsPerHour')



# 调用自适应信号控制函数

adaptive_signal_control(vissim.Network.SignalControllers.ItemByKey(1).SGs.ItemByKey(1), traffic_flow)



# 保存仿真文件

vissim.SaveNet('path_to_your_net.inpx')

2.3 创建自定义路径选择模型

在微观交通流仿真软件中,用户可以通过自定义路径选择模型来模拟驾驶员在交通网络中的路径选择行为。这在研究交通分配和路径选择策略时非常有用。

2.3.1 基于概率的路径选择模型

基于概率的路径选择模型可以根据各种因素(如交通流量、道路长度、交通信号等)来计算驾驶员选择某条路径的概率。这种模型可以更好地反映驾驶员在复杂交通网络中的选择行为。


# 导入 VISSIM API 和必要的库

import win32com.client

import numpy as np



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 定义路径选择函数

def choose_path(vissim, vehicle, paths):

    probabilities = []

    for path in paths:

        # 计算路径的概率

        probability = 1.0 / (1 + np.exp(-0.1 * (path['length'] + path['traffic_flow'])))

        probabilities.append(probability)

    

    # 归一化概率

    probabilities = np.array(probabilities) / np.sum(probabilities)

    

    # 选择路径

    chosen_path = np.random.choice([path['id'] for path in paths], p=probabilities)

    vehicle.SetAttValue('DesiredRoute', chosen_path)



# 获取所有路径

paths = [

    {'id': 1, 'length': 1000, 'traffic_flow': 500},

    {'id': 2, 'length': 1200, 'traffic_flow': 600},

    {'id': 3, 'length': 800, 'traffic_flow': 400}

]



# 获取所有车辆

vehicles = vissim.Network.Vehicles.GetMultiAttributes(['No', 'DesiredRoute'])



# 对每个车辆进行路径选择

for vehicle in vehicles:

    choose_path(vissim, vissim.Network.Vehicles.ItemByKey(vehicle[0]), paths)



# 保存仿真文件

vissim.SaveNet('path_to_your_net.inpx')

2.3.2 基于最短路径的路径选择模型

基于最短路径的路径选择模型可以根据道路网络的拓扑结构和交通流量来选择最短的路径。这种模型适用于需要最优化路径选择的场景,例如导航系统或交通规划。


# 导入 VISSIM API 和必要的库

import win32com.client

import networkx as nx



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 创建道路网络图

G = nx.Graph()



# 添加节点和边

# 假设节点编号为 1, 2, 3, 4

G.add_node(1)

G.add_node(2)

G.add_node(3)

G.add_node(4)



# 添加边及其权重

G.add_edge(1, 2, weight=1000)

G.add_edge(1, 3, weight=1200)

G.add_edge(2, 4, weight=500)

G.add_edge(3, 4, weight=400)



# 定义路径选择函数

def choose_shortest_path(vissim, vehicle, source, target):

    # 计算最短路径

    shortest_path = nx.shortest_path(G, source=source, target=target, weight='weight')

    # 设置车辆的路径

    vehicle.SetAttValue('DesiredRoute', shortest_path)



# 获取所有车辆

vehicles = vissim.Network.Vehicles.GetMultiAttributes(['No', 'DesiredRoute'])



# 对每个车辆进行最短路径选择

for vehicle in vehicles:

    # 假设所有车辆的起始节点为 1,目标节点为 4

    choose_shortest_path(vissim, vissim.Network.Vehicles.ItemByKey(vehicle[0]), 1, 4)



# 保存仿真文件

vissim.SaveNet('path_to_your_net.inpx')

2.4 创建自定义交通事件

在微观交通流仿真软件中,用户可以通过自定义交通事件来模拟各种突发事件,例如交通事故、道路施工等。这些事件可以用来研究突发事件对交通流的影响。

2.4.1 自定义交通事故事件

自定义交通事故事件可以通过设置事故发生的地点、持续时间等参数来模拟事故对交通流的影响。


# 导入 VISSIM API

import win32com.client



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 创建交通事故事件

vissim.Events.AddAccident 1

vissim.Events.ItemByKey(1).SetAttValue('Pos:Longitudinal', 1000)  # 事故发生的纵向位置

vissim.Events.ItemByKey(1).SetAttValue('Pos:Lateral', 0)  # 事故发生的横向位置

vissim.Events.ItemByKey(1).SetAttValue('Duration', 600)  # 事故持续时间(秒)



# 保存仿真文件

vissim.SaveNet('path_to_your_net.inpx')

2.4.2 自定义道路施工事件

自定义道路施工事件可以通过设置施工地点、施工时间等参数来模拟施工对交通流的影响。施工事件可以用于研究施工期间的交通流量变化和延误情况。


# 导入 VISSIM API

import win32com.client



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 创建道路施工事件

vissim.Events.AddMaintenance 1

vissim.Events.ItemByKey(1).SetAttValue('Pos:Longitudinal', 1500)  # 施工开始的纵向位置

vissim.Events.ItemByKey(1).SetAttValue('Length', 500)  # 施工区域的长度

vissim.Events.ItemByKey(1).SetAttValue('StartTime', 3600)  # 施工开始时间(秒)

vissim.Events.ItemByKey(1).SetAttValue('Duration', 7200)  # 施工持续时间(秒)



# 保存仿真文件

vissim.SaveNet('path_to_your_net.inpx')

3. 数据可视化与报告生成

3.1 数据可视化

数据可视化是将仿真结果以图形的形式展示出来,以便于更好地理解仿真数据。常用的可视化工具包括 Matplotlib、Seaborn 和 Plotly 等。

3.1.1 使用 Matplotlib 进行数据可视化

Matplotlib 是一个强大的绘图库,可以用于生成各种静态和动态的图表。


# 导入必要的库

import win32com.client

import matplotlib.pyplot as plt



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 运行仿真

vissim.Simulation.RunContinuous



# 获取车辆延误数据

vehicle_delays = []

for i in range(1, 101):

    vehicle = vissim.Network.Vehicles.ItemByKey(i)

    delay = vehicle.GetAttValue('DelayTotal')

    vehicle_delays.append(delay)



# 绘制车辆延误分布图

plt.hist(vehicle_delays, bins=10, alpha=0.7, color='blue')

plt.title('车辆延误分布')

plt.xlabel('延误时间(秒)')

plt.ylabel('车辆数量')

plt.show()

3.1.2 使用 Plotly 进行数据可视化

Plotly 是一个交互式绘图库,可以生成动态的图表,便于进行交互分析。


# 导入必要的库

import win32com.client

import plotly.express as px

import pandas as pd



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 运行仿真

vissim.Simulation.RunContinuous



# 获取车辆延误数据

vehicle_delays = []

for i in range(1, 101):

    vehicle = vissim.Network.Vehicles.ItemByKey(i)

    delay = vehicle.GetAttValue('DelayTotal')

    vehicle_delays.append({'VehicleID': i, 'Delay': delay})



# 将数据转换为 DataFrame

df = pd.DataFrame(vehicle_delays)



# 绘制车辆延误分布图

fig = px.histogram(df, x='Delay', nbins=10, title='车辆延误分布')

fig.update_xaxes(title_text='延误时间(秒)')

fig.update_yaxes(title_text='车辆数量')

fig.show()

3.2 报告生成

报告生成是将仿真结果以报告的形式展示出来,以便于分享和存档。常用的报告生成工具包括 Pandas、Jinja2 和 ReportLab 等。

3.2.1 使用 Pandas 和 Jinja2 生成 HTML 报告

Pandas 用于数据处理,Jinja2 用于生成 HTML 报告。


# 导入必要的库

import win32com.client

import pandas as pd

import jinja2



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 运行仿真

vissim.Simulation.RunContinuous



# 获取车辆延误数据

vehicle_delays = []

for i in range(1, 101):

    vehicle = vissim.Network.Vehicles.ItemByKey(i)

    delay = vehicle.GetAttValue('DelayTotal')

    vehicle_delays.append({'VehicleID': i, 'Delay': delay})



# 将数据转换为 DataFrame

df = pd.DataFrame(vehicle_delays)



# 计算统计量

average_delay = df['Delay'].mean()

max_delay = df['Delay'].max()

min_delay = df['Delay'].min()

std_delay = df['Delay'].std()



# 定义报告模板

template = jinja2.Template("""







    仿真结果报告





    

仿真结果报告

车辆延误统计

  • 平均延误: {{ average_delay }} 秒
  • 最大延误: {{ max_delay }} 秒
  • 最小延误: {{ min_delay }} 秒
  • 延误标准差: {{ std_delay }} 秒

车辆延误数据

{% for row in data %} {% endfor %}
车辆ID 延误时间(秒)
{{ row.VehicleID }} {{ row.Delay }}
"""
) # 渲染报告 report = template.render(average_delay=average_delay, max_delay=max_delay, min_delay=min_delay, std_delay=std_delay, data=df.to_dict(orient='records')) # 将报告保存为 HTML 文件 with open('simulation_report.html', 'w', encoding='utf-8') as f: f.write(report)
3.2.2 使用 ReportLab 生成 PDF 报告

ReportLab 是一个强大的 PDF 生成库,可以用于生成高质量的 PDF 报告。


# 导入必要的库

import win32com.client

import pandas as pd

from reportlab.lib.pagesizes import letter

from reportlab.pdfgen import canvas

from reportlab.lib import colors

from reportlab.lib.units import inch

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph

from reportlab.lib.styles import getSampleStyleSheet



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 运行仿真

vissim.Simulation.RunContinuous



# 获取车辆延误数据

vehicle_delays = []

for i in range(1, 101):

    vehicle = vissim.Network.Vehicles.ItemByKey(i)

    delay = vehicle.GetAttValue('DelayTotal')

    vehicle_delays.append({'VehicleID': i, 'Delay': delay})



# 将数据转换为 DataFrame

df = pd.DataFrame(vehicle_delays)



# 计算统计量

average_delay = df['Delay'].mean()

max_delay = df['Delay'].max()

min_delay = df['Delay'].min()

std_delay = df['Delay'].std()



# 定义 PDF 报告的内容

data = [['车辆ID', '延误时间(秒)']] + df.values.tolist()



# 创建 PDF 报告

doc = SimpleDocTemplate("simulation_report.pdf", pagesize=letter)

styles = getSampleStyleSheet()

content = []



# 添加标题

content.append(Paragraph("仿真结果报告", styles['Title']))



# 添加车辆延误统计

content.append(Paragraph("车辆延误统计", styles['Heading2']))

content.append(Paragraph(f"平均延误: {average_delay} 秒", styles['Normal']))

content.append(Paragraph(f"最大延误: {max_delay} 秒", styles['Normal']))

content.append(Paragraph(f"最小延误: {min_delay} 秒", styles['Normal']))

content.append(Paragraph(f"延误标准差: {std_delay} 秒", styles['Normal']))



# 添加车辆延误数据表

content.append(Paragraph("车辆延误数据", styles['Heading2']))

table = Table(data)

table.setStyle(TableStyle([

    ('BACKGROUND', (0, 0), (-1, 0), colors.grey),

    ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),

    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),

    ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),

    ('FONTSIZE', (0, 0), (-1, 0), 14),

    ('BOTTOMPADDING', (0, 0), (-1, 0), 12),

    ('BACKGROUND', (0, 1), (-1, -1), colors.beige),

    ('GRID', (0, 0), (-1, -1), 1, colors.black)

]))



content.append(table)



# 生成 PDF 报告

doc.build(content)

3.3 数据导出与格式转换

数据导出和格式转换是将仿真结果保存为其他格式(如 CSV、Excel、JSON)以便于进一步分析和处理。

3.3.1 导出为 CSV 文件

将仿真结果导出为 CSV 文件,便于使用 Excel 或其他数据分析工具进行处理。


# 导入必要的库

import win32com.client

import pandas as pd



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 运行仿真

vissim.Simulation.RunContinuous



# 获取车辆延误数据

vehicle_delays = []

for i in range(1, 101):

    vehicle = vissim.Network.Vehicles.ItemByKey(i)

    delay = vehicle.GetAttValue('DelayTotal')

    vehicle_delays.append({'VehicleID': i, 'Delay': delay})



# 将数据转换为 DataFrame

df = pd.DataFrame(vehicle_delays)



# 导出为 CSV 文件

df.to_csv('vehicle_delays.csv', index=False, encoding='utf-8')

3.3.2 导出为 Excel 文件

将仿真结果导出为 Excel 文件,便于使用 Excel 进行数据分析和图表生成。


# 导入必要的库

import win32com.client

import pandas as pd



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 运行仿真

vissim.Simulation.RunContinuous



# 获取车辆延误数据

vehicle_delays = []

for i in range(1, 101):

    vehicle = vissim.Network.Vehicles.ItemByKey(i)

    delay = vehicle.GetAttValue('DelayTotal')

    vehicle_delays.append({'VehicleID': i, 'Delay': delay})



# 将数据转换为 DataFrame

df = pd.DataFrame(vehicle_delays)



# 导出为 Excel 文件

df.to_excel('vehicle_delays.xlsx', index=False, encoding='utf-8')

3.3.3 导出为 JSON 文件

将仿真结果导出为 JSON 文件,便于进行数据交换和处理。


# 导入必要的库

import win32com.client

import pandas as pd

import json



# 连接 VISSIM

vissim = win32com.client.Dispatch('Vissim.Vissim')



# 打开 VISSIM 仿真文件

vissim.LoadNet('path_to_your_net.inpx')



# 运行仿真

vissim.Simulation.RunContinuous



# 获取车辆延误数据

vehicle_delays = []

for i in range(1, 101):

    vehicle = vissim.Network.Vehicles.ItemByKey(i)

    delay = vehicle.GetAttValue('DelayTotal')

    vehicle_delays.append({'VehicleID': i, 'Delay': delay})



# 将数据转换为 DataFrame

df = pd.DataFrame(vehicle_delays)



# 导出为 JSON 文件

with open('vehicle_delays.json', 'w', encoding='utf-8') as f:

    json.dump(df.to_dict(orient='records'), f, ensure_ascii=False, indent=4)

通过以上方法,用户可以将微观交通流仿真软件中的仿真结果以多种格式导出,并使用不同的工具进行可视化和报告生成,从而更好地理解和分析仿真数据。

在这里插入图片描述

你可能感兴趣的:(交通物流仿真,交通物流仿真,交通物流)