25

我正在寫一個編程難度很大的調度程序。有幾個事件,每個都有多個會議時間。我需要找到一個安排會議時間,使每個時間表包含任何給定的事件一次,使用每個事件的多個會議時間之一。最適合的調度算法

顯然我可以使用蠻力,但這很少是最好的解決方案。我猜這是一個相對基本的計算機科學問題,一旦我能夠開始參加計算機科學課程,我將會了解到這個問題。與此同時,我更喜歡任何可以閱讀的鏈接,甚至只是一個可以讓Google知名的鏈接。

+2

調度問題一般是NP完全的,這意味着你不能做得更好*(我們認爲)*比蠻力更好。不過,我不確定這個更具體的問題。 – 2010-04-30 17:07:57

+7

確實,這些問題通常是NP完全的,因此沒有有效的算法來獲得最優解,但是有效的算法在大多數情況下可以得到相當好的答案。就關鍵詞而言,我可能會尋找「垃圾箱裝箱問題」,儘管它不太正確。您也可以嘗試搜索「課程調度算法」並查看您找到的內容。 – 2010-04-30 17:12:34

+1

「每個時間表」?所以你想找到所有可能的方式來參加所有活動? – Beta 2010-04-30 17:15:18

回答

11

我認爲你應該使用遺傳算法,因爲:

+0

所有的答案看起來都非常好。我選擇這一個,因爲這是我不熟悉的頭腦最容易理解的一個。感謝大家! – stillinbeta 2010-05-01 16:28:58

3

您的問題描述並不完全清楚,但如果您所要做的只是找到一個沒有重疊事件的計劃,那麼這是一個直接的bipartite matching問題。

您有兩組節點:事件和時間。從每個事件到每個可能的會議時間畫一條邊。然後,您可以使用augmented paths有效地構建匹配(節點之間最大可能的一組邊)。這是有效的,因爲你總是可以將二部圖轉換爲等價的流圖。

這樣做的代碼示例是BIM。標準圖形庫,如GOBLINNetworkX也有雙邊匹配的實現。

2

這聽起來像這可能是一個dynamic programming解決方案,特別是類似於interval scheduling問題的一個很好的候選人。

對於區間調度問題,有一些視覺here具體,這可能會使概念更清晰。 Here是一個關於整體動態編程的好教程。

5

有幾種方法可以做到這

一種方法是做約束編程。這是feanor建議的動態編程的特例。使用可以爲你做邊界和分支的專門庫是很有幫助的。 (谷歌的「gecode」或「彗星在線」來找到庫)

如果你是數學上的傾向,那麼你也可以使用整數編程來解決這個問題。這裏的基本思想是將你的問題轉化爲一組線性不等式。 (谷歌的「整數編程調度」,以找到許多現實生活中的例子和谷歌「算盤COIN-OR」爲一個有用的庫)

我的猜測是約束編程是最簡單的方法,但整數編程是有用的,如果你想要在某個時候在你的問題中包含實際變量。

+0

BTW:我不會使用遺傳編程來完成這樣的任務:1)遺傳算法有點慢2)它們有點難以調試,因爲它不總是收斂到全局最優。 – nielsle 2010-06-09 10:18:39