[英]Algorithm for packing time slots
我有一組帶有開始和結束時間的事件。 我想將它們渲染為一系列不重疊的行中的長框,像這樣
00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00
--|--------|--------|--------|--------|--------|--------|--------|--------|--
AAAAAAAAAAAA BBBBBB CCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDD
--|--------|--------|--------|--------|--------|--------|--------|--------|--
EEEEEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
--|--------|--------|--------|--------|--------|--------|--------|--------|--
GGGGGGGGGGGGGGGGGGG HHHHHHHH IIIIIIIIIIIII
--|--------|--------|--------|--------|--------|--------|--------|--------|--
將任何特定的框分配給任何特定的行並不重要。 我想要的是一種算法,它將這些框包裝到最少的行中。
是否有已知的算法?
我已經通過以下解決方案解決了相同的問題:
請注意,在插入元素時(步驟3.2.1),要枚舉的空閑扇區集(步驟3)將發生變化。
2007年國際時間安排比賽有課程安排軌道和考試安排軌道。 許多研究人員參加了比賽。 嘗試了很多啟發式和元啟發式方法,但最終,本地搜索元啟發式方法(例如Tabu Search和Simulated Annealing )明顯擊敗了其他算法(例如遺傳算法)。
看一看一些決賽選手使用的2個開源框架:
JBoss OptaPlanner(Java,開源)Unitime(Java,開源)-適用於大學的更多信息
-Geoffrey De Smet: 創建學校時間表的算法
參考:
我只是貪婪地打包它們(從左到右進行處理,並在適合的情況下按自上而下的方向向第一首曲目添加事件)。 它既快速又具有確定性,並且很可能在實踐中產生良好的結果。
這稱為間隔分區。 貪心算法按開始時間的順序分配盒子並將盒子放入適合的第一行(如果適合的地方則打開新行)會得到最佳結果。 參見例如Kleinberg&Tardos:“算法設計”。
如果我正確理解了您的問題,那么找出哪些日期重疊是最重要的。 您沒有說算法是否真正有效,或者是否適用於非常大的數據。 因此,我建議您執行以下步驟:
也許通過重疊對元素進行加權,並且在步驟5中進行此最終檢查可以幫助改善正常的貪婪方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.