基于VISSIM和Python的二次开发基础—多时段配时控制
?文章目錄
前言
1. COM接口功能與定位
2. COM框架搭建
2.1 導(dǎo)入COM模塊
2.2 程序頭部格式
2.3 實(shí)現(xiàn)功能
總結(jié)
前言
VISSIM軟件是一種微觀的、基于時(shí)間間隔和駕駛行為的仿真建模工具,用以城市交通和公共交通運(yùn)行的交通建模,比如復(fù)現(xiàn)道路微觀交通組織運(yùn)行狀態(tài)、控制交通系統(tǒng)信號(hào)燈、管理停車(chē)、管理與運(yùn)營(yíng)公共交通等功能。
COM接口是VISSIM的附加功能,可以獲取VISSIM的對(duì)象、方法和特征屬性,并支持VB、Java、C#、C++、Python等軟件進(jìn)行二次開(kāi)發(fā)、實(shí)現(xiàn)自定義場(chǎng)景下的自定義功能。本文旨在介紹采用Python對(duì)VISSIM軟件進(jìn)行二次開(kāi)發(fā)時(shí)的一些基本教程。
1. COM接口功能與定位
VISSIM軟件雖然復(fù)現(xiàn)了某些場(chǎng)景下的交通運(yùn)行狀態(tài),但是難以直接調(diào)用自定義的控制模型。比如以下幾種功能,難以直接在VISSIM軟件中實(shí)現(xiàn),而采用COM接口對(duì)VISSIM文件進(jìn)行二次開(kāi)發(fā)可以實(shí)現(xiàn)此類自定義的控制功能。
- 多時(shí)段信號(hào)控制:根據(jù)仿真運(yùn)行時(shí)間,調(diào)用不同時(shí)間段下的信號(hào)配時(shí)方案
- 背景流量分析:通過(guò)頻繁修改道路上的機(jī)動(dòng)車(chē)流量,評(píng)估交通場(chǎng)景運(yùn)行效益的變化情況
- 信號(hào)方案優(yōu)化:通過(guò)獲取路網(wǎng)中的交通信息,調(diào)控信號(hào)燈的燈態(tài),評(píng)估控制效益
- 快速路匝道控制:通過(guò)感知主次路交通流運(yùn)行狀態(tài),調(diào)控進(jìn)出匝道的信號(hào)方案,評(píng)估控制效益
- 單車(chē)運(yùn)行控制:通過(guò)獲取交通流運(yùn)行信息,優(yōu)化出單個(gè)車(chē)輛在滿足某種跟車(chē)模型、換道模型時(shí)的最佳軌跡與速度方案并反饋給該車(chē),評(píng)估控制效益
- 公交運(yùn)營(yíng)分析:通過(guò)修改公交線路的發(fā)車(chē)間隔、??繒r(shí)長(zhǎng)等特征參數(shù),評(píng)估公交運(yùn)行效率
- ……
2. COM框架搭建
以基于單點(diǎn)定時(shí)控制路口場(chǎng)景的多時(shí)段信號(hào)控制功能為例,在不同時(shí)間區(qū)間執(zhí)行不同的配時(shí)方案。本文采取早上06:00-10:00這一區(qū)間,在VISSIM路網(wǎng)的信號(hào)控制機(jī)中預(yù)設(shè)三種信號(hào)配時(shí)方案:在06:00-07:00執(zhí)行平峰方案1、在07:00-09:00執(zhí)行高峰方案1、在09:00-10:00執(zhí)行平峰方案2,具體方案如下表,其中黃燈、全紅分別是3s、2s,在VISSIM路網(wǎng)文件中分別按照時(shí)間順序?qū)⑵椒宸桨? 、高峰方案1 和平峰方案2分別記錄為1、2和3。
| 方案 | 相位1(主路直行) | 相位2(主路左轉(zhuǎn)) | 相位3(次路放行) | 周期 |
| 平峰方案1 | 20 | 15 | 15 | 65 |
| 高峰方案1 | 35 | 30 | 30 | 110 |
| 平峰方案2 | 25 | 20 | 20 | 80 |
2.1 導(dǎo)入COM模塊
在python環(huán)境下安裝COM接口相關(guān)的安裝包,本文以集成開(kāi)發(fā)環(huán)境Pycharm為例。首先在當(dāng)前項(xiàng)目場(chǎng)景中安裝pywin32包并導(dǎo)入。
import win32com.client as com2.2 程序頭部格式
基于VISSIM和Python二次開(kāi)發(fā)的信號(hào)控制程序,其頭部格式主要包含四個(gè)部分:路網(wǎng)、信號(hào)控制機(jī)、仿真相關(guān)參數(shù)、評(píng)價(jià)相關(guān)參數(shù)。下面依次進(jìn)行介紹。
1)讀取路網(wǎng)接口
首先,通過(guò)COM接口引入VISSIM軟件;其次,分別加載inpx和layx兩個(gè)路網(wǎng)文件,然后記錄路網(wǎng)接口。
Vissim_com = com.Dispatch('Vissim.Vissim-32.700') Vissim_road_path = '仿真文件' Vissim_com.LoadNet(vissim_road_path + '\\主支.inpx') Vissim_com.LoadNet(vissim_road_path + '\\主支.layx') S_net = Vissim_com.net2)讀取信號(hào)控制機(jī)接口
根據(jù)inpx文件中控制路口處的信號(hào)控制機(jī)編號(hào),讀取并記錄該路口信號(hào)控制機(jī)接口。當(dāng)存在多個(gè)路口時(shí),建議使用列表等數(shù)據(jù)形式記錄。
SC_number = 1 # 單個(gè)路口 SC = S_net.SignalControllers.ItemByKey(SC_number) # SC_number = {'路口1': 1, '路口2': 2} # 多個(gè)路口 # SC = [S_net.SignalControllers.ItemByKey(SC_number[sc_i]) for sc_i in SC_number.keys()]3)標(biāo)定仿真相關(guān)參數(shù)
設(shè)置仿真開(kāi)始與結(jié)束時(shí)間、隨機(jī)種子、仿真精度、仿真速度、快速仿真模式等參數(shù)。
Sim = Vissim_com.Simulation Sim.SetAttValue('SimPeriod', 1000) # 仿真時(shí)長(zhǎng) Sim.SetAttValue("RandSeed", 42) # 隨機(jī)種子 Sim.SetAttValue("SimRes", 1) # 設(shè)置仿真精度 Sim.SetAttValue("SimSpeed", 5) # 設(shè)置仿真速度 Vissim_com.Graphics.CurrentNetworkWindow.SetAttValue('QuickMode', True) # 開(kāi)啟快速模式4)開(kāi)啟評(píng)價(jià)按鈕接口
在程序控制過(guò)程中如果需要使用實(shí)時(shí)交通評(píng)價(jià)數(shù)據(jù),則需要開(kāi)啟評(píng)價(jià)接口;如果只采用事后評(píng)價(jià)衡量控制效果,則可以忽略此接口,直接在仿真運(yùn)行結(jié)束后輸出數(shù)據(jù)評(píng)價(jià)結(jié)果即可。
Eval = vissim_com.Evaluation Eval.SetAttValue('DATACOLLECTION', True) # 打開(kāi)離線評(píng)價(jià)按鈕 DC_eval = Eval.DataCollectionEvaluation # 打開(kāi)具體的數(shù)據(jù)采集接口2.3 實(shí)現(xiàn)功能
仿真路網(wǎng)的運(yùn)行可分為連續(xù)仿真和單步仿真兩種,可使用單步仿真控制方式在不同時(shí)段實(shí)施調(diào)用不同的信號(hào)控制方案,并在到達(dá)仿真時(shí)長(zhǎng)時(shí)停止仿真。
SC.SetAttValue("ProgNo", 1) # 選取編號(hào)為1的信號(hào)方案 for i_step in range(Sim_sta, Sim_end):Sim.RunSingleStep() Sim.Stop()最終,完整的控制程序如下:
import win32com.client as comdef Simulator(path, sc_number, sim_end, sim_res):# 加載本地的vissim,請(qǐng)注意版本Vissim_com = com.Dispatch('Vissim.Vissim-32.700')# 讀取路網(wǎng)接口Vissim_com.LoadNet(path[0])Vissim_com.LoadNet(path[1])S_net = Vissim_com.net# 讀取信號(hào)控制機(jī)接口SC = S_net.SignalControllers.ItemByKey(sc_number)# 標(biāo)定仿真相關(guān)參數(shù)Sim = Vissim_com.SimulationSim.SetAttValue('SimPeriod', sim_end)Sim.SetAttValue('RandSeed', 42)Sim.SetAttValue('SimRes', sim_res)Sim.SetAttValue('SimSpeed', 5)Vissim_com.Graphics.CurrentNetworkWindow.SetAttValue('QuickMode', True)# 開(kāi)啟評(píng)價(jià)按鈕接口Eval = Vissim_com.EvaluationEval.SetAttValue('DATACOLLECTION', True)return Vissim_com, S_net, SC, SimPath = ['主支.inpx', '主支.layx'] SC_number = 1 Sim_sta, Sim_res = 1, 1 Scheme_time = [[Sim_sta, Sim_sta + 1 * 3600], # 平峰方案1的開(kāi)啟與關(guān)閉時(shí)間[Sim_sta + 1 * 3600, Sim_sta + 3 * 3600], # 高峰方案1[Sim_sta + 3 * 3600, Sim_sta + 4 * 3600]] # 平峰方案2 Sim_end = Scheme_time[-1][-1] Vissim_com, S_net, SC, Sim = Simulator(Path, SC_number,Sim_end, Sim_res)for i_step in range(Sim_sta * Sim_re, Sim_end * Sim_res + 1):if i_step == Sim_end * Sim_res:breakif i_step == Scheme_time[0][0] * Sim_res:SC.SetAttValue("ProgNo", 1)elif i_step == Scheme_time[1][0] * Sim_res:SC.SetAttValue("ProgNo", 2)elif i_step == Scheme_time[2][0] * Sim_res:SC.SetAttValue("ProgNo", 3)Sim.RunSingleStep()Sim.Stop()總結(jié)
本文主要介紹VISSIM和Python軟件的二次開(kāi)發(fā)環(huán)境搭建、以及COM接口的調(diào)用,并以多時(shí)段信號(hào)控制功能為例編輯了具體的Python程序。
總結(jié)
以上是生活随笔為你收集整理的基于VISSIM和Python的二次开发基础—多时段配时控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Apache伪静态学习
- 下一篇: python语言用什么关键字来声明一个类