實現不完全規劃的方法

  在各種常見的規劃場景中,我們經常會遇到一種不完全規劃的情況。即在正常情況下,在完成了一次規劃運算(甚至是CH階段的運算中),OptaPlanner的規劃實體(Planning Entity, 下稱規劃實體)中每個規劃變量(Planning Variable,下稱規劃變量)必須非空,即必須被賦予規劃變量取值範圍(ValueRange,規劃變量取值範圍)範圍內的值;儘管有更約束被違反,也必須實現賦值。

​  例如,在CloudBalance示例中,若一個數據集中存在足夠多的進程(CloudProcess對象),以致啓用所有計算機的內存無法裝入所有進程。此時,引擎還是會強行把一些進程塞進一些已經內存已經不足的計算機中,從而出現內存這個約束(硬約束)被打破。但在我們的實際場景中,面對這種情況,我們並不希望輸出這種違反硬約束的結果;因爲在這樣的業務情景中,違反硬約束的結果已經是典型的不可行方案了。我們更希望引擎能更機智靈活地識別出這種實際場景中毫無意義的方案,從而找到一個不會將資源過度分配的方案。

  這種方案在OptaPlanner中被稱爲 Overconstrained Planning,對於這種資源超用的處理情況,可歸結爲對資源的過度分配。以下用戶手冊的章節描述了兩種方法實現方法:https://www.optaplanner.org/docs/optaplanner/latest/repeated-planning/repeated-planning.html#overconstrainedPlanning

​  從文中可以看到,要實現這種功能,OptaPlanner並沒有開箱即用的方法或功能。但通過其中的一些特性我們仍然可以通過簡單的方法巧妙實現。目前主要有兩種辦法來實現“避免資源超用”情況,分別是 - "讓規劃變量允許爲空"和"爲規劃變量的取值範圍提供到一些虛擬值".

讓規劃變量允許爲空

  ​正常來說,對於一個規劃問題來說,一個可能的方案(Possible Solution)是其所有規劃實體(Planning Entity, 下稱規劃實體)的所有規劃變量)都完成賦值。在規劃的CH階段就是實現對每一個規劃變量進行賦值的階段。通過在定義規劃變量中加入nullable屬性並將其屬性值設置爲true來讓一個規劃變量在規則過程中允許保留空值。如下代碼:

@PlanningVariable(nullable = true)     
public getCloudComputer{
         return cloudComputer;     
}

​  通過該屬性設置,在規劃過程中規劃變量除了會從規劃變理取值範圍中獲取可能值生成方案外,空值(null)也將出現在取值範圍內,這種情況下無需向取值範圍列表加入空值,程序會自動空值納入考慮範圍內。

  細心的同學一定會想到,如果規劃變量可以爲空值,那麼會不會得到的方案全部規劃變量都爲空,畢竟空值也是規劃變量的取值範圍,且滿足約束。但實際業務場景中,空值對於我們來說,通常是不存在業務意義的;只不過是想讓方案不過度分配資源而已(在資源分配的規劃場景中),而不是我們的最終目標。通俗地講,我們的最終規劃目標,是在保證資源最大使用率的情況下,找出不超過資源最大可用的方案。從輸入的方案來看,就是想找出一個儘可能所有規劃變量都有值,如果分配的規劃變量超過可用範圍就用空值代替。因此,我們就會想到,添加一條與獨立於業務的約束,用來實現上述意圖,這條約束通常是是中間約束(如果使用的是“硬中軟”約束結構的話),當然只要使用超過一層的約束,都可以人爲地設計一個保持在硬、軟約束之間的約束,來實現“儘可以少的規劃變量被賦空值”的目標。

爲規劃變量提供一個“萬能”的虛擬值

​  爲了避免資源被超用,除上述將規劃變量設置爲空的方法外,還可以爲規劃變量的取值範圍設置一個無限的虛擬值,在資源規劃場景中,可以理解爲建立一個虛擬資源,這個虛擬資源具有無限資源量。用來承擔那些超出正常資源可用量的分配。還是以CloudBalancing(本文只以該示例的內存限制爲唯一分配條件)爲例,我們可以在可用的計算機列表中,添加一個內存無限大的計算機。目的是當可用的計算機的內存無法放在所有進程時,超出的進程可以放進這個內存無限大的虛擬計算機中。這種情況與上述將規劃變量設定爲可以空的情況一樣,如果不作任何額外限,有可能得到一個計算結果是所有的進程都被分配到這臺虛擬計算機中。因此,需要額外添加一箇中間約束,其目的是在確保儘可能使用完所有真實計算機後,才啓用這臺虛擬計算機。

  以上是在日常跟各位網友的交流中,經常有人提出:​如果任務的資源需求比可用資源量多,希望引擎儘可能滿足任務的需求、儘可能分配所有資源,但又想避免一個完全超出資源承受能力的分配方案。其實這種情況在排產、VRP等場景下相當常見。各位遇到這種場景,可以考慮上述兩種辦法加以處理。

 

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

如需瞭解更多關於OptaPlanner的應用,請發電郵致:[email protected]
或到討論組發表你的意見:
若有需要可添加本人微信(13631823503)或QQ(12977379)實時溝通,但因本人日常工作繁忙,通過微信,QQ等工具可能無法深入溝通,較複雜的問題,建議以郵件或討論組方式提出。(討論組屬於google郵件列表,國內網絡可能較難訪問,需自行解決)

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