2012-04-26 24 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是可以工作的最小子数。我相信它总能找到最佳解决方案。

(我忽略了你的连续天数规则,然后“随机”规则可以替换为试图优化的规则......)