簡體   English   中英

時隙打包算法

[英]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
--|--------|--------|--------|--------|--------|--------|--------|--------|--

將任何特定的框分配給任何特定的行並不重要。 我想要的是一種算法,它將這些框包裝到最少的行中。

是否有已知的算法?

我已經通過以下解決方案解決了相同的問題:

  1. 找出LB = min(startTime)和RB = max(endTime)。
  2. 將長度為LB的空行添加到RB;
  3. 對於該行中的每個“空閑時間”扇區(最初只有一個扇區:LB到RB):
    • 3.1找到適合該行業的最長元素;
    • 3.2.1如果有這樣的元素-插入行中;
    • 3.2.2否則,很明顯這個自由部門是不可用的;
  4. 如果在測試了所有當前的空閑扇區之后仍剩余元素,請轉到2。

請注意,在插入元素時(步驟3.2.1),要枚舉的空閑扇區集(步驟3)將發生變化。

2007年國際時間安排比賽有課程安排軌道和考試安排軌道。 許多研究人員參加了比賽。 嘗試了很多啟發式和元啟發式方法,但最終,本地搜索元啟發式方法(例如Tabu SearchSimulated Annealing )明顯擊敗了其他算法(例如遺傳算法)。

看一看一些決賽選手使用的2個開源框架:

JBoss OptaPlanner(Java,開源)Unitime(Java,開源)-適用於大學的更多信息

-Geoffrey De Smet: 創建學校時間表的算法

參考:

我只是貪婪地打包它們(從左到右進行處理,並在適合的情況下按自上而下的方向向第一首曲目添加事件)。 它既快速又具有確定性,並且很可能在實踐中產生良好的結果。

這稱為間隔分區。 貪心算法按開始時間的順序分配盒子並將盒子放入適合的第一行(如果適合的地方則打開新行)會得到最佳結果。 參見例如Kleinberg&Tardos:“算法設計”。

如果我正確理解了您的問題,那么找出哪些日期重疊是最重要的。 您沒有說算法是否真正有效,或者是否適用於非常大的數據。 因此,我建議您執行以下步驟:

  1. 找出哪些日期相互重疊。 也許在地圖中,您可以在其中將每個條目映射到與其重疊的條目列表。
  2. 按開始時間對元素進行排序。
  3. 只要在一行中有空間,就選擇元素的開始時間與最后一個元素的結束時間最接近的元素。
  4. 從與此元素重疊的所有元素中,選擇一個與前一個元素重疊最多的元素,然后將其添加到您的行中。
  5. 如果一行已滿,請檢查最大的間隙並查看是否有元素適合其中; 否則繼續下一行。

也許通過重疊對元素進行加權,並且在步驟5中進行此最終檢查可以幫助改善正常的貪婪方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM