生產計劃的約束

  在制定生產計划過程中,必然是存在某些制約因素,滿足某些需求才能進行的,或是交期保證、或是產能限制、或是關鍵工序制約。即TOC理論 - 任何系統至少存在著一個制約因素/瓶頸;否則它就可能有無限的產出。就是說,如果不存在這個(或這些)制約因素,生產計劃就沒必要「排」了,只需隨意地,毫無約束地把任意一個或多個生產任務納入生產日程,都能滿足生產、營業等所有業務要求。那也不需要人的智慧參投入其中了。

兩種計劃模式

  而現實環境中,資源是有限的,且往往是在資源不足,並需要盡量滿足制約因素情況下進行計劃制定。在制定計劃的時候,不同的公司,基於不同的經營策略,需要遵循不同的原則。即使是同一個公司,在不同的業務場景(例如淡/旺季),其需要遵循的原則也可能不同。例如旺季因為生產任務緊張,需要保證交期;而談季相對來說可用產能會較充裕,保證交期就會不太困難,進而又需要遵循另外一些原則,譬如盡量降低生產成本等。而在這些原則之外,還有一種相對來說是比較固定,或者比較約定成俗的原則,就是儘早開始(As soon as possible),和即時生產(Just in time)。其中即時生產,是精益生產中的一個概念。本農上一家公司已推行了比較成熟的精益生產體系(精益絕對不是5S喔,更注重的是流程優化,識別並消除不增值活動,減省不增值但必須的活動)。所以當時設計APS系統時,很多時候就遵循即時生產的原則。此原則由整個供應鏈中最後一個環節驅動(例如出貨環節),從而推動前工序的生產安排。而很多不太強調精益生產的製造企業,在老生產計劃員來看,制定計劃的時候,除了較低程度上實現批量生產,以便高資源利用率,而進行對小批量生產任務稍作停留等待外,通常是按儘早開始的原則進行的。因為通常人們的想法是,未來的生產任務和產能具有不可預見性,你不知道未來會不會突然因為客戶加單,機器故障等客觀且不可控因素導致產能吃緊,甚至令生產單位措手不及。如果這種意外情況真的出現,那麼一開始使用儘早開始原則安排生產計劃,令到後面的產能較充裕,應對起這些「意外」起來,就相對輕鬆多了,這類原則下的生產計劃優勢就體現出來了。而實時生產原則,則有可能因為預留在較後時間的資源(例如機台產能)是比較「準確」的,那就相對按儘早開始原則制定的計劃來說,就更加被動了。但即時生產原則下的生產計劃,應對這種「意外」,也是有很多相應措施的。例如使用適當的緩衝機制,和實時計劃機制來應對。緩衝機制就是根據過往歷史經驗,在按即時生產原則制定生產計劃時,預留一定程度的冗餘資源作儲備,當出現「意外」時,可以使用這些冗餘的資源進行補救。而實時計劃相對來說「先進」一點了(先進二字加個引號,是因為這只是我覺得這種方法先進一點)。這種所謂的先進,主要體現在通過自動化的排產引擎,將計劃制定到足夠細緻且精確,對任務的生產情況(包括既有任務的執行情況,資源使用情況和新任務的增加量等)進行實時監控,使計劃實時地對這些情況作出反映,並及時給出新的應對方案。例如:當有新任務出現時,即時更新新增的任務到計劃中;有資源出現突發意外(例如機台突然故障)也可以反映到計劃中,並即時作出反映,及時給出修正後的計劃。但通過實時計劃是相對比較複雜的的方案,在Optaplanner中也有real-time planning的功能,我將會在Optaplanner相關的系統列文章中,單獨撰一篇來講解實時計劃。另外就是執行層面對實時計劃的執行依從性問題了,如何制定的計劃很精確,但執行過程相對來說是無法精確達到,比較粗糙的,例如:手工工序,人的執行能力相對機器來說,準時性會差很遠的。

即時生產原則生產計劃的價值

  既然即時生產如此繁瑣,為何還要採用呢?為何不全部採用儘早生產的原則來制定計劃呢?其實還真不是那麼簡單,相對生產環境的「繁瑣」,對於老闆來說商業上的利潤更為重要。如果大家理解精益,就知道它很多情況下,要精簡的活動就是 - 「等待」,因為等待這個活動在整個價值鏈中,是不增值且不必要的,所以它是首個被除掉的活動。為何這樣理解?因為如果對於一個並不非常緊急的產品,你一開始就完成了它的一大堆的半成品,或成品,佔用了大量本來可以優先用於其它生產任務的的資源(庫存、資金等資源),從而令到資源的利用率隆低了,對於老闆來說,資源利用率高低可是實打實地影響到最終利潤呀。本農曾參與過國內某一線生活用紙企業的產銷協調平台的需求調研,記得討論到關於目前的環境下,車間的批量生產是否能節省成本、是否仍有價值的問題時,當時的物流總監安奈不住情緒發飆了 - 你們到底會不會算帳? 少投幾次料,少清幾次機省出來的那點紙漿價值,大量生產出來的這些產品,放在北京一個物流倉里,一天的成本是多少?一個批次使用這種所謂的批量生產輸出的成品,不到一個星期,庫存成本就已經把所有生產環節省出來所有成本都吃掉了。所以,實時生產對於一些在制品成本高的企業,是能有效降低WIP,進而實打實地降整個供應鏈成本的。這也是即時生產的魅力所在。

儘早生產與實時生產的兩處計劃的具體制定方式

  上面講解了儘早生產與實時生產兩種原則的區別和各自的優劣,大家需要跟據自己的具體場景去採用,下面我們就針對這種原則的排產方式展開討論。先不講這兩種制定計劃的原則,在生成規劃引擎Optaplanner上的實現方式的區別。假設我們是生產計劃員,面對這兩種原則,我們應該如何制定生產計劃呢?  先說儘早生產,其實說白了,就是有一個產品的一系列生產任務,一旦準備就緒了,就可以將它排入計劃中,且排在時間軸上越靠前越好,不同工序對應的生產任務,在遵循固定的工序先後時間關係的基礎上,越早開始越好,正常情況下上下任務之間是FS關係(即必須等上工序完成了,下工序才能開始),而在精益的優化流程中,特別是一些離散製造的場景,是可以實現SS的(即是上一工序一旦有工件完成,即可對這些工件開始下一工序的加工)。所以不同工序對應的任務是緻密的,從而很好地實現了儘早生產。所以,我們可想而知,對於儘早生產原則下的生產計劃,它是基於每個任務的就緒時間進行排產的,也就是說一個任務一旦就緒了,那麼它在生產計劃中的開始時間就是就緒時間的下一個時間單位了(這個時間單位可能是分鐘或各車間自己制定的最小時間間隔)。當一個產品的首個工序時間在生產計劃中確定了,按儘早生產的原則,可能推算出這個產品的後下所有生產工序對應的加工任務的最早開始時間,因為可能存在資源上的限制,並不一定能夠在每個工序對應加工任務的最早開始時間開始加工,但還是遵循了儘早計劃的原則,就是一旦上工序生產完了,當前這個工序的資源就位了,那就可以開始生產。如果按照上述的原則定製出來的生產計劃,在甘特圖上可以看到,所有生產任務都是盡可以靠前的且盡量緻密的。

  再說說即時生產。上面已經說過,即時生產的原則是供應鏈最後一個環節來驅動的,同樣地在供應鏈中的生產環節里,也是基於最後一個生產工序來驅動所有生產工序的加工任務的。也就是說,最後一個工序(例如包裝)的生產任務要求什麼時間要完成的,那就基於這個完成時刻 ,往前推算(例如,在要求完成時間,減去加工任務的時長,再減去一些準備時間等),就可以推算出前一個工序的生產任務的要求結束時間.....如此類推,就可以推算到整個產品的首個工序的生產任務的開始時間,從而得到所有生產任務的具體生產時間(包括開始時間與結束時間)。因為這種方式下制定生產計劃是從後而往前推算的,所以從計劃的甘特圖上看,所有任務在時間思上是盡量往後靠且緻密的。

Optaplanner對儘早開始與即時生產兩種計劃的實現方式

  上面我們已經知道,我們的生產計劃人員,是如何排出儘早開始與實時生產兩種計劃的。如果我們使用規劃引擎Optaplanner來輔助我們智能快速地制定這兩種生產計劃,應該如何設計呢?首先需要交待一下 Optaplanner在處理這些時間分配的要求時,它是如何實現的。通過前面Optaplanner系列文章中一些簡單的示例我們知道,Optaplanner做規劃的基本方法,就是對於被規劃對象(例如生產任務),從可能的資源列表中,取出相應的資源對各個被規劃對象進行嘗試,通過分數的計算對比來確定資源應該如何分配才得到更好的方案。這裡面的資源通常都是一些具體的物理物件,例如機台、工人等.沒有提及時間這種資源是如何實現分配的呀。而我們所有的生產計劃,事實上也就是在兩個維度上的資源分配;分別是時間與空間上的分配,就是確定一個被規劃對象的時空。例如確定一個任務應該分配在哪一個機台上(空間),需要在什麼時候開始生產,需要在什麼時間結束(時間)。事實上,Optaplanner的設計者早已考慮到這個問題,並提供了較完善的實現方案。針對時間維度的分配,Optaplanner提供了三種模式來實現(見圖Assigning time to planning entitis),對於這三種模式,在Optaplanner系統列文章中,也將會有專門文章會講解,在此不展開。在這三種模式中,其中一種叫做Chained Through Time pattern模式,我面對過一些複雜的排產場景,經過多翻嘗試和掉過各種坑,還是覺得這種模式最為適合,它可以提供三種時間分配模式中最為豐富和靈活的介面,供我們實現一些特殊的需求,具體的應用再去參考相關文章,在此真的不夠篇幅展開。這個模式的原理是,Optaplanner並不是分配哪個時間資源到哪個任務里去,而是對於所有的被規劃對象,Optaplanner會把它們串成一個鏈(見圖Chain principles),一個接著一個,Optaplanner要嘗試規劃的是這些被規劃對象在鏈上的位置,它體現為當前的被規劃對象,它的前一個對象是誰,每個對象有一個屬性用於指向它在鏈中的前一個對象,而這個屬性就是它的Planning Variable. 並且,Optaplanner提供了介面,當這個Planning Variable因當前對象在不同的鏈之間切換,或在同一個鏈中的不同位置切換的時候,這個介面可以讓你告訴Optaplanner這個位置切換影響了被規劃對象的另外的哪些屬性(見圖Planning Variable Listener),這些被Planning Variable的變化而被影響的屬性就叫做Shadow Variable.這樣的話,我們就可以應用這種機制,把Shadow Variable定為被規劃對象(下面就以制定生產任務為案例,將被規劃對象稱作任務,這樣更容易理解)的開始時間。那麼我們就有:當一個任務處在不同鏈的不同位置時,它的開始時間就會受影響了。具體的實現方法是,當一個任務的位置變化前後(其實體現為它的前一個任務變化了),Optaplanner會觸發關於這個前任務變的一系列事件。我們就在這些事件的處理方法中,去推算這個任務的開如時間,完成修改後,需要通知Optaplanner進程我們的修改,讓它去計算分數來評價這個方案的優劣。從而實現了任務的位置變化,影響了開始時間,開始時間的變化,就可以推算出具體的結束時間。

  其實上面是我們在使用Chained Through Time pattern模式最常用的情景。如果實現了上述的方案,就已經排出了儘早生產的計划了。因為每個任務變化的時候,我們推算的都是它的開始時間。當然這個開始時間不僅僅是依據當前任務的前一個任務的結束時間推算出來的,還需要參照當前任務的就緒時間(若有的話),和當前任務的準備時間(若有的話)。但即使考慮了這些因素,它仍然是儘早開始的。那麼如果我們而對的項目是需要實行精益生產的,需要實現即時生產的,應該如何做呢?其實大概的實現方式是一樣的,只不過需要把生產任務形成的這條鏈的方向從時序上反轉。在儘早生產的場景下,在鏈上的是以首個任務的開始時間作為基點,推算後面的其它任務的時間,進而推算其後方的其它任務的開始與結束時間。在即時生產的場景下,因為是由後工序驅動的,我們可以反過來,鏈的起頭不再是首個任務的就緒時間了,而是最後一個任務的結束時間作為基點,往前推它的開始時間,而在鏈上的下一個下任務,而實在業務上對應的是它的上一個工序對應的任務,如此推算出來,就得到上一任務的結束時間,進而推算它的開始時間,如此類推,計算整條鏈的所有任務的結束時間與開始時間,在鏈尾就得到首個任務的開始時間了。把它反映在計劃甘特圖上,所有任務都是趨緊向後工序的,也就是實現了即時生產了。當然,上述提到的緩衝機制,大家應該很容易理解,也很容易在鏈中實現。

前推式計劃 - 儘早生產,後拉式計劃 - 即時生產

  通過上的兩種計算的生成過程,大家應試注意到一個細節,就是儘早生產,它是基於第一個任務的就緒時間來向後推算後面任務的時間。形象點就是說,它一旦定好了開始時間,就按這個時間往後排計划了,就是告訴引擎,反正我這個時刻開始的,你就按這個時刻,根本必要的考慮因素和約束,從前往後推算出一個計劃來吧。所以我們把它稱為前推式生產計劃。而另外一種即時生產原則下的生產計劃,它是相反的,它確定了最後一個任務的開始時間,再往前推算前面各個任務的結束與開始時間,其實也是往前推算出來的時間。但因為它是基於供應鏈中的最後一個環節來驅動前面的生產活動的,所以我們形象地把它稱為後拉式計劃。也就是說,反正我定了哪個時刻需要完成的,你們前面的任務就貼著這個時間來安排結束時間和開始時間吧,就像從最後一點把前面的任務往後拉出一個生產序列來,因此我們把它稱作後拉式生產計劃

  至此,我們分別探究了儘早生產(前推式生產)和即時生產(後拉式生產)兩種排產原則的考慮因素,計劃方案和在規劃引擎Optapalnner上的實現原理。具體的實現我將會通過兩篇文章來描述,一篇用於描述Optaplanner對時間的分配模式;另一篇將會以Chained Through Time pattern模式為基礎,以生產任務的制定過程,探究一下Optaplanner是如何實現複雜場景下的生產計劃制定的。例如目前我負責的一個排產項目,及一些朋友的產品中,就涉及一些任務之間的先後次序制約,任務之間需要根據條件放置一些不屬於常規生產任務的操作等。這些林林總總的奇怪而又現實的要求,如果僅僅使用Optaplanner最基本的Planning Entity + Problem Fact進行規劃的模式,是無法實現的。需要通過Chained Through Time pattern模式提供的事件介面,來實現一些我們自己的業務邏輯,才有可能把這些現實的業務需求體現在生產計劃中。

Constraint satisfaction solver (Java?, Open Source)

  至此,我們分別探究了儘早生產(前推式生產)和即時生產(後拉式生產)兩種排產原則的考慮因素,計劃方案和在規劃引擎Optapalnner上的實現原理。具體的實現我將會通過兩篇文章來描述,一篇用於描述Optaplanner對時間的分配模式;另一篇將會以Chained Through Time pattern模式為基礎,以生產任務的制定過程,探究一下Optaplanner是如何實現複雜場景下的生產計劃制定的。例如目前我負責的一個排產項目,及一些朋友的產品中,就涉及一些任務之間的先後次序制約,任務之間需要根據條件放置一些不屬於常規生產任務的操作等。這些林林總總的奇怪而又現實的要求,如果僅僅使用Optaplanner最基本的Planning Entity + Problem Fact進行規劃的模式,是無法實現的。需要通過Chained Through Time pattern模式提供的事件介面,來實現一些我們自己的業務邏輯,才有可能把這些現實的業務需求體現在生產計劃中。
Constraint satisfaction solver (Java?, Open Source)?

www.optaplanner.org
圖標

本系列文章在公眾號不定時連載,請關注公眾號(搜「讓APS成為可能」或掃以下QR Code)及時接收,二維碼:

如需了解更多關於Optaplanner的應用,請發電郵致:[email protected]

或到討論組發表你的意見:groups.google.com/forum若有需要可添加本人微信(13631823503)或QQ(12977379)實時溝通,但因本人日常工作繁忙,通過微信,QQ等工具可能無法深入溝通,較複雜的問題,建議以郵件或討論組方式提出。(討論組屬於google郵件列表,國內網路可能較難訪問,需自行解決)

推薦閱讀:

相关文章