2012-04-26 25 views
0

我對下列問題的工作,現在的客戶端,這將創造最經濟的時間表(使用最少的替代品)說:替代調度程序/算法

  • 替代品應該在的地方老師的工作作爲連續時間 越好(*不是一個巨大的關注)
  • 替補可以爲6個週期

到目前爲止,我有一個老師級(如下圖所示),並實際創建一個管理類只工作最佳時間表。現在我只是讓程序循環遍歷網格來填充每個替代品。

Teacher[] t= new Teacher[14]; 
Organizer o = new Organizer(t);   
o.sort(); 

int[][] g = o.getGrid(); 

例輸入:

t[0] = new Teacher("Teacher 1", "Mr", new int[]{1,0,1,0,0,0,0}); 
t[1] = new Teacher("Teacher 2","Mr", new int[]{1,1,0,1,1,0,1}); 
t[2] = new Teacher("Teacher 3","Mr", new int[]{0,1,1,1,1,1,0}); 
t[3] = new Teacher("Teacher 4","Mr", new int[]{1,1,0,1,1,0,1}); 
t[4] = new Teacher("Teacher 5","Mr", new int[]{1,1,0,0,1,1,1}); 
t[5] = new Teacher("Teacher 6", "Mr", new int[]{1,1,1,0,0,1,1}); 
t[6] = new Teacher("Teacher 7", "Mr", new int[]{0,0,1,0,1,1,1}); 
t[7] = new Teacher("Teacher 8", "Mr", new int[]{1,1,0,0,1,1,1}); 
t[8] = new Teacher("Teacher 9", "Mr", new int[]{1,1,1,1,1,0,0}); 
t[9] = new Teacher("Teacher 10", "Mr", new int[]{0,0,0,1,1,1,0}); 
t[10] = new Teacher("Teacher 11", "Mr", new int[]{0,0,1,0,0,1,1}); 
t[11] = new Teacher("Teacher 12", "Mr", new int[]{0,0,1,1,0,1,0}); 
t[12] = new Teacher("Teacher 13", "Mr", new int[]{1,1,1,1,0,0,0}); 
t[13] = new Teacher("Teacher 14", "Mr", new int[]{1,1,0,1,1,0,1}); 

輸出,用於上述(與算法,我使用):

    P1 P2 P3 P4 P5 P6 P7 
Teacher 1   1 - 1 - - - - 
Teacher 2   2 1 - 1 1 - 1 
Teacher 3   - 2 2 2 2 2 - 
Teacher 4   3 3 - 3 3 - 3 
Teacher 5   4 4 - - 4 3 4 
Teacher 6   5 5 4 - - 4 5 
Teacher 7   - - 5 - 5 5 6 
Teacher 8   6 6 - - 6 6 7 
Teacher 9   7 7 6 7 7 - - 
Teacher 10   - - - 8 8 7 - 
Teacher 11   - - 8 - - 8 8 
Teacher 12   - - 9 9 - 9 - 
Teacher 13   8 9 10 10 - - - 
Teacher 14   9 10 - 11 9 - 10 

正如你所看到的,程序對面的有效空間循環,將他們填入潛艇,直到潛艇達到最大教學時間,然後開始一個新的潛艇。問題是,當我手動完成時,我已經可以將使用的次數減少到10次,所以我一直在試圖找到一個更高效的算法,但沒有用。

對於此輸入,使用的最小子數爲9(受P2列限制),所以我想看看是否有任何可能的方法可以完成該數目,或至少10個子數。提前致謝!

回答

0

對於每一列找出有多少空位。

將每個子首先放入最開放空格的列,然後隨機。這個算法將用10個子集解決你給定的問題。

在您的具體示例中,有59個空格。鑑於每個子只能填充6個空格,10是可以工作的最小子數。我相信它總能找到最佳解決方案。

(我忽略了你的連續天數規則,然後「隨機」規則可以替換爲試圖優化的規則......)