許王燕
(同濟(jì)大學(xué)電信學(xué)院,上海 201800)
近年來(lái)隨著城市規(guī)模的擴(kuò)大和地面交通的日益擁堵,發(fā)展軌道交通成為了解決城市交通問(wèn)題的重要途徑。而列車(chē)運(yùn)行圖是軌道交通中指揮列車(chē)運(yùn)行的依據(jù),它作為城市軌道交通系統(tǒng)運(yùn)輸組織的工作計(jì)劃與調(diào)整基礎(chǔ),意義重大[1][2]。因此,一個(gè)能夠清晰展示列車(chē)運(yùn)行計(jì)劃的運(yùn)行圖對(duì)于軌道交通的正常運(yùn)行具有重要的意義。
城市軌道交通在運(yùn)行過(guò)程中受到眾多因素的影響,比如,軌道上的列車(chē)會(huì)經(jīng)常出現(xiàn)列車(chē)晚點(diǎn),甚至多趟列車(chē)連帶晚點(diǎn)等意外情況,所以在實(shí)際運(yùn)行過(guò)程中不可避免的會(huì)發(fā)生偏離原定計(jì)劃的現(xiàn)象。因此,調(diào)整修改運(yùn)行圖的功能是一個(gè)設(shè)計(jì)良好的運(yùn)行圖鋪畫(huà)編制系統(tǒng)的必備模塊。
本文詳細(xì)闡述了一個(gè)基于MFC的文檔編碼結(jié)構(gòu),使用面向?qū)ο蟮木幊谭绞剑瑢?shí)現(xiàn)了城市軌道交通列車(chē)運(yùn)行圖的鋪畫(huà)和調(diào)整的程序。最后給出了本程序在上海軌道交通八號(hào)線(xiàn)上的仿真實(shí)現(xiàn)結(jié)果。
總體結(jié)構(gòu)采用模塊化設(shè)計(jì),便于系統(tǒng)的維護(hù),也有利于系統(tǒng)以后的功能擴(kuò)展。在系統(tǒng)中,車(chē)站計(jì)劃員和工作站操作員要實(shí)時(shí)了解列車(chē)的運(yùn)行情況,并在需要的時(shí)候?qū)\(yùn)行進(jìn)行調(diào)整操作,因此運(yùn)行圖部分關(guān)鍵技術(shù)包括列車(chē)運(yùn)行圖編制、列車(chē)運(yùn)行圖調(diào)整、列車(chē)運(yùn)行圖輸出及數(shù)據(jù)管理四部分[3]。整體結(jié)構(gòu)如圖1所示。
軟件采用MVC三層架構(gòu),分為數(shù)據(jù)層、控制層和視圖層。其中數(shù)據(jù)層和數(shù)據(jù)庫(kù)、XML文件的交互,為控制層提供數(shù)據(jù)??刂茖迂?fù)責(zé)接受用戶(hù)的控制信息并對(duì)數(shù)據(jù)層提供的數(shù)據(jù)進(jìn)行整合。視圖層負(fù)責(zé)運(yùn)行圖的鋪畫(huà)和展示工作。
其中視圖層是整個(gè)系統(tǒng)的核心,列車(chē)運(yùn)行圖涉及許多方面的編圖數(shù)據(jù)(列車(chē)信息、車(chē)站信息、線(xiàn)路信息、車(chē)庫(kù)信息、列車(chē)時(shí)刻表信息和圖形顯示信息等)的處理和結(jié)果輸出的處理(編調(diào)圖數(shù)據(jù)庫(kù)管理、運(yùn)行圖人工調(diào)整、運(yùn)行圖輸出、列車(chē)時(shí)刻表輸出以及指標(biāo)統(tǒng)計(jì)),這些都在控制層中完成[5][8]。
(1)系統(tǒng)框架設(shè)計(jì)。本系統(tǒng)采用了MFC的文檔/視圖結(jié)構(gòu)為框架進(jìn)行開(kāi)發(fā)。主要圖形數(shù)據(jù)放在CGraphDoc類(lèi)(從CDocument派生的文檔類(lèi))中;在CDisplayView視圖(運(yùn)行圖顯示與調(diào)圖視圖)中用圖形數(shù)據(jù)對(duì)象提供的接口對(duì)圖形數(shù)據(jù)進(jìn)行顯示輸出,即顯示/打印運(yùn)行圖,并在調(diào)圖操作時(shí)對(duì)數(shù)據(jù)對(duì)象進(jìn)行修改;在CGraphView視圖(站名與區(qū)間信息視圖)中,同樣調(diào)用圖形數(shù)據(jù)對(duì)象接口顯示車(chē)站和區(qū)間信息。由于車(chē)站信息也是運(yùn)行圖的一部分,兩視圖顯示的位置必須一致,二者就依賴(lài)于文檔類(lèi)中的圖形數(shù)據(jù)進(jìn)行統(tǒng)一。
(2)運(yùn)行圖調(diào)整子系統(tǒng)的模塊設(shè)計(jì)。一般來(lái)說(shuō)調(diào)整系統(tǒng)包含這樣一些功能:運(yùn)行圖圖形顯示和操作,運(yùn)行線(xiàn)的調(diào)整,周轉(zhuǎn)關(guān)系的調(diào)整,調(diào)整約束檢測(cè),和其他一些輔助功能[4]。
圖2描述了運(yùn)行圖調(diào)整子系統(tǒng)的模塊框架以及各個(gè)子模塊之間的相互關(guān)系,圖中細(xì)箭頭標(biāo)示控制流,粗箭頭表示數(shù)據(jù)流。該調(diào)圖子系統(tǒng)與主系統(tǒng)之間只有數(shù)據(jù)信息的關(guān)聯(lián),是松耦合結(jié)構(gòu),因此只要數(shù)據(jù)通訊接口統(tǒng)一,該調(diào)圖子系統(tǒng)完全可以整合到任何編圖系統(tǒng)框架之下。在調(diào)整系統(tǒng)內(nèi)部,分為顯示和調(diào)整兩大模塊,顯示模塊完成運(yùn)行圖圖形顯示和操作,調(diào)整模塊完成運(yùn)行線(xiàn)的調(diào)整,周轉(zhuǎn)關(guān)系的調(diào)整,這兩個(gè)個(gè)模塊均以運(yùn)行圖對(duì)象為數(shù)據(jù)基礎(chǔ),而數(shù)據(jù)對(duì)象則根據(jù)TimeTable生成。顯示與調(diào)整模塊兩者互不干涉的完成顯示和人工干預(yù)的功能,但兩者常常需要通信,因?yàn)檎{(diào)整?;谶\(yùn)行圖顯示。
圖2 運(yùn)行圖調(diào)整子系統(tǒng)的模塊圖
(3)運(yùn)行圖數(shù)據(jù)結(jié)構(gòu)。由運(yùn)行圖的組成元素可以將運(yùn)行圖作為一個(gè)大的對(duì)象(TrainGraph),其內(nèi)部包含了運(yùn)行圖網(wǎng)格(Grid)、運(yùn)行線(xiàn)(Train Line)、周轉(zhuǎn)線(xiàn)(Circulation)、到發(fā)時(shí)刻點(diǎn)等對(duì)象。運(yùn)行圖的所有相關(guān)操作都要通過(guò)運(yùn)行圖對(duì)象來(lái)完成。因此可設(shè)計(jì)各對(duì)象的關(guān)系如下圖3。
圖3 運(yùn)行圖內(nèi)部對(duì)象關(guān)系
這個(gè)結(jié)構(gòu)是符合一般運(yùn)行圖編制軟件的普遍要求的,運(yùn)行圖中的元素是可增加的,而且具有較好的可擴(kuò)展性,不論是用面向?qū)ο蠡蚍敲嫦驅(qū)ο蟮恼Z(yǔ)言都可以很容易實(shí)現(xiàn)。
實(shí)際實(shí)現(xiàn)時(shí),運(yùn)行圖在接收參數(shù)TimeTable后,就由TimeTable產(chǎn)生了運(yùn)行線(xiàn)集合并保存在鏈表中。其內(nèi)部到發(fā)時(shí)刻保存在數(shù)組中,周轉(zhuǎn)線(xiàn)沒(méi)有獨(dú)立成為一個(gè)對(duì)象,而是作為運(yùn)行線(xiàn)的一個(gè)屬性。
所以設(shè)計(jì)時(shí)所有顯示及調(diào)圖操作基本上都圍繞這兩個(gè)類(lèi):
CtrainGraph類(lèi):負(fù)責(zé)整幅運(yùn)行圖的操作,包括建立運(yùn)行圖對(duì)象、格式設(shè)置、顯示比例設(shè)置、繪制整幅圖、車(chē)站及區(qū)間信息顯示等操作。
CtrainLine類(lèi):其對(duì)象表示運(yùn)行圖中各段線(xiàn)路。該類(lèi)負(fù)責(zé)線(xiàn)路的繪制、擦除,提供調(diào)圖操作所需的必要接口。
(4)運(yùn)行圖的輸出與調(diào)整。①運(yùn)行圖信息。本設(shè)計(jì)利用XML文件保存運(yùn)行圖顯示和運(yùn)行圖調(diào)整的內(nèi)容,在主系統(tǒng)與子系統(tǒng)交互的數(shù)據(jù)和信息是由參數(shù) TimeTable來(lái)關(guān)聯(lián)的,TimeTable是從XML讀取的一種保存了運(yùn)行圖顯示和運(yùn)行圖調(diào)整內(nèi)容的數(shù)據(jù)結(jié)構(gòu)。XML文件存儲(chǔ)的數(shù)據(jù)如下所示:
<TimeTableLists>
<Name>時(shí)刻表 1</Name> //時(shí)刻表名稱(chēng)
<TimeTable>
<ID>801</ID> //列車(chē) ID
<Record>
<Line>39</Line> //運(yùn)行線(xiàn)路
<Platform>HTM-PS23</Platform> //停靠站臺(tái)名
<Arrival>05∶14∶00</Arrival> //到站時(shí)間
<Departure>05∶14∶00</Departure> //離站時(shí)間
</Record>
……
</TimeTable>
<TimeTable>
……
</TimeTable>
</TimeTableLists>②運(yùn)行圖顯示。圖3描述了運(yùn)行圖數(shù)據(jù)結(jié)構(gòu)的從屬關(guān)系,運(yùn)行圖的顯示模塊是建立在運(yùn)行圖對(duì)象結(jié)構(gòu)的基礎(chǔ)之上的,首先對(duì)各對(duì)象實(shí)現(xiàn)各自的OnDraw()函數(shù),運(yùn)行圖顯示則通過(guò)運(yùn)行圖對(duì)象的OnDraw()函數(shù)調(diào)用其內(nèi)部各對(duì)象的OnDraw()來(lái)完成。
實(shí)現(xiàn)時(shí),在運(yùn)行圖對(duì)象(CTrainGraph)中實(shí)現(xiàn)運(yùn)行圖顯示的方法。通過(guò)運(yùn)行圖坐標(biāo)原點(diǎn)在設(shè)備坐標(biāo)系中的坐標(biāo)(CTrainGraph的屬性m_OrgPoint)就可以完成設(shè)備坐標(biāo)系與運(yùn)行圖坐標(biāo)系的映射。Time2Point()與Point2Time()函數(shù)完成了時(shí)間到運(yùn)行圖橫坐標(biāo)的映射。
③運(yùn)行圖調(diào)整。運(yùn)行圖的調(diào)整模塊是運(yùn)行圖系統(tǒng)另一重要的模塊。目前,人機(jī)交互方式在圖形界面下仍然以鼠標(biāo)+鍵盤(pán)為主[11]。雖然很多新人機(jī)交互技術(shù)層出不窮,像手寫(xiě)筆或觸摸屏的發(fā)展,然而鼠標(biāo)+鍵盤(pán)+圖形界面元素(菜單、按鈕等)完全可以對(duì)運(yùn)行圖精確調(diào)整[9][10]。所以每個(gè)調(diào)整圖行的操作,包括運(yùn)行圖的縮放,添加、刪除和移動(dòng)運(yùn)行線(xiàn),增加和刪減停站,變更區(qū)間運(yùn)行時(shí)分等等,都可以分解為一系列連續(xù)或獨(dú)立鍵盤(pán)或鼠標(biāo)的操作。拿平移運(yùn)行線(xiàn)舉例來(lái)說(shuō),它可以是下面一系列鼠標(biāo)操作:按下左鍵選定運(yùn)行線(xiàn)->拖動(dòng)運(yùn)行線(xiàn)->放開(kāi)完成拖動(dòng),也可以是鍵盤(pán)操作:選擇運(yùn)行線(xiàn)->輸入平移位移量->確定完成修改。運(yùn)行圖調(diào)整模塊的設(shè)計(jì)如下圖4所示:
圖4 運(yùn)行圖調(diào)整模塊設(shè)計(jì)
其中GraphCommand類(lèi)提供了鼠標(biāo)按下、移動(dòng),鍵盤(pán)等操作的通用接口,子類(lèi)繼承、實(shí)現(xiàn)這些接口。
另一個(gè)重要的類(lèi)是Memory,它記錄了操作之前的運(yùn)行圖狀態(tài),是為了完成撤銷(xiāo)及恢復(fù)的操作。
實(shí)現(xiàn)時(shí),調(diào)整操作對(duì)象均從GraphCommand對(duì)象繼承,子操作具體實(shí)現(xiàn) GraphCommand的接口,調(diào)用時(shí)只需通過(guò)GraphCommand指針完成,例如鼠標(biāo)移動(dòng)消息響應(yīng)函數(shù)OnMouseMove():
void CmyView ∶∶ OnMouseMove ( UINT nFlags, CPoint point){
……
if(m_pGraphCommand != NULL){
BOOL bRet = m_pGraphCommand ->OnMouseMove( nFlags, ScrollPos, point,… );
}
……
}
調(diào)用前只需確定 m_pGraphCommand的具體操作,如m_pGraphCommand = &DeleteLine;則調(diào)用平移運(yùn)行線(xiàn)操作的OnMouseDelete()。
為了證實(shí)上述程序的有效性,我們選擇上海軌道交通 8號(hào)線(xiàn)2008年列車(chē)運(yùn)行時(shí)刻表的計(jì)劃數(shù)據(jù),并將其保存為結(jié)構(gòu)如表1、表2、表3所示的TimeTable。使用前述程序?qū)ζ溥M(jìn)行處理,得到圖5所示的列車(chē)運(yùn)行圖。
圖5所顯示的列車(chē)運(yùn)行圖中,橫坐標(biāo)代表時(shí)間,縱坐標(biāo)代表列車(chē)所經(jīng)過(guò)的具體車(chē)站,紅色代表上行計(jì)劃線(xiàn),藍(lán)色代表下行計(jì)劃線(xiàn),粉紅色表示實(shí)際上行線(xiàn),淺綠色表示實(shí)際下行線(xiàn)。在時(shí)間軸上的水平線(xiàn)是周轉(zhuǎn)線(xiàn)。從圖中可以看出,通過(guò)自動(dòng)調(diào)整模塊調(diào)整后實(shí)際運(yùn)行線(xiàn)與計(jì)劃運(yùn)行線(xiàn)之間還是有一定偏差,這時(shí)可以運(yùn)用調(diào)整模塊進(jìn)行適當(dāng)?shù)氖謩?dòng)調(diào)整包括跳停、扣車(chē)、調(diào)整運(yùn)行時(shí)分等方法。
從圖中可以看出,此種方式能夠繪制出表達(dá)清晰的列車(chē)運(yùn)行圖。
表1 時(shí)刻表信息
表2 時(shí)刻表信息 (續(xù))
上海地鐵8號(hào)線(xiàn)用于以上系統(tǒng)后所顯示的部分運(yùn)行圖如圖8所示。
圖5 上海地鐵8號(hào)線(xiàn)模擬運(yùn)行圖
[1] 吳洋.晚點(diǎn)情況下地鐵列車(chē)實(shí)時(shí)運(yùn)行調(diào)整及速度控制模式研究[D].西南交通大學(xué),2004.1-2.
[2] 徐煒.計(jì)算機(jī)編制列車(chē)運(yùn)行圖的方法研究[D].大連交通大學(xué),2005.1-2.
[3] 張其亮,陳永生,杜磊.基于編織算法的復(fù)線(xiàn)高速磁浮列車(chē)運(yùn)行圖鋪畫(huà)方法[J].計(jì)算機(jī)應(yīng)用,2011,12(31) 3434~3437.
[4] 倪少權(quán),呂紅霞,劉繼勇.計(jì)算機(jī)編制列車(chē)運(yùn)行圖系統(tǒng)調(diào)整系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)[J].西南交通大學(xué)學(xué)報(bào),2001:36(3):240~244
[5] 高強(qiáng)周.城市軌道交通列車(chē)運(yùn)行圖設(shè)計(jì)實(shí)現(xiàn)與評(píng)價(jià)[D].北京交通大學(xué),2008.11.
[6] 江志彬,徐瑞華,吳強(qiáng),呂杰.計(jì)算機(jī)編制城市軌道交通共線(xiàn)交路列車(chē)運(yùn)行圖[J].同濟(jì)大學(xué)學(xué)報(bào)(自然科學(xué)版),2010,38(5) 692~696.
[7] 徐瑞華,江志彬,朱效潔,吳強(qiáng).城市軌道交通列車(chē)運(yùn)行圖計(jì)算機(jī)編制的關(guān)鍵問(wèn)題研究[J].城市軌道交通研究,2005.(05).31-36.
[8] Kroon Leo,Marofi Gabor,Helmrich Mathiin Retel,et a1.Stochastic improvement of cyclic railway timetables[J].Transportation Research Part B: Methodological, 2008,42(6):553.
[9] 馬建軍,胡思繼,許紅,等.京滬高速鐵路列車(chē)運(yùn)行圖編制基本理論的研究[J].北京交通大學(xué)學(xué)報(bào),2002,26(2):47-50.
[10] Dai Baoqian, Wang Tong, Qin Yueping. “Subway Station Evacuation Simulation System”, International Conference on Measuring Technology and Mechatronics Automation,vol 2, 2009, pp. 396-399.
[11] 汪現(xiàn)雨,陳永生.可復(fù)用的列車(chē)運(yùn)行圖調(diào)整系統(tǒng)的設(shè)計(jì)[J].西南交通大學(xué)學(xué)報(bào),2001,36(3) 240~244.