根据某些事件的时间组织计划的算法?

问题描述:

我想制作一个每个学期的课程,根据我输入的课程列表创建一个课程表,所以如果我添加各种课程,取决于这些课程将要发生的时间和日期,那么课程将能够匹配可以添加什么类而不会相互拦截。我想知道是否有算法或比较课程安排的方法,以便确定课程列表中的哪些课程。根据某些事件的时间组织计划的算法?

做这些的唯一方法,我可以想象的是许多if语句或添加一个开始课程,然后有一个数组跟踪小时,每个位置开始0,然后每次占用一个小时我改变数组的位置为1.然后,当添加课程时,我检查哪些位置与1不同,并尝试添加该类。

我想找到比我能想象的更优化的解决方案。

这是一个计划问题。规划问题很难以有效的方式解决:在这类问题中,性能问题很快就会出现。

如果你只是想解决这个问题,你应该检查现有的规划问题解决者喜欢OptaPlanner:它是开源的,所以你可以尝试去了解它是如何工作的,并有一个blog与interresting有关规划问题的想法。

如果您想要一种方法,给定一组具有时间和选定类的类,输出可用的类,则可以使用简单的迭代来完成这项工作。假设你有5小时的插槽与4个班,你可以代表一个单一阵列中的每个类:如果你选择类占用的最后2小时,然后

int[][] times = { 
      {0,1,1,0,0}, 
      {1,1,0,0,0}, 
      {0,1,0,0,0}, 
      {0,0,0,1,1} 
    }; 

那么剩下的选项是:

{0,1,1,0,0}, 
{1,1,0,0,0}, 
{0,1,0,0,0} 

鉴于这种表现,你可以这样做:

import java.util.*; 

public class C { 

    static int[][] available(int[] c,int[][] times){ 
     ArrayList<Integer> index = new ArrayList<>(); 
     ArrayList<Integer> result = new ArrayList<>(); 
     for(int i=0;i<c.length;i++) 
      if(c[i]==1) index.add(i); 

     for(int i = 0; i < times.length; i++){ 
      if(!times[i].equals(c)) { 
       for (int j = 0; j < times[0].length; j++) { 
        if(times[i][j]==1){ 
         if(index.contains(j)) break; 
        } 
        if(j==times[0].length-1) result.add(i); 
       } 
      } 
     } 
     int[][] r = new int[result.size()][c.length]; 
     for(int i=0;i<result.size();i++){ 
      r[i] = times[result.get(i)]; 
     } 
     return r; 
    } 

    public static void main(String[] args) { 



     int[][] times = { 
       {0,1,1,0,0}, 
       {1,1,0,0,0}, 
       {0,1,0,0,0}, 
       {0,0,0,1,1} 
     }; 
     int[] c = {0,0,0,1,1}; 
     available(c,times); 

     System.out.println(Arrays.deepToString(available(c,times))); 


    } 

}