為了優(yōu)化鉆井流程并降低作業(yè)成本,Baker Hughes的動力學與遙測(Dynamics & Telemetry)小組開發(fā)了一個序列預(yù)測算法,用于在鉆井作業(yè)期間快速可靠的解碼井下數(shù)據(jù)。這個已集成到公司地面系統(tǒng)的高級解碼算法為隨鉆測量(measurement while drilling,MWD)方法提供了支持。使用MWD時,可以收集寶貴的方位數(shù)據(jù)和地層數(shù)據(jù),以用來優(yōu)化鉆井流程。該系統(tǒng)支持更準確地定位井眼,這可以使鉆井作業(yè)更具成本效益,并使操作員可以較少的非生產(chǎn)時間(NPT)鉆更復(fù)雜的井。
工程團隊使用一種桌面科學計算軟件設(shè)計序列預(yù)測算法,將其自動轉(zhuǎn)換為C代碼,然后部署到屬于地面系統(tǒng)一部分的一臺實時PC上。在科學計算軟件中開發(fā)和調(diào)試該算法后,工程師通過自動生成所需的C代碼來加速實現(xiàn)過程。
此工作流程不再需要用兩種語言維護和測試同一個算法,因此縮短了開發(fā)流程。更重要的是,此工作流程降低了用手工編寫C代碼的一種主要風險,即原始科學計算算法和最終設(shè)計中實現(xiàn)的C代碼之間的差異。使用此工作流程的一大優(yōu)勢是小組在修復(fù)缺陷上所花的時間減少了。質(zhì)量和開發(fā)速度的提升使小組堅定了在未來的項目中重用算法和開發(fā)流程的打算。
使用馬爾可夫鏈(Markov Chains)進行序列預(yù)測
序列預(yù)測的一個常見應(yīng)用是使用以前的數(shù)據(jù)來預(yù)估未來的數(shù)據(jù)點。序列預(yù)測算法在許多行業(yè)和許多情形中都會用到,例如基于測量數(shù)據(jù)的溫度曲線外推,或者在與最大似然序列估算器進行數(shù)字通信時,從噪聲信號中提取有用的信息。序列預(yù)測需要一個模型來預(yù)測未來數(shù)據(jù),如馬爾可夫鏈。使用馬爾可夫鏈建模的系統(tǒng)占用有限的狀態(tài)數(shù),從而使未來的數(shù)據(jù)點僅取決于目前的狀態(tài)而不是以前的狀態(tài)。
在圖1中,使用馬爾可夫鏈建模的序列預(yù)報器具有4個狀態(tài)。從一個狀態(tài)轉(zhuǎn)換到另一個狀態(tài)的可能性用小數(shù)表示。例如,從狀態(tài)1轉(zhuǎn)換為狀態(tài)2的概率為0.95,而保持在狀態(tài)1的概率為0.05。在轉(zhuǎn)換時,可能會有一個或多個路徑。圖1中顯示的序列預(yù)報器可作為有限的狀態(tài)機來實現(xiàn),它的最形象的表達就是格狀圖。
圖2顯示的是一個可能的(預(yù)測的)狀態(tài)序列。虛線箭頭表示可能的轉(zhuǎn)換,實線箭頭表示實際預(yù)測的轉(zhuǎn)換。此圖顯示可能的序列為[1 2 3 4 4 3 3 1]。請注意,僅顯示部分可能的轉(zhuǎn)換來進行說明。與著名的Viterbi算法類似,序列預(yù)報器通過基于外部質(zhì)量標準計算路徑度量來拒絕不大可能的序列路徑。如果兩個或多個路徑在一個狀態(tài)中相交,則累積并比較它們的路徑度量值,將最佳路徑選為幸存路徑。
工程團隊在技術(shù)計算軟件中為序列預(yù)測實現(xiàn)馬爾可夫鏈,以提高其地面解碼軟件的可靠性。
算法開發(fā)工作流程
在傳統(tǒng)的手工編碼工作流程中,會用C代碼重寫原始科學計算算法和測試框架,并且必須對C代碼進行測試和調(diào)試。在新的工作流程中,C代碼會從技術(shù)計算軟件中自動生成,從而節(jié)約了時間并可防止編碼錯誤(圖3)。
圖3.傳統(tǒng)的手工編碼工作流程(左)和新的自動代碼生成工作流程(右)
在一個典型的情景中,自動代碼生成工作流程可將開發(fā)和測試最終產(chǎn)品中實現(xiàn)的算法的總時間縮短近40%(圖4)。
圖4.各個流程階段花費時間百分比
對于這個特定的項目,新的工作流程的開始是工程團隊在科學計算軟件中快速探索新創(chuàng)意。在確定最佳方法后,他們使用同一款軟件來建立一個通用序列估算算法的原型。然后進一步擴展該算法,以用于MWD系統(tǒng)的地面PC上。在進行到下一個階段之前,工程部門使用已納入同一軟件中的測試框架內(nèi)的多種測試案例來測試算法,以驗證它是否符合要求和規(guī)范。
通過自動代碼生成來實現(xiàn)
傳統(tǒng)手工編碼流程的許多缺點迫使工程團隊去尋找一種替代流程來開發(fā)序列預(yù)測算法。首先,手工編碼非常耗時,并且在緊張的截止日期臨近時,為了留出時間給重要而又耗時的集成測試,團隊需要將開發(fā)時間縮短大約30%。其次,程序員可能會在原始科學計算算法細節(jié)上出現(xiàn)解讀錯誤,從而將缺陷引入手寫的C代碼,造成需要額外的時間來進行調(diào)試和修復(fù)。
在新的工作流程中,通過自動代碼生成可以消除這些缺點。在科學計算軟件中,工程師們的工作側(cè)重于在較高層次上開發(fā)和微調(diào)算法,不用過多地困在較低層次的實現(xiàn)細節(jié)上。然后,該團隊只需一鍵點擊就可以從原始設(shè)計自動生成C代碼。由于該流程是自動執(zhí)行的,因此在將算法轉(zhuǎn)換為C代碼時不會出現(xiàn)解析錯誤的情況。為了生成代碼,需要花些時間來微調(diào)原始科學計算算法,但這屬于一次性任務(wù),如果在開發(fā)設(shè)計的開始階段就考慮到代碼生成,則可以進一步簡化這項任務(wù)。
維護和測試算法
在傳統(tǒng)的工作流程中,在開發(fā)后期對需求進行更改會影響原始設(shè)計及其實現(xiàn)。對算法的更新必須反映在C代碼中,使用兩種語言和環(huán)境維護并測試同一個算法及測試框架的成本會迅速成為阻礙因素。在開發(fā)周期的后期發(fā)現(xiàn)缺陷時,開發(fā)人員需要更新該算法的原始科學計算代碼和C代碼版本兩者,還需要創(chuàng)建兩套測試方案來驗證缺陷是否已經(jīng)解決。當然,還存在兩個代碼庫產(chǎn)生差異的風險。時間限制經(jīng)常會促使團隊僅更新C代碼。出現(xiàn)這種情況時,團隊會再次受困于用C代碼手工編碼的所有缺陷,直到兩個代碼庫一致。
使用自動代碼生成,工程團隊則可避免這些潛在的錯誤。當需求發(fā)生變化時,工程師只需要更新原始科學計算代碼,然后重新生成C代碼,將新變化反映到實現(xiàn)中。具體來說,團隊無需對生成的C代碼進行任何更改,因為在重新生成代碼時這些更改會被覆蓋。此外,工程團隊也不再需要開發(fā)第二個測試框架,因此節(jié)約了額外的時間。用于測試科學計算代碼的原始測試框架可以重用來測試C代碼。
將算法集成到地面系統(tǒng)
C代碼單元測試一結(jié)束,團隊便將C代碼編譯到一個動態(tài)鏈接庫(DLL)。然后,將DLL集成到地面解碼軟件。最后,小組在公司的基于C代碼的測試基礎(chǔ)架構(gòu)中執(zhí)行整個地面解碼算法的系統(tǒng)測試。
在測試期間如果發(fā)現(xiàn)缺陷,小組發(fā)現(xiàn)很容易查明錯誤的源頭。由于工程師將序列預(yù)測算法隔離到一個DLL中,因此很容易確定缺陷是集成問題的結(jié)果還是算法本身所導(dǎo)致。此外,C代碼會映射回原始科學計算代碼,并為您提供了在C代碼中嵌入技術(shù)計算代碼作為備注的選項,進一步加強了原始科學計算算法與最終實現(xiàn)之間的可追溯性。
結(jié)果
● 缺陷數(shù)量減少:該項目計劃分配了三周時間來修復(fù)十個缺陷,而在生成的C代碼中僅找到四個缺陷。因此,團隊能夠?qū)⒍喑龅臅r間分配給項目的其他環(huán)節(jié),例如整個地面系統(tǒng)的系統(tǒng)測試。
● 修復(fù)缺陷所需的時間縮短:由于整個功能測試框架在科學計算軟件中可用,因此與傳統(tǒng)的手工編碼相比,團隊能夠更快地找到缺陷并予以解決??茖W計算軟件中提供的分析和調(diào)試工具加速了此流程。這些工具中有許多也用于測試和調(diào)試C代碼。
● 代碼和流程可以在未來的項目中重用:序列預(yù)測算法可以在未來的項目中重用。該算法可以以現(xiàn)有的形式隨時現(xiàn)用,也可以在通過代碼生成采用C代碼重新實現(xiàn)之前,在科學計算軟件中進行快速更新以用于其他應(yīng)用情形。
結(jié)論
通過使用自動代碼生成,工程師成功采用了一種新的工作流程。這種流程可以避免耗時且容易出問題的手工編碼。地面解碼軟件(包括序列預(yù)測算法)接近最終版。在項目上實現(xiàn)的時間和成本節(jié)約使公司可以探索更多的機會,將自動代碼生成工作流程應(yīng)用到廣泛的未來項目中。