生產計劃體系完整解決方案(2) : 複雜大規模問題之 - 分區規劃

  本文章是生產計劃體系完整解決議定的第2篇 - 複雜大規模問題之 - 分區規劃。

  在完整的規劃體系中,針對不同的場景與需求,需要對應的規劃方案。在上一篇(生產計劃體系完整解決方案(1) - 複雜大規模問題的分階段規劃)裏,簡述了分階段規劃方案,就是針對供應鏈中,從訂單到生產環節中,以訂單爲單位對生產計劃進行初步排程。具體的任務是“將某個訂單,安排到哪個生產單位(通常是車間級別),在哪個時間點之前完成”。通常我們將該層次的生產計劃稱爲主生產計劃 - MPS。而在生產單位內,根據訂單需求和產品的工藝路線、參數等進行拆解,生成最小粒度的生產任務,把這些生產任務分配到產線、機臺、工位或班組等具體的生產資源,並根據工序路線的前後制約關係,推導出具體的任務計劃開始與結束時間。在過程稱爲高級生產計劃與排程,即我們常見的APS。

  在APS的階段,我們會遇到一些問題規模較大,從而引入規劃效果不佳,甚至規劃程序無法處理的情況。面對因數據量過大而無法處理的情況,我們首先需要考慮的是通過優化計劃結構來縮小數據量。但若通過各種途徑優化後,問題規劃仍超出一個規劃程序的處理範圍時,我們就需要考慮一種折衝的解決辦法 - 分區規劃。

分區規劃的定義

  是指將一個大規模的待規劃數據集(下稱大規模問題),基於一定的規則,劃分成多個較小規模的數據集(下稱爲子問題),並使用多個規劃程序實體,對這些劃分後的、規模較小的子問題進行分別規劃求解;或將這些較小的子問題依次求解。獲得各自子結果後,再合併成一個完成的、總體的規劃結果,作爲原始數據集的近似解。

從上述定義可知,分區規劃實際是對一個大規模的、常規求解器難以運算求解的較大規模問題,的拆分求解法。是一種對問題進行分而治之的方法;可以理解爲一種用空間換時間的求解策略。因爲規劃問題屬於NP-Hard問題,它的其中一個典型特性是,隨着數據量的增大,問題規模(通常表現爲時間複雜度)呈指數級上升。當數據量增大到一定程度後,求解器(不管是開源的OptaPlanner還是其它商用求解器)面對的將是一個極其龐大的搜索空間(搜索空間可以理解爲一個規劃問題的所有可能方案的數量),甚至在一個問題被展開到內存後,數據量會突破一些程序語言運行時的空間(例如Java的JVM)。我們當然可以通過修改運行時的空間,並增大計算機的內存來容納這個巨大的問題展開數據。但當這個數據量足夠大時,需要從近乎無窮個可能解中,找出相對最優解的效率也會差得多。因此,同樣會面臨規劃效果不佳的問題。因此,分區規劃存在一定的實用價值。

分區規劃的例子

APS

  在APS的生產計劃排程場景中,整個公司(或整體集團)多個車間之間的設備在分配任務時,有可能需要實現互相配合。因此,我們會將整個企業中所有車間的生產任務都統一成一個待排數據集進行排程。但當企業需要排程的任務量足夠大時(例如企業產能與訂單數量非常龐大、表需要預排非常長的週期),形成的待排數據集,其量級有可能越超過了OptaPlanner處理的數據量。

此時,我們可以考慮將各個車間獨立成一個子數據集,各自進行排程;或將幾個相關性較強的車間組合起來,相關性較低的車間劃分成不同的子問題,整成不同的子數據集後,再對這些子數據集進行規劃運算,並將結果合併成最終結果,作爲整個企業的生產計劃。

VRP

  在VRP(車輛路線規劃)場景中,若存在多個地區的運輸訂單統一規劃車輛進行分配,併爲車輛優化行駛路線。若該區域的收貨、派貨節點數量太大,就是出現OptaPlanner無法處理的問題。此時,我們可以考慮對該地區的節點進行再次劃分成更小的子區域,對子區域的節點進行VRP規劃後,再把這些子區域的結果合併成一個大的VRP結果。

分區規劃的好處

提高CPU利用率

  針對分區規劃的具體應用場景,我們很容易就能總結出分區規劃的好處了,那就是可以靈活、高效地處理大規劃的問題,令求解器可以更輕鬆地處理搜索空間巨大的情況。

  雖然我們針對一個單一的大規模問題,也可通啓用多線程來提高CPU利用率,從而提高求解效率。但在多線程運算過程中,它針對的仍然是同一個問題,多線程的調度器會合理分配各個CPU核心的運算內容,儘可能減少各線程之間的通訊,來減少各線程的CPU切換時間。但事實上,從業務邏輯的角度來看,各個線程之間的運算內容或多或少都會存在一定的交互需求,因此,使用多線程對同一問題進行求解時,可以起到提高CPU各核心利用率的效果,但各線程之間的通訊、CPU對線程的切換是不可避免的。

而當我們使用分區規劃時,被劃分的子問題之間,從業務上是不存在相關性的,可以從邏輯上避免了不必要的線程通訊和CPU切換,從而大大提高CPU的運算率。

  下圖是OptaPlanner用戶手冊中,關於分區規劃時,多線程並行運算時,在多核CPU平臺上運算的過程,在此就不翻譯了,大家可以細心分析一下是否確實能提高規劃運算的效率。

指數級降低問題規模

  因爲規劃問題是NP-Hard問題,對於同一個問題,當我們將它視作一個問題來解決時,其搜索空間會與數據量形成指數函數問題,因此,同樣的數據量,劃分成多個子問題時,其問題空間會少得多。

舉個例子:我們將問題簡單一下,若數據集中共有8條數據,每個規劃變量有2種取值可能,那麼,整個問題的搜索空間是:

若將這個問題的8條數據,平均劃分成2個子問題時,則每個問題有4條數據,它的搜索空間是:

若將這個問題的8條數據,平均劃分成4個子問題時,則每個問題有2條數據,它的搜索空間是:

  總結上面的數據,我們可以知道,通過劃分成子問題的方式,可以極大地降低問題的搜索空間,從而讓求解器在可接受時間內完成對問題的求解。

  那麼,我們是不是把問題劃分得越細越好?(這裏留個問題,大家可以思考一下)

分區規劃的缺陷

  在實際應用場景中,可以作爲一個數據集呈現的整體問題,其中各個數據之間必然存在一定的相關性,否則沒有必然作爲一個整體問題提出。當我們將它拆分成多個子問題時,這些子問題的組成的問題分集合必然出現一定程度的失真,即可能存在部分關係的數據,其關聯關係將會不復存在。對每個子問題進行規劃運算時,引擎只能考慮當前子問題數據集的數據相關性,當前子問題數據與其它子問題數據之間,並會影響規劃結果的關係則無法體現,從而導致從各個子問題合併成整體問題(即大問題)結果時,與原始整體問題對應的相對最優解尋在差異,即出現失真。

上圖描述了TSP(或VRP)場景中,將一個大問題的數據集劃分成4個小問題進行分別規劃的過程。

由於整個TSP大問題中,需要訪問的節點數量超出求解器可求解的上限,因此,將整個地圖上所有待訪問節點,按地區進行橫縱劃分成4個區分,分別形成子問題1、子問題2、子問題2和子問題4,然後對這4個子問題分別作爲一個TSP數據集進行求解,分別得到結果1~4。再將這4個結果進行合併,得到的方案,其評分爲-706分。可以理解爲,這個合併結果其訪問里程總量爲706公里。而若將整體數據集一次過進行規劃(假設其數據量可以被求解),得到的結果是-674(即里程更短,因此方案更優)。這個結果相比分區規劃後再合併的結果更優,即分區規劃的結果有可能相比整體規劃更差,即進現失真情況。

OptaPlanner對分區規劃的實現
針對分區規劃的應用,OptaPlanner提供的開箱即用的特性來實現之。以下用戶手冊內容詳細講解了如何對一個問題的數據集進行分區規劃求解.
https://docs.optaplanner.org/8.29.0.Final/optaplanner-docs/html_single/index.html#partitionedSearch

 

以下是一翻推廣:

誠邀大家使用我們的【易排通用智能規劃平臺】,它基於OptaPlanner對APS的一些常用規劃邏輯進行封裝,大家只需要管理、維護好自己系統(使用MES、MOM、ERP中的計劃模塊)中的工單數據,即可快速地實現一個APS模塊。後續我們還會添加【VRP - 車輛路徑規劃】和【在線調度】模塊,敬請期待。可以通過以下鏈接查看更多該平臺的使用方法。

易排(EasyPlan)通用智能規劃平臺 Q&A

與平臺相關疑問,可以添加本人微信探討,或關注我們的公衆號【讓APS成爲可能】及時接收相關消息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章