2011-03-03 152 views
7

在總體水平上,問題很簡單:安排一支工作人員進行一人一天的覆蓋,在任何特定日子將工作人員分成3個池,每個員工都有一個休假要求,每個員工每週至多有兩班倒等等。算法人員調度解決方案

我不願意這樣做手動,因爲它在我的組織已經做了幾個世紀了。我喜歡做一些像遺傳算法一樣酷的東西(例如[1] http://www.sersc.org/journals/IJAST/vol14/1.pdf)。

有沒有可靠的開源/免費的替代品呢?這聽起來像是一個優化問題,我可以啓動C++,R等插入一些優化庫嗎?

謝謝

回答

6

您可以嘗試OptaPlanner(以前稱爲Drools Planner),它基於Java和開源。

+0

Drools Planner看起來是最完美的工具,謝謝!然而,安裝似乎非常複雜。目前有一些困難,試圖把它放在一起,但天哪,這裏有很多我不知道的組件。 –

+0

@明你遇到什麼樣的問題?我想知道,所以我們可以改善體驗。最簡單的方法是下載計劃程序zip並運行runExamples.bat/.sh。看看參考手冊如何從maven等使用它。 –

7

這是一個優化問題。它奇怪地被稱爲調度問題。 :-D 根據數據的大小,您可能需要進行Metaheuristics,如遺傳算法,螞蟻羣優化等,但我會從這裏開始通過滾動您自己的基於規則的啓發式。

基本上,將規則定義爲事物之間的關聯(人A不能同時在度假和工作中)或者時間表上的條件(在任何給定時間只有三個人)。然後創建一個時間表,並逐個插入所有員工。如果插入規則被破壞,則不要插入並選擇其他人員。

這應該,如果你做得對,想出一個有效的,但不是最佳的時間表,然後你可以做很酷的東西,如定義操作符(交換,移動,3交換),這將給你是一個社區(所有有效的時間表,可以通過應用操作員來達到)。然後,您可以選擇附近的最佳時間表,然後重複。這是鄰居後裔。但是有很多基於鄰域的方法可供選擇。我相信模擬退火適用於調度問題。

+0

看着Drools Planner,幾個月前他們已經將他們的模擬退火算法推出了beta版。 –

+0

看起來不錯!雖然這項工作有點大嗎? –

0

由於每天只有一個人,這似乎可以設置爲整數/二進制編程問題。有很多包做整數編程。無論您決定使用哪種方法來解決這些問題,這些問題中棘手的部分是找到指定問題約束的簡明方法。在這種情況下,什麼是假期需求等。

3

您可能也對約束編程框架感興趣,其中許多是開源的,如Choco(Java),Gecode(C++)和其他已被用於這些類型的問題,儘管我同意ravloony可能值得檢查一下他提到的風格中的算法是否可以解決您所描述的問題。