2012-03-24 69 views
1

如何開發一個高效的約束作業調度?在java中約束編程

調度應包括下列方法:

startBeforeEndOf(Job j) 
startAfterEndOf(Job j) 
startBeforeStartOf(Job j) 
startAfterStartOf(Job j) 
endBeforeEndOf(Job j) 
endAfterEndOf(Job j) 
endBeforeStartOf(Job j) 
endAfterStartOf(Job j) 

每個職業都有一個ID,時間參數。

這個問題的一個可能的解決方案,可能是基於技術回溯。作業被用作選擇點,時間瞬間作爲選擇(在最壞的情況下,活動的總持續時間是工作持續時間的總和,導致完全順序執行)。

或者,我應該充分表示數據,然後在時間軸上生成一個調度,將工作置於約束條件下,並在不滿足約束時將工作向前移動(以及所有依賴它的作業)。 但我不知道我在java中能做到這一點。

換句話說,我正在尋找一種方法來避免強烈的回溯方法,在所描述的作業管理中。

+1

這是功課?你知道任何可用於此的算法嗎?您可以在搜索過程中添加啓發式算法,但回溯算法似乎是解決方案的一部分。除非你希望去詳盡的搜索當然:-) – 2012-03-24 09:49:28

+0

我想使用各種列表來分隔每個工作,根據他的約束,例如私人列表 startBeforeEnd; \t私人列表 startAfterEnd; \t私人列表 startBeforeStart; \t私人清單 startAfterStart; \t私人清單 endBeforeEnd; \t私人清單 endAfterEnd; \t私人清單 endBeforeStart; \t私人清單 endAfterStart; \t私人清單受限;但我不知道如何能夠發展這一點。 – AndreaF 2012-03-24 09:57:36

回答

0

嘗試OptaPlanner(java,open source)。有a quick start here

例如,分配給每個JobstartMinute,然後加分規則,如:

when 
    $leftJob : Job($startMinute : startMinute) 
    // getEndMinute() returns startMinute + durationInMinutes 
    $rightJob : Job(beforeJob == $leftJob, endMinute > $startMinute) 
then 
    // punish 
end 
+0

emmm ...你能給我更多的細節,如何適應流口水在這個問題上遇到的解決方案?謝謝 – AndreaF 2012-03-26 22:50:48

+0

@AndreaF:見上文 – 2012-03-28 07:10:09

0

您可以使用開源約束編程庫。 This發佈指向Java中用於約束滿足問題和更多問題的許多求解器。

+0

謝謝,但這些庫對於這個特定的問題來說太大了,是否有更小的東西? – AndreaF 2012-03-24 10:28:43

+0

@AndreaF - 不是我所知道的。但是您可以從其中一個庫中找到所需的功能。然後深入圖書館的實施,並適應您的情況。 – 2012-03-24 11:09:51

+0

閱讀百代碼,嘗試在這個問題上適應這些通用庫是一個太複雜的方式。 有了正確的直覺,我認爲這可以由一個熟練的開發人員在幾個小班級中解決。 – AndreaF 2012-03-24 13:02:16