我需要將工人置於某個班次的工作中。工作人員對他們希望工作的工作設置了優先順序。工作時間最少的工人在工作中獲得第一選擇。只有一名工人可以從事某項工作。具有多個列表的排列
我試圖通過創建鋸齒陣列來解決這個問題。該陣列由最小時間的工人排序。每個子數組都是特定的工人偏好列表。數組中的數字是作業代碼。然後我生成排列,直到我得到一個有效的解決方案。
例如,下面列出了28名工人以及每位工人的工作偏好。
int[][] preference = {
new int[] {1,2,3,4,5,6,7,8,11,12,13,14,15},
new int[] {2,4,5,6,7,8,11,12,13,14,15},
new int[] {1,3,6,7,8,9,10,14,15,18,19,22,23,24,26,27,29,30,32,34,35,25,36},
new int[] {4,5,12,13},
new int[] {9,10,11,14,15,1,2,6},
new int[] {9,10,11,14,2,6,18,19,27,29,30,31,32,35},
new int[] {11,12,13,14,2,4,5,6},
new int[] {12,13,4,5},
new int[] {9,10,11,13,14,15,1,2,6,7,8,18,19,21,22,23,24,26,27,28,29,30,31,32,34,35,16,17,33,36},
new int[] {1,2,9,10,11,14,15,18,19,30,31,32,35,37,33},
new int[] {4,13,18,19,35},
new int[] {18,19,35},
new int[] {21,22,23,24,18,19},
new int[] {22,23,24,25,18,19,16,17},
new int[] {18,19,23,24,35},
new int[] {18,19,23,24,35},
new int[] {27,26,28,29,30,32,34,35,36},
new int[] {27,26,30,32,34,35,36},
new int[] {28,29,30,31,32,33,35},
new int[] {28,29,30,31,32,33,26,35,36},
new int[] {26,29,30,31,32,34,35,36},
new int[] {28,29,31,32,33,26,35,36},
new int[] {27,28,29,30,31,32,35,33,1,2,3,9,10,11,14,18,19,6,15},
new int[] {34,35,36,26,27,31,32},
new int[] {31,32,34,35,2,11,14,18,19,23,24,6,15,16,17,20},
new int[] {37,29,30,31,32,35,33,36,2,9,10,11,14,18,19,23,24,6,15,16,17},
new int[] {18,19,35},
new int[] {18,19,35},
};
preference[0]
包含第一個工人喜好列表。 prererence[1]
包含第二個工作人員Perference列表,依此類推。在這個例子中,第一個工人已經選擇工作1,2,3,4,5,6,7,8,11,12,13,14,15
。 正確的解決方案是:1,2,3,4,9,10,11,12,14,15,13,18,21,22,23,24,27,26,28,29,30,31,32,34,6,37,19,35
。
我遇到的問題是性能問題。我嘗試使用遞歸循環和非遞歸循環迭代,性能非常糟糕。我的想法是必須有一個不同的方法來解決這個問題,或者一個已經可以購買的圖書館。預先感謝您的幫助。
您可否詳細說明「然後我生成排列,直到我得到一個有效的解決方案。」?爲什麼不簡單地重新列出清單,併爲每個員工列出他們的第一個可用工作?解決方案的正確性標準是什麼? – captncraig 2011-05-09 20:03:40
我假設兩名工人不能做同樣的工作,所以你必須計算出每個人對於「最喜歡的」工作選擇有多接近的最小總和 – BrokenGlass 2011-05-09 20:06:06
你的*正確*解決方案似乎很奇怪。誰的工作號碼是5?爲什麼在14和15之前選擇13?請您詳細說明所需的輸出,並提供更多關於迄今爲止所做的工作的信息(如CMP建議的) – 2011-05-09 20:14:57