劉曉鑫,趙祥模,張立成,周 洲
(長安大學 信息工程學院,陜西 西安 710064)
近幾年,我國機動車保有量爆發式增長[1],但機動車檢測行業的檢測效率沒有明顯提升,導致檢測行業提供的服務不能滿足車主的檢測需求。優化機動車檢測調度流程是解決上述矛盾的有效途徑之一。根據P. Brucker等研究可知:機動車檢測調度屬于柔性車間調度問題(flexible job-shop scheduling problem,FJSP),Garey M R等研究結果表明該問題是NP-hard問題。
目前求解FJSP問題的方法主要可歸納為兩類:精確求解和近似求解。精確求解可通過排列組合、分支界定、動態規劃[2]等方法解決,但是只適應于規模較小的情況。在問題規模較大時,多采用近似求解法。S. Zhang等[3]通過改進蟻群算法,提出了增強型蟻群優化元啟發式算法,用來解決作業車間環境下的調度問題。Piroozfard H等[4]通過考慮碳足跡在環境中的排放,提出了一種改進的多目標遺傳算法,優化了工作車間調度問題。Nouiri M等[5]應用粒子群優化算法求解FJSP問題。Lu C等[6]從實際制造企業出發,提出了既考慮產品最大壽命,又考慮能源消耗的混合多目標回溯搜索算法,用于解決置換流車間調度問題。Gao L等[7]為了更好解決焊接行業中的動態調度問題,提出一種混合多目標灰狼優化器。Liu Y等[8]為了釋放系統節能潛力,提升系統效率,提出了一種總電耗和總加權時滯最小化的雙目標調度模型。上述學者針對不同實際環境對相應的FJFP問題進行了解答,但是在機動車檢測領域,針對檢測車間作業調度問題的研究較少。
本文以最小調度完成時間和最大工位資源利用率為目標,結合實際生產環境,采用全局工位優先的原則,對機動車檢測調度流程進行了優化和改進。
機動車檢測調度問題可概括的描述為:將機動車檢測任務安排在不沖突的時間和檢測工位中,同時滿足各種約束。具體地講,有Vn輛機動車要在m個檢測車間進行檢測,每個檢測車間有k個檢測工位。已知每輛機動車在每個檢測工位上的檢測任務及檢測耗時,對Vn輛機動車在m個檢測車間上的檢測順序進行安排,使得Vn輛機動車在完成m個檢測車間的檢測任務后,一些性能指標達到最優化。本文中的最優化指標是:最小化完成時間和最大化資源利用率。
最小化完成時間指:完成最后一輛機動車的最后一項檢測項目的時刻應該盡可能早,即完成所有機動車的檢測任務,檢測車間耗時最短。當Vn輛機動車完成檢測項目申請后,各檢測車間和檢測工位分別要檢測的機動車就已經確定。要使得檢測完成時間最小化,需要通過調度算法,降低檢測工位空轉時間,使得各檢測車間能夠盡快的完成機動車的檢測任務。
最大化資源利用率指在完成Vn輛機動車的檢測任務期間,通過調度算法,盡可能使得各車間各檢測工位能夠時刻保持運轉。換而言之,盡可能降低檢測設備的空轉時間。
為了確保本算法在實際工程中的可操作性,保證檢測車間能夠有序正常運行,需要滿足以下約束:①同一車間內機動車按工位排列順序進行檢測;②不同車間之間機動車可隨意跳轉檢測;③各檢測車間各檢測工位檢測任務各不相同;④同輛機動車同一時刻只能在一個工位接受檢測;⑤設定原子時間,將每個項目的檢測耗時設定為原子時間的整數倍;⑥檢測任務一旦開始不得中斷;⑦如果多個檢測車間,同時競爭同一輛機動車時,當前檢測車間正在檢測的車輛數量少的車間優先;⑧如果多個檢測車間,同時競爭同一輛機動車,并且當前各車間的檢測車輛數量相等時,機動車能夠最先檢測的車間優先,否則隨機選擇一個車間檢測。
由1.1節可知,最小化檢測完成時間和最大化工位資源利用率,均與檢測車間中各檢測工位的運行狀態有關。因此,從檢測工位角度分析和解決問題。
步驟1 將Vn輛機動車在各檢測工位上申請的檢測項目按照檢測工位進行分組。每個檢測工位維護一個檢測車輛隊列,隊列中的機動車按照在該工位申請檢測項目的先后順序依次排列;
步驟2 在滿足1.2節約束條件的前提下,當檢測車間首個檢測工位空閑時,從該工位的檢測車輛隊列中,順序調度機動車進行檢測;
步驟3 當所有機動車完成所申請的檢測任務之前,循環執行步驟2。
基于FIFO策略的機動車檢測調度算法(簡稱為:FIFO)廣泛應用在當今工業環境中,例如:榆林、咸陽、商洛等多地區的10余個機動車檢驗機構的機動車檢測調度算法均是基于FIFO策略的調度方式[9]。FIFO具有理解簡單、易于實現的優點,其算法調度流程可總結如下:
步驟1 將檢測機構所有檢測工位按照某個順序進行排列,得到檢測工位隊列stationArray。檢測工位在stationArray中的順序一旦確定,不可更改;
步驟2 將申請檢測的機動車按照申請時間先后順序排列,得到機動車隊列vehicleArray;
步驟3 從vehicleArray按順序調度機動車,按照檢測工位在stationArray中的順序,依次完成機動車的檢測任務。當前工位的下一個檢測工位繁忙時,機動車必須在當前工位等待,直到下一個檢測工位空閑時才可以進入檢測;
步驟4 當stationArray中第一個檢測工位沒有機動車檢測時,從vehicleArray中調度下一輛機動車進入檢測流程。步驟4在算法調度過程中獨立執行,時刻監控stationArray中第一個檢測工位的狀態;
步驟5 循環執行步驟3,直到完成vehicleArray中所有機動車的檢測任務。
由上述調度流程可知:當采用FIFO調度機動車時,機動車必須順序完成stationArray中的檢測任務,不能出現跳過某個檢測工位,檢測下一個項目的情況。這樣可能導致一個顯著的問題:由于下一個檢測工位處于繁忙狀態,機動車完成當前檢測項目后,繼續在當前檢測工位等待,即使該機動車在下一個檢測工位沒有檢測任務也必須等待。這樣必然導致:需要進入當前工位檢測的機動車,也必須等待已經完成檢測任務的機動車進入下一個檢測工位之后,才能進入當前工位進行檢測。最終導致:機動車等待時間加長、檢測工位空轉時間延長、機動車檢測完成時刻延后、檢測工位資源利用率降低。
因此,有必要引進新的機動車檢測調度策略,克服和優化FIFO帶來的缺陷和不足,縮短檢測完成時間、提升檢測工位資源利用率。
定義1 空閑工位:當前,如果檢測工位沒有對任何機動車執行檢測任務,則稱該檢測工位為空閑工位。此時該檢測工位處于空閑狀態。如果機動車在空閑工位,說明該機動車在等待下一個檢測工位完成檢測任務。
定義2 繁忙工位:如果檢測工位不是空閑工位,則該工位是繁忙工位。此時該檢測工位處于繁忙狀態。
定義3 空轉時間:檢測工位處于空閑狀態的一段時間,稱為該檢測工位的空轉時間。
定義4 繁忙時間:檢測工位處于繁忙狀態的一段時間,稱為該檢測工位的繁忙時間。
定義5 運行時間:檢測工位空轉時間與繁忙時間之和,稱為該檢測工位的運行時間。
定義6 未完成檢測任務機動車隊列:每個檢測工位都維護一個未完成檢測任務機動車隊列(簡記為:stationReVehicles隊列)。將在檢測工位申請檢測的機動車,按照申請時間先后順序排列,得到該檢測工位的stationReVehicles隊列。
定義7 機動車等待狀態:如果機動車正在等待某個檢測工位,則該機動車處于等待狀態。
結合1.1節和第2章節的描述分析可知:為空閑工位選擇機動車調度策略,關乎該調度算法的性能優良。結合空閑工位在實際車間的分布情況與當前機動車的檢測情況,提出全局空閑工位優先策略:
當檢測車間第一個檢測工位處于空閑狀態時,將該檢測工位的stationReVehicles隊列中,處于等待狀態的第一輛機動車,調度到該工位進行檢測。因為在全局范圍內為空閑工位調度機動車,所以稱為全局空閑工位優先。
基于全局空閑工位優先策略,實現機動車檢測的調度算法稱為基于全局空閑工位優先的機動車檢測調度算法(vehicle scheduling algorithm for testing based on global idle station priority,VSABOSP)。由1.2小節(2)、(3),將檢測車間的狀態與該車間首個檢測工位的狀態保持一致。結合上述設定,將VSABOSP各車間具體流程闡述如下:
步驟1 根據Vn輛機動車的申請時間,為每一個檢測工位構建stationReVehicles隊列;
步驟2 在滿足1.2節約束條件的前提下,基于全局空閑工位優先策略,為各檢測車間調度機動車。各檢測車間各檢測工位并行執行檢測任務;
步驟3 當檢測車間首個檢測工位完成檢測任務后,將該檢測工位設置為空閑狀態。然后,同時執行步驟2和步驟4;
步驟4 基于FIFO算法完成機動車在該檢測車間剩余工位的檢測任務;
步驟5 從檢測工位的stationReVehicles隊列中刪除已完成該工位檢測任務的機動車;
步驟6 如果機動車已經完成所有檢測任務,則駛離檢測車間,等候打印報告單;否則,將該機動車設置為等待狀態。
VSABOSP中每個檢測車間并行執行,并且執行流程類似,如圖1所示。

圖1 VSABOS檢測車間流程
機動車數量作為算法的輸入規模,采用基本操作計數法對算法的復雜度進行分析。由3.3節可知,從空閑工位的stationReVehicles隊列中為其選取首輛處于等待狀態的機動車,是本算法的基本操作。對于空間復雜度,以機動車信息作為基本計數單元。
3.4.1 時間復雜度
通過分析VSABOSP調度過程,空閑工位選取機動車的次數與在該檢測工位申請檢測的機動車數量成正比關系。因此,當算法輸入的規模為n時,算法的時間復雜度為
T(n)=O(f(n))=O(n)
(1)
3.4.2 空間復雜度
在VSABOSP調度過程中,每個檢測工位的stationReVehicles隊列中均維護在該工位有檢測任務的機動車信息。因此,對于n輛機動車在m個檢測工位進行檢測的情況,算法的空間復雜度為
S(n)=O(f(n,m))=O(n*m)
(2)
采用數學歸納法對VSABOSP的高效性進行證明。由1.2小節和3.3小節可知,檢測車間狀態與該車間首個檢測工位狀態一致;車間完成檢測的時刻與該車間最后一個檢測工位完成檢測的時刻一致。
在下面證明之前,結合工業實際,作如下假設:
假設1:算法在3個檢測車間內調度,檢測車間分別為車間a、車間b、車間c。車間a、b、c僅表示車間代號,無實際意義。
假設2:申請檢測的機動車數量為Vn。其中Vn為整數,取值范圍:Vn∈[1,+∞]。
假設3:FIFO按照車間a、車間b、車間c的順序調度。
(1)當Vn=1時:此時,只有一輛機動車,由假設1可得:任何檢測順序都是等價的。因此,以車間a、b、c的順序進行檢測。檢測調度Gantt圖,如圖2所示。

圖2 Vn等于1
此時,VSABOSP和FIFO的調度耗時,均為任務1、任務2、任務3三者檢測耗時之和。即VSABOSP調度時間不會大于FIFO。
(2)假設當Vn=n-1時,VSABOSP比基于FIFO的檢測調度算法高效。
用集合 {0,1,2} 中的元素組合表示車間a、b、c在完成自身車間最后一輛機動車檢測任務的時刻先后順序。每個車間可以取集合 {0,1,2} 中的任意值。例如:組合為 (2,0,1), 則表明車間b首先完成檢測任務,然后車間c完成檢測任務,最后車間a完成檢測任務。
無論采用VSABOSP,還是FIFO,當完成n-1輛機動車的檢測調度任務后,各檢測車間的完成時刻組合,見表1。

表1 車間完成檢測時刻組合
(3)當Vn=n時:將當完成n-1輛機動車的檢測任務時,FIFO在車間a、b、c的完成時刻分別記為:TFa(n-1)、TFb(n-1)、TFc(n-1); VSABOSP在車間a、b、c的完成時刻分別記為:TSa(n-1)、TSb(n-1)、TSc(n-1)。 第n輛機動車在車間a、b、c的檢測耗時為Ta、Tb、Tc。
由假設3可知,對于FIFO,車間a的首個檢測工位是整個算法的起始工位。根據3.3節步驟3可知,存在“車間a的首個檢測工位已經完成某輛機動車的檢測任務,但是該檢測工位空轉,等待下一個工位空閑”的情況。這樣必然導致車間a完成n-1輛機動車的檢測時刻延后,即車間a的完成時間加長。所以,當完成n-1輛機動車的檢測任務時,TFa(n-1)與TSa(n-1)之間滿足如下不等式
TFa(n-1)≥TSa(n-1)
(3)
同理
TFb(n-1)≥TSb(n-1)
(4)
TFc(n-1)≥TSc(n-1)
(5)
結合表1和式(3)~式(5)可得到:當完成n-1輛機動車的檢測任務時,如果VSABOSP各車間的完成時刻為表1中的 (x,y,z), 則FIFO各車間的完成時刻為在表1中的可能取值為 (x,y,z) 及其同一行右側和同一列下方包圍區域的所有組合。例如:VSABOSP各車間的完成時刻組合為 (0,0,0), 則FIFO可以取表1中的任意情況。
VSABOSP完成第n輛機動車的結束時刻為
TS(n)=min{TSa(n-1),TSb(n-1),TSc(n-1)}+Ta+Tb+Tc
(6)
FIFO完成第n輛機動車的結束時刻為
TF(n)=TFa(n-1)+Ta+Tb+Tc
(7)
分情況討論式(6)、式(7)的大小關系:
情況1:TSa(n-1)≥TSb(n-1)或者TSa(n-1)≥TSc(n-1)。
結合式(3)可得TS(n)與TF(n)的關系
TS(n)≤TSa(n-1)+Ta+Tb+Tc≤TFa(n-1)+Ta+Tb+Tc=TF(n)
(8)
情況2:TSa(n-1) 結合式(3)可得TS(n)與TF(n)的關系 TS(n)=TSa(n-1)+Ta+Tb+Tc≤TFa(n-1)+Ta+Tb+Tc=TF(n) (9) 對比式(8)和式(9)可得:最壞情況下,VSABOSP與FIFO調度效率一樣,其它情況下VSABOSP會表現的更高效。 對Vn輛機動車的檢測任務,分別采用FIFO和VSABOSP進行模擬實驗仿真,其中Vn的取值范圍為:Vn={5,10,20,30,40,50,60,70,80,90,100}。 實驗環境為Windows 10 專業版64 位操作系統,Intel?CoreTMi7-6800K CPU @ 3.40 GHz 處理器,16 GB RAM。使用JDK1.8.0_171編碼實現。 VSABOSP調度偽代碼由VSABOSP主算法、testing子算法、findVehicleForWorkshop子算法3部分組成。其中,VSABOSP主算法用于協調各子算法之間的調度關系,控制程序起止;testing子算法模擬檢測車間檢測機動車;findVehicleForWorkshop子算法用于在滿足1.2節約束條件的前提下,為各檢測車間調度機動車。為了更好闡述算法流程,將調度過程中涉及到的對象進行定義。 4.1.1 對象定義 檢測項目對象,定義如下: Class Item { String name; // 檢測項目名稱 int time; // 檢測耗時 } 檢測工位對象,定義如下: Class Station { int currTime; // 最后一輛機動車完成檢測的時刻 boolean idle; // true: 空閑狀態 (默認); false: 繁忙狀態 List Vehicle veh; // 在該工位正在檢測的機動車 } 機動車對象,定義如下: Class Vehicle { int currTime; // 上一個項目檢測完畢時刻 boolean wait; // true: 等待狀態 (默認); false: 檢測狀態 boolean finish; // true: 完成檢測; false: 未完成檢測 (默認) Map 檢測車間對象,定義如下: Class Workshop { List boolean idle; // true:空閑狀態 (默認); false: 繁忙狀 } 4.1.2 VSABOSP主算法 在機動車檢測調度過程中,建立3個用于輔助程序調度的緩存隊列: 等待隊列:保存完成項目申請之后,開始檢測之前的機動車集合。隊列中,機動車按照項目申請完成時刻的先后順序排列。簡記為:waitQueue。 一級緩存:保存正在檢測工位檢測的機動車集合。隊列中,機動車按照進入當前正在檢測工位時刻的先后順序排列。簡記為:cache1。 二級緩存:保存一級緩存中完成檢測任務,處于等待狀態的機動車集合。隊列中,機動車按照完成上一個檢測任務的先后順序排列。簡記為:cache2。 VSABOSP主算法偽代碼,如下所示: VSABOSP主算法: 輸入:waitQueue 等待隊列, wsList 檢測車間列表 (1)functionmain (waitQueue, wsList) (2)cache1和cache2初始化為空 (3)while存在未檢測完畢的機動車do (4) 清除cache1中狀態為finish的所有機動車 (5)foreachworkshop ∈ wsListdo (6) 調用findVehicleForWorkshop子算法 (7) 調用testing子算法 (8)endfor (9)endwhile (10)endfunction 4.1.3 testing子算法 testing子算法: 輸入:workshop檢測車間 (1)functiontesting (workshop) (2) vehicle ← 在車間首個工位檢測的機動車 (3)ifvehicle != nullthen (4)foreachstation∈ workshop.stationsdo (5) items ← 獲取vehicle在station工位的檢測項目 (6)foreachitem∈ itemsdo// 模擬檢測機動車的每個檢測項目 (7) 更新station和vehicle的當前時間.curr-Time (8)endfor (9)ifvehicle完成所有檢測任務then (10) vehicle.finish ← true (11)else (12) vehicle.wait ← true (13) 將vehicle添加到cache2 (14)endif (15) 更新車間狀態 (16) 工位狀態更新為空閑 (17)endfor (18)endif (19)endfunction 4.1.4 findVehicleForWorkshop子算法 為檢測車間調度機動車時,除了滿足1.2節的約束條件,機動車還需要滿足兩個點要求:①機動車在檢測車間有檢測項目;②機動車處于等待狀態。將滿足上述要求的機動車記為:滿足要求的機動車。由3.5節可知,檢測車間的狀態與該車間首個檢測工位的狀態保持一致。 在滿足1.2節的約束條件下,實現VSABOSP,將機動車被調度的優先級[10]由高到低設置為: cache1>cache2>waitQueue findVehicleForWorkshop子算法偽代碼,如下所示: findVehicleForWorkshop子算法: 輸入:workshop車間,cache1一級緩存, cache2二級緩存, waitQ等待隊列 (1)functionfindVehicleForWorkshop(workshop, cache1, cache2, waitQ) (2)while車間空閑do (3) vehicle ← 從cache1選取滿足要求的機動車 (4)ifvehicle存在then (5) 將機動車調度到車間第一工位準備檢測 (6) 更新車間、工位、機動車的檢測狀態 (7)return (8)else (9)ifcache2中存在滿足條件的機動車then (10) 將cache2中滿足要求的機動車,添加到cache1 (11)continue (12)else (13)ifwaitQ中存在滿足條件的機動車then (14) 將waitQ中滿足要求的機動車,添加到cache1 (15)continue (16)else (17)return (18)endif (19)endif (20)endif (21)endwhile (22)endfunction 參考國家在機動車檢測領域的政策法規[11-14],機動車檢測主要分為3種檢測線:安全性能檢測線(以下簡稱:安檢)、綜合性能檢測線(以下簡稱:綜檢)、環保尾氣檢測線(以下簡稱:環檢)。通過政策解讀發現:綜檢與安檢,綜檢與環檢的項目之間發生重合,例如:尾氣檢測既要在綜檢進行檢測,又要在環檢進行檢測。抽取安檢、綜檢、環檢的公共檢測項目,對比政策規定的項目檢測最短時間與項目在工業實踐中的檢測耗時,將檢測項目與檢測耗時進行總結,見表2。 表2 檢測項目檢測耗時/min 為了提高算法實用性,結合榆林、商洛、咸陽機動車檢測站的布局,采用3個車間模擬,即環檢車間、安檢車間、綜檢車間。其中環檢車間負責:尾氣檢測;安檢車間依次負責:外廓尺寸、制動、前照燈、轉向輪橫向側滑量的檢測;綜檢車間依次負責:燃料消耗量、車速表誤差、動力性、聲級的檢測。 對5輛機動車,針對表2中的檢測項目,分別使用VSABOSP和FIFO進行調度。分別得到5輛機動車在各車間的調度過程,如圖3、圖4所示。 圖3 FIFO算法 圖4 VSABOSP 在VSABOSP調度過程中,機動車在檢測工位、waitQueue隊列、cache1隊列和cache2隊列中的變化情況,見表3。 首先,為Vn輛機動車申請表2中的所有檢測項目,得到Vn輛機動車的檢測任務,其中Vn={5,10,20,30,40,50,60,70,80,90}。 然后,將Vn輛機動車分別采用VSABO-SP 和FIFO進行調度,得到檢測調度信息。最后,對檢測調度信息進行對比分析,得到算法性能優劣對比相關圖表,如表4、圖5~圖8所示。 其中,理論耗時指:Vn輛機動車理論上的檢測耗時之和,即每輛機動車的檢測耗時通過表2中項目檢測耗時求和得到。調度結束時間指:從開始檢測到完成Vn輛機動車檢測調度任務之間的時間。空轉時間指:檢測過程中所有工位空轉時間之和。平均調度時間指:在完成Vn輛機動車的檢測調度任務后,所有車間結束檢測時間之和與Vn之間的比值。利用率指:在完成Vn輛機動車的檢測調度任務后,Vn輛機動車的理論耗時與所有檢測工位運行時間總和之間的比值。 由表4可知,檢測調度結束時間比理論耗時短,結合圖3和圖4,分析可得:同一時刻,有多輛機動車在多個檢測工位上并發進行檢測。相比于FIFO,VSABOSP將串行化轉化為并行化執行。根據文獻[15-17]的研究,并行化方法的效率要優于線性化方法,因此 VSABOSP的性能要高于FIFO。 表3 實例調度時刻/min 表4 算法仿真性能對比/min 為了更直觀的對比VSABOSP和FIFO的性能差異,將表4數據繪制成圖。圖5是調度完成時刻對比圖,圖6是平均調度時間對比圖,圖7是檢測工位總空閑時間對比圖,圖8是資源利用率對比圖。 如圖5所示,在相同調度任務的前提下,VSABOSP比FIFO調度完成時間更短。從側面說明,在相同條件下,采用VSABOSP,檢測機構每天可以完成更多機動車的檢測任務,能夠提升檢測機構的檢測能力。 圖5 調度完成時刻對比 圖6 平均調度時間對比 如圖6所示,在相同調度任務的前提下,VSABOSP的平均調度時間遠低于FIFO。表明,在相同條件下,VSABO-SP的檢測效率更高,相同時間內,可以完成更多機動車的檢測調度任務。 如圖7所示,在相同調度任務的前提下,VSABOSP的工位空轉時間遠低于FIFO。表明,在相同條件下,采用 VSABOSP 檢測工位空轉時間更短,檢測設備的利用率更高。 圖7 工位空閑時間對比 圖8 資源利用率對比 如圖8所示,在相同調度任務的前提下,VSABOSP的資源利用率遠高于FIFO。表明,在相同條件下,采用 VSABOSP 檢測設備的資源利用率更高,減少了資源浪費現象。 針對當前機動車檢測機構檢測效率不高,車主等待時間過長的問題,基于全局工位優先原則,提出了一種基于全局工位優先的機動車檢測調度算法(VSABOSP),并對算法的時間復雜和空間復雜性進行了分析。然后,采用數學歸納法驗證VSABOSP算法在最差情況下性能與FIFO一致,其余情況下要優于FIFO。最后,分別采用實例分析和仿真實驗的方式對算法性能做進一步分析對比。 研究結果表明,相比于FIFO,VSABOSP,調度效率至少提升45%、工位空閑時間降低50%,資源利用率提升一倍,為機動車檢測行業提供了調度優化方案。 在下一階段,將對多檢測車間多檢測線情況下的機動車檢測調度進行優化探索。4 仿真實驗
4.1 VSABOSP偽代碼
4.2 實驗數據

4.3 實例分析


4.4 仿真分析






5 結束語