◎ 林錦暉,陳智偉,何曉濤
(廣州港集團股份有限公司南沙糧食通用碼頭分公司,廣東 廣州 511462)
廣東省廣州市某散貨碼頭續建二期筒倉工程,建設完成后將擁有淺圓筒倉與立筒倉合計170 余個,倉容合計約900 000 t,筒倉規模十分龐大。整片筒倉區域的工藝設備主要以皮帶輸送機和斗提機為主,其中皮帶輸送機合計將近100 臺次,斗提機合計20 余臺次,各種閘門、犁頭卸料裝置等附屬設備數量眾多,整套工藝系統包含了進倉、出倉、倒倉、裝車和直走等多種工藝類型,設備的繁雜與工藝類型的多樣性必然產生大量的工藝流程。不僅如此,整套工藝系統的交叉工藝點達10 余個之多,而且一些設備擁有正反轉兩種工況,由此產生的工藝流程數量將以成倍遞增,達到一個十分龐大的數字。在此背景下,需要研究一種算法用于解決電氣自動控制系統工藝流程的選擇與生成難題。工藝流程的準確與全面關系到整個電氣自動化控制系統的安全性與穩定性,為此,本文闡述了一種針對工藝流程計算的全新高效的解決方案。解決方案的實現方式有多種,本文主要討論運算思路。
迷宮算法的思路:利用0 和1 的矩陣構建一個簡易“迷宮”,如圖1 所示。其中1 表示迷宮里的“墻”,0 表示迷宮里的“路”,破解這一“迷宮”本質上就是要循著0 從入口尋找路徑達到出口。此類“迷宮”一般具有的特點:①“尋路”過程中,相鄰點之間具有絕對的前后對應關系,簡言之就是具有方向性。②每個點向前“走”的方向可能不止一個,換言之就是同時符合需求的路徑可能不止一條。因此,要破解此類“迷宮”的所有路徑,需要注意:①使用堆棧或者指針來進行數據存儲,表征方向性[1]。②走過路徑的點的值置1,避免走重復路徑。③通過原路返回,搜尋其他可能的路徑,直至所有路徑上的點都置1,最終將返回入口點。

圖1 迷宮示意圖
破解“迷宮”所有路徑的思路邏輯如圖2 所示。
以圖1“迷宮”為例,按照圖2 的思維邏輯導圖,整個尋找路徑的完整過程如圖3 所示。由此可以尋找到兩條路徑并生成路徑記錄。

圖2 迷宮“尋路”思維邏輯圖

圖3 過程路徑示意圖
利用迷宮算法來尋找工藝流程的路徑,首先需要利用工藝設備搭建起工藝流程的“迷宮”。結合上文提到的“迷宮”的特點,可以類比出:搭建工藝流程的“迷宮”需要確定所有設備之間的前后關系。本次案例運用了EXCEL 進行所有工藝設備前后關系的統計,如圖4 所示。所有工藝設備組合產生的前后關系合計1 596 對。
每組前后關系實際上代表著工藝流程的走向,在尋找首、尾設備之間的工藝流程路徑的過程中,為了避免重復尋找同一條路徑,應該對應每組前后關系設置一個標志位(圖中所示的“選中狀態”一列)。此標志位在初始化階段中置0,代表所有前后關系都是可用的,所有路徑都是通路。在尋找工藝流程路徑的過程中,走過的每一組前后關系都置1,作用是避免重復走入同一條路徑,致使程序進入死循環。

圖4 工藝設備前后關系整理圖
每走一步,判斷后設備是否與尾設備相同,相同即表示成功找到一條工藝流程,原路返回繼續尋找其他通路是否存在所需的工藝流程路徑;不同即繼續向后尋找,直到返回至前后關系的前設備等于首設備,代表所有路徑已經找出,工藝流程的生成過程完成,輸出結果。以上可以總結歸納出如圖5 所示的思維邏輯導圖。
應用EXCEL 的開發工具,采用VBA 語言,圖5所展示出來的核心邏輯的程序代碼如下:
Public Sub FlowAdd(ByVal a As String, ByVal n As Integer, ByRef FlowStack() As String)
Dim sht As Worksheet, m As Integer, j As Integer, s As Integer
Set sht = Worksheets(Range(“M4”).Value)
m = Application.WorksheetFunction.CountIfs(Range(“A2:A” & _
Range(“A1048576”).End(xlUp).Row), _
a, Range(“H2:H” & Range(“A1048576”).End(xlUp).Row), 0)
If m = 0 Then ‘判斷此路徑是否走過,判斷此路是否通
If n = 1 Then ‘回到原點說明歷遍過程已完成‘MsgBox “流程設備已生成完畢!”
Else
a = FlowStack(n - 1)
n = n - 1
Call FlowAdd(a, n, FlowStack())
End If
Else
FlowStack(n) = Range(“A” & j) ‘設備編號依次放入數據存儲
Range(“H” & j).Value = 1 ‘走過的路徑賦值1

圖5 工藝流程“尋路”思維邏輯圖
n = n + 1 If Range(“B” & j) = Range(“M3”) Then
‘找到路徑
FlowStack(n) = Range(“B” & j)
s = sht.Range(“A1048576”).
End(xlUp).Row
目前,東營市不少農民合作社都是白手起家,社員數量少,生產規模小,經濟實力較弱,在資金融通、技術引進、設施改造、市場開拓上面臨很大困難,導致帶動輻射能力弱。
For t = 1 To n
sht.Cells(s + 1, t + 5) = FlowStack(t)
sht.Cells(s + 1, 1) = s
sht.Cells(s + 1, 2) = FlowStack(1)
sht.Cells(s + 1, 5) = FlowStack(n) ‘找到路徑并填充
Next
a = FlowStack(n - 1) ‘繼續尋找其他路徑
n = n - 1
Call FlowAdd(a, n, FlowStack())
Exit Sub
Else
a = Range(“B” & j)
Call FlowAdd(a, n, FlowStack()) ‘路徑未走完,繼續向前走
Exit Sub
End If
End If
Next
End If
End Sub
以上核心算法搭配遞歸運算與循環運算,即可同時生成多個首設備與多個尾設備之間的工藝流程,最大限度的提高運算效率。核心循環運算已包含在以上的核心算法里。遞歸運算程序以及一些基本的錯誤判斷,如下所示:
Public Sub FlowCreate()
Application.EnableEvents = False ‘關閉事件響應
Dim i As Integer, a As String, j As Integer, FlowStack() As String, sht1 As Worksheet
a = UCase(Range(“M2”).Value)
ReDim FlowStack(1 To 100)
Set sht1 = Worksheets(Range(“M4”).Value)
For i = 2 To Range(“A1048576”).End(xlUp).Row
Range(“H” & i) = 0 ‘全部路徑賦值0,初始化
Next
If Application.Work sheet Function.CountIf(Range(“A2:A” & Range(“A1048576”).End(xlUp).Row), _
Range(“M2”)) = 0 Or Application.WorksheetFunction.CountIf(Range(“B2:B” & _
Range(“A1048576”).End(xlUp).Row), Range(“M3”)) = 0 Then ‘判斷首尾設備是否合法
MsgBox “設備編號填寫錯誤,請重新填寫!”
Exit Sub
Else
Call FlowAdd(a, 1, FlowStack()) ‘判斷此設備組合合法后傳遞參數,進入遞歸函數
End If
Application.EnableEvents = True ‘打開事件響應End Sub
最終的使用情況如圖6 所示,在首設備列表與尾設備列表里分別設置需要尋找工藝流程路徑的首尾設備,即可進行工藝流程生成運算。

圖6 設置首尾設備圖
以上首尾設備列表對應生成的運算結果如圖7 所示。通過人工校對驗證,工藝流程生成的結果十分準確。

圖7 運算結果示例圖
在本文的案例中,二期筒倉續建工程完成后,項目的電氣自動控制系統涉及皮帶輸送機合計將近100臺次,斗提機合計20 余臺次,各種閘門、犁頭卸料裝置等附屬設備數量眾多。運用該套解決方案來進行工藝流程的運算與統計,配合人工統計以輔助,成功統計出650 000 余條工藝流程。相對于續建前合計 60 000 余條工藝流程,續建后的工藝流程數量增長了10 倍,該項成果為整套系統的電氣自動化控制打下了穩定的數據基礎。此外,利用該套解決方案針對續建前的工藝設備進行一次工藝流程統計運算,將得出的結果與原工藝流程數據庫進行對比,工藝流程的數量與結果完全一致,進一步驗證了該套算法的準確性。
該算法運用了遞歸運算與循環運算來進行多組設備路徑計算與完全路徑計算。在進行大量的工藝流程計算時,可能出現內存溢出的情況導致程序崩潰。為了避免這一情況的出現,需要人工分組規劃好設備組,分批次進行運算。例如,每次只計算單獨一排筒倉的出倉工藝流程,分數次完成整片立筒倉區域的出倉工藝流程計算。
程序的進一步優化,應該考慮根據不同路徑所產生的效率與能耗差別,針對每組前后設備關系設置權重系數,在工藝流程計算時,優先尋找權重系數高的工藝流程路徑,并在生成的結果中進行排序,有利于提高工藝效率與降低作業能耗。