胡 輝
(1.華東交通大學經濟管理學院,江西南昌330013;2.北京交通大學交通運輸學院,北京100044)
作為數據、圖形處理的一種有力工具,OriginPro在教學科研、工程技術中的應用日益受到青睞[1-4]。除了利用軟件的菜單進行數據分析和圖形繪制外,其內嵌的Origin C語言使得應用者能靈活地根據自己的需求開發出相應的程序以解決自己的問題,如軟件中自帶的元胞自動機模型和圖形的邊緣檢測處理等程序。
在交通流系統仿真領域,1992年提出的NaSch模型一直被認為是基于元胞自動機的交通流建模的經典模型,后續的各種改進模型大多以此為基礎來分析解釋實際中的各種交通現象。該模型的實現方法有很多(如用Visual C++把模擬數據存儲在文件中),但模型仿真的兩個主要輸出結果圖:流量密度圖和時空相位圖在不少研究[5-7]中是通過OriginPro導入數據文件來完成實現的。因此為充分利用OriginPro(以下介紹的OriginPro均為7.5版本)內在的強大功能,一次性地完成建模仿真的任務,我們在分析OriginPro軟件體系的基礎上,充分挖掘了軟件潛在的強大功能,以NaSch模型為例首次應用軟件中內嵌的Origin C語言和相關開發工具進行二次開發實現了模型的仿真輸出。
OriginPro的二次開發有兩種方法:一是使用腳本語言Lab Talk,二是應用Origin C。在實際應用中,由于腳本語言本質上是一種解釋性語言,程序執行速度慢,所以一般從性能角度會選擇編譯性的Origin C。除了支持幾乎完全的ANSIC語言語法及C++和C#的特征子集外,在OriginPro中Origin C包含兩方面的內容:
(1)全局函數。涉及到數據分析Analysis、基本輸入/輸出Basic I/O、字符/字符串處理、COM對象、繪圖Plot等26個方面,用戶在程序中可直接調用這些函數。
(2)類。包含應用程序通信類Application Communication(目前僅支持Matlab)、復合數據類(如Curve,Matrix,Dataset,Vector等)、內部Origin類(如Project,Worksheet,Datasheet,Column等)、系統類(如file,Registry等)、用戶接口控制類(如DeviceContext,progressBox,waitCursor,Window等)。
圖1是內部Origin類的關系表示,絕大多數類的基類是OriginObject。
除利用Origin C提供的函數和類外,OriginPro還提供了一些工具幫助用戶進行二次開發,主要有以下5類輔助開發工具。

圖1 O rigin內部類結構圖
(1)COM組件客戶端編程。與其他的應用程序如Excel,Word進行交互,從數據庫Access,SQL Server等讀入數據等。
(2)自動化服務器編程。在支持COM編程的應用程序如Excel中作為服務器進行交互。
(3)對話框構造器Dialog Builder。在標準控件(如Edit,Button)的基礎上支持各種復雜的人機界面,適應用戶的特定需求。
(4)ActiveX控件。在對話框構造器中可插入ActiveX控件,使得應用程序的適應性更強。
(5)應用程序加密保護。為了保證開發者的知識產權,可對應用程序的源代碼加密。使用者可運行程序,但無法看到源程序。
作為對184號元胞自動機模型的推廣,1992年Nagel和Schreckenberg提出了著名的NaSch模型。在這一模型中,時間、空間、速度都被整數離散化。道路被劃分為離散的元胞,每個元胞或者是空的,或者是被一輛車占據,每輛車可取0,1,2,…,vmax,vmax為最大速度。相對于184號規則,NaSch模型的主要改進之處是引入了慢化概率和最大車速不再是1。在t→t+1的過程中,模型按如下規則并行演化:
(1)加速:vn→min(vn+1,vmax),對應于現實中司機期望以最大速度行駛的特性。
(2)減速:vn→min(vn,dn),駕駛員為了避免和前車發生碰撞而采取減速的措施。
(3)隨機慢化:以概率p,vn→max(vn-1,0),由各種不確定因素造成的車輛減速。
(4)運動:xn→xn+v,車輛按調整后的速度向前行駛。
xn,v分別表示n車的位置和速度;dn=xn+1-xn-l表示n車和前車n+1之間空的元胞數;l表示車輛長度。
為了實現模型的仿真,從以下3個方面對模型進行分析設計。
(1)核心類Lane。從面向對象的角度看,Lane類包括的屬性有車道長度、車長、最大速度、慢化概率、車流密度、車流量、平均速度、車道狀態等,包括的方法有更新、車流量與平均速度及車道速度的獲得等。其中,基于上述規則的更新方法是類的關鍵,以下代碼說明了如何實現周期條件下的更新規則。


(2)界面輸入。為便于控制相關的參數,如車道長度、車長、慢化概率、車流密度等參數,需要設計相應的話框獲得用戶的輸入。此外,考慮到程序運行的時間較長,加入OriginPro中的Progresss Box和Wait Cursor控件提示用戶程序的運行情況。
(3)結果輸出。為一次性得到仿真的輸出,設計兩個函數獲得輸出結果。其一是流量密度關系圖,主要是利用OriginPro的內嵌類Worksheet、Graphlayer、Curve等獲得仿真的模擬數據,并把這些數據通過調用相關類的方法實現圖形的輸出。其二是時空相位圖,主要是利用Matrix等內嵌類獲得不同時間空間的車道數據,然后以圖形方式展現。
通過以上的分析設計,借助Origin C及OriginPro的輔助可開發工具,從分析設計的3個方面實現了模型的仿真。
進入OriginPro的Code Builder窗口,建立一個新的c或cpp文件,用關鍵詞class定義Lane,并實現其中的方法,具體過程與一般的C++類似。
雖然OriginPro提供了簡單對話框,但對于復雜的人機界面設計,需要利用前面介紹的Dialog Builder。應用Dialog Builder的前提是Visual C++應用程序向導中有“Origin Dialog AppWizard”,一般只要安裝完OriginPro,Visual C++的應用程序向導中會有此項,否則需要手工導入軟件中自帶的ODialog.awx文件。圖2是計算流量密度關系圖的界面輸入結果,通過輸入相關參數,對模型的主要參數進行設置。
NaSch模型的仿真結果主要有兩個即流量密度圖和時空相位圖。為此,定義兩個函數NaSch-DensityFlux()和NaSh-TimeSpace()實現模型仿真結果的輸出,圖3是程序執行NaSch-DensityFlux運行過程中的情況。圖4是分別執行這兩個程序后的輸出結果,左邊是流量密度圖,右邊是時空相位圖,模型參數與設置界面中一樣,時空相位圖的時間步為50000到50500。其中,流量-密度圖表明路段密度與路段流量的關系并非簡單的線性關系:開始沒有車輛時,路段密度為0,流量也為0;而隨著路段密度的增大,路段流量也逐漸增大,但當路段密度大約為0.22輛/單位長度時,路段流量達到最大約為0.45輛/單位時間,此后隨之遞減,當路段密度為1(也即路段上全充滿車輛時),流量為0,意味著路段完全擁堵,車輛無法前行,這在一定程度上反映了實際中的流量-密度關系。而時空相位圖中顏色較深的則反映了隨著時間的遞進,路段上出現了擁擠現象,而且擁擠在往后傳播,這也與實際中通過航拍發現路段的擁擠現象類似[5],說明采用的模型能模擬出現實交通中擁堵的形成。

圖2 NaSch模型參數設置界面

圖3 NaSch模型運行過程

圖4 NaSch模型運行仿真結果
深度挖掘OriginPro功能自動化實現交通流中的元胞自動機建模是一次新的嘗試,相信他的應用對于類似系統的仿真研究(如其他的元胞自動機模型)有一定參考價值。從實際應用結果來看,雖然達到了要求,但程序運行的時間相對于用Visual C++編寫的程序時間長了不少。因此,可以改進的方向應是如何在Visual C++類似的環境中調用OriginPro的對象方法來實現結果輸出,或封裝成獨立的模塊供其他應用程序(如一些專業的交通規劃與管理軟件)調用。
[1] 常彬彬,劉山洪,韓健.Origin軟件在隧道監控量測數據處理中的應用[J].重慶交通大學學報:自然科學版,2008,27(2):221-224.
[2] 覃貴菊.用OriginC編程自動化處理制動試驗數據[J].鐵道機車車輛,2005,25(5):28-30.
[3] 金淑華,秦艷芬,賀梅英.Origin軟件在大學物理實驗數據處理中的應用[J].寧波工程學院學報,2008,20(2):4-7.
[4] 劉洋,郭瑩.基于Origin軟件的土工試驗數據處理[J].山西建筑,2006,32(5):336-337.
[5] 賈斌,高自友,李克平,李新剛.基于元胞自動機的交通系統建模與模擬[M].北京:科學出版社,2007.