我需要找到一個算法來找到最好的時間來讓我們說一個研究小組。該系統具有關於一組學生及其課程表的信息。系統應該給與會面時間,與任何人的課程時間表沒有衝突。什麼是解決這個問題的最好方法。我正在尋找任何調度算法,但沒有找到合適的人。學生時間調度算法
在此先感謝
我需要找到一個算法來找到最好的時間來讓我們說一個研究小組。該系統具有關於一組學生及其課程表的信息。系統應該給與會面時間,與任何人的課程時間表沒有衝突。什麼是解決這個問題的最好方法。我正在尋找任何調度算法,但沒有找到合適的人。學生時間調度算法
在此先感謝
我記得這個問題的最佳解決方案是由遺傳算法
產生的解看到此鏈接http://www.codeproject.com/KB/recipes/GaClassSchedule.aspx
有趣的問題。
這是我會做什麼:
然後看起來是這樣的,例如:
Student A: 11100000111111100000
Student B: 00000011111000010001
Student C: 00000000111111110001
_______________________________+
11100022333222220002
^^^ ^^^
然後,你需要使用一個簡單的循環,其保持當前的軌跡找到所有間隙在陣列中(用零區)零長度。記憶開始和結束索引並將其翻譯回來(步驟1的反向)到一個時間區域。
謝謝,我正在尋找更多的算法方法。 – user171034 2010-01-18 16:05:22
+1爲簡單起見。研究小組的規模和一天中的職位空缺數量足夠小,以至於對這個NP問題的大多數暴力方法都是一種選擇。對上述解決方案的一個推動是使用整數數組(每個學生一個數組,每個時隙一個整數)並且對時隙值進行求和而不是對它們進行求和,即布爾方式。這個系統允許SUM數組提供更好的選擇「第二選擇」的指導,即當一些學生不可用時滿足可能性。 – mjv 2010-01-18 16:16:14
謝謝,更新了這個例子。 – Pindatjuh 2010-01-18 16:30:13
這是一個匹配的問題,並且可以通過maximum flow algorithm
每個學生和研究組被解決是在一個有向圖,並輸入用於 一個節點的每個學生具有一個流動單元作爲輸入,並連接到所有研究組中節點。 每個研究節點組具有無限的輸出能力,當網絡中的流量是最大的,你有你的正確組合
也Introduction to Algorithms(流網絡章)見
每天有24*60 = 1440
分鐘。所以你可以很容易地蠻力,因爲你不需要超過一分鐘的準確度。不過,我要描述一個簡單的DP。
您可以創建一個布爾數組來存儲該分鐘中組的學生是否有班級。你也有第二個數組。該數組存儲此塊中和左側的空餘數量。所以你可以做的是從右向左遍歷布爾數組,如果塊中有一個類,則使數字爲0,否則將其加1,再加上前一分鐘的數字。
不過,我覺得我的解釋缺乏的,所以這裏是僞代碼:
blocked = <boolean array>;
numtoleft = <array containing the counts>;
if blocked[0]:
numtoleft[0] = 0;
else:
numtoleft[0] = 1;
for i = 1 to 1440-1:
if blocked[i]:
numtoleft[i] = 0;
else:
numtoleft[i] = numtoleft[i-1];
然後你可以通過「numtoleft」陣列中發現的最大數量容易找到的最大的開放式插槽,您可以添加限制到你正在看的時代。
編輯:
下面是蟒蛇的算法:
def largestslot(blocked, startminute, endminute):
numtoleft = [0]*1440
numtoleft[startminute] = 0 if blocked[startminute] else 1
for i in xrange(startminute+1, endminute+1):
numtoleft[i] = 0 if blocked[i] else 1
ansmax = max(numtoleft[startminute:endminute+1)
ansi = numtoleft.index(ansmax)
return (ansi-ansmax, ansi)
我不認爲這是一個優雅的解決方案。 – user171034 2010-01-18 16:10:05
我將開始一個非常簡單的方法是:
現在您的列表包含所有組成員都有其他活動的時間塊。因此,您需要查看免費時間表的列表並檢查,如果該時間段足夠滿足所需的會議時間。
每個學生都有一段時間的可用時間。每個人都必須見面(意味着至少有一個小時他們都是免費的)。您只需從第一名學生開始,並與下一名學生相交的可用小時範圍內,併爲每個學生做到這一點(繼續縮小原始範圍),並且您應該留下適合每個學生的範圍。
我會設置會議持續時間以及何時可以出現在會議有效的時間範圍,或之後8:00 AM而不是等到9:30 PM即45分鐘時間出發。然後,它應該是一個簡單的問題,即將羣組成員的空閒時間與找到適合的塊匹配。您需要包含重疊的容差,即如果該組的75%能夠符合,那麼它是可行的。
您可能還需要包括開始/結束時間緩衝,允許旅遊等,包括在你的搜索條件的緩衝區。我討厭大多數會議的一件事是,他們沒有考慮到旅行/安裝時間,而是把一次會議預定在另一次會議上。
我不認爲GA對這個問題會有很大的幫助,因爲沒有適合評估解決方案的標準。乙醚是空閒的時間段,或者沒有。 – 2010-01-18 16:16:16
,因爲有一個最佳解決方案可以在小於指數時間內找到,所以GA真的不需要! – Agos 2010-01-18 16:17:59
不,你正在考慮制定一個時間表,這是一個NP-Complete問題。這個問題要簡單得多。 :) – JPvdMerwe 2010-01-18 16:20:57