【问题标题】:Algorithm for organizing an schedule depending of the time of some events?根据某些事件的时间组织时间表的算法?
【发布时间】:2016-08-17 03:27:39
【问题描述】:

我想制作一个程序,每学期根据我输入的课程列表创建一个时间表,所以如果我添加各种课程,取决于这些课程发生的时间和日期,那么程序将能够匹配可以添加哪些类而不互相拦截。我想知道是否有比较课程表的算法或方法,以确定我可以从课程列表中选择哪些课程。

我能想象到的唯一方法是使用许多 if 语句或添加一个起始课程,然后有一个跟踪小时的数组,从 0 开始每个位置,然后每次占用一个小时我更改数组位置为 1。然后在添加课程时,我检查哪些位置与 1 不同并尝试添加课程。

我想为这个问题找到一个比我想象的更优化的解决方案。

【问题讨论】:

    标签: java algorithm oop search data-structures


    【解决方案1】:

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

    如果您只是想解决问题,您应该查看现有的规划问题解决程序,例如 OptaPlanner:它是开源的,因此您可以尝试了解它是如何工作的,并且有一个 blog 对规划有有趣的想法问题。

    【讨论】:

      【解决方案2】:

      如果您想要一种方法,在给定一组类及其时间和选择的类的情况下,输出可用类,您可以使用简单的迭代来完成这项工作。假设你有一个 5 小时的时段,有 4 个班级,你可以用一个数组来表示每个班级:

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

      因此,如果您要选择占用最后 2 小时的课程,那么剩下的选项将是:

      {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)));
      
      
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        • 2019-12-25
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多