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