2017-06-07 30 views
4

我給員工安排的CSV的列最接近的球隊:基於員工的時間表C#

employee ID, first last name, sunday schedule, monday schedule, ... , saturday schedule 

1爲每個員工每週的時間表。我附上了一部分csv文件的截圖。總文件大約有300行。

schedules.csv

我需要生成基於員工的日程安排(位置並不重要),使得每支球隊的員工有最接近的時間表,以彼此的15支球隊。什麼我都試過僞代碼:

  • 解析CSV文件導入時間表的陣列(我自己的結構定義)

  • 匹配的員工誰具有相同的確切時間表進隊(創建〜5個完整規模的團隊, 20 - 25半滿隊,葉〜約50個時間表誰不與任何人匹配)

  • 對於i = 1到14,對於我的團隊的每個成員,找到最接近的時間表的團隊(作爲整個),並將該成員添加到該團隊。一旦一個團隊達到規模15,將其標記爲「完成」。

這有效,但絕對沒有給我最好的球隊。我的問題是有沒有人知道更好的方法來做到這一點?僞代碼或只是一個普遍的想法將有所幫助,謝謝。

編輯:這裏是一個比較公式的例子 比較是基於代理程序計劃之間的半小時差異塊。 Agent 25的得分爲16,因爲他與Agent 23和24的差距爲8個半小時。根據每個人的得分加起來,球隊的總得分是32。

Comparison

並非所有的代理工作8個小時的日子,和許多有不同的休息日,這對他們的「接近性」得分的影響最大。此外,少數代理商在某一天的日程安排與他們的正常日程安排不同。例如,一名代理人可能在星期一上午7點至下午3點工作,但在星期二至星期五上午8點至下午4點工作。

+0

你如何定義「最佳團隊」? – mrogers

+0

當每個團隊的員工彼此的時間表中的差異最小時。 – obl

+0

@ mrogers:這是真正的問題。一旦你有了指標,你就可以開始優化。 –

回答

1

除非你找到一個能夠給你一個確切的最佳答案的方法,否則我會在最後添加一個爬山階段,反覆檢查是否交換團隊之間的任何代理對可以改善事物,如果這樣做會互換就是這樣,只有當它重新檢查了每一對代理商並且沒有更多的改進時纔會停下來。

我想有兩個原因這樣做:

1)這樣的爬坡找到合理的解決方案,很好往往出奇。

2)人們擅長尋找像這樣的改進。如果你製作計算機生成的時間表,人們可以找到簡單的改進(也許是因爲他們注意到他們經常與另一個團隊的人同時安排),那麼你會看起來很愚蠢。

考慮(2)尋找本地改進的另一種方法是尋找同時安排來自不同團隊的少數人的情況,並查看是否可以將他們全部交換到同一個團隊中。

1

無法確定計劃的確切時間,但在字符串算法中,您可以找到計算結果edit distance。這個想法是定義你需要執行的操作數來從另一個字符串中獲取一個字符串。例如,kittensitting之間的距離爲3,2個替代,1個爲刪除。我認爲你可以用類似的方式在兩個員工的時間表之間定義一個指標。

現在,在您有距離函數之後,您可以開始進行羣集。算法可能對您而言是一個好的開始,但它的主要缺點是組的數量最初是固定的。但我認爲你可以根據你的需要輕鬆調整一般邏輯。之後,您可以嘗試一些其他方法來聚合您的數據,但您應該從距離函數開始,然後簡單地在員工記錄上進行優化。