我有一套工作。
客户要求提供工作。 客户划分时间(例如:“您可以从8:00开始,在13:00结束)。 内部算法将为此作业生成估计的执行时间(即使此作业有5个小时,这个人可以在2小时内完成工作)。 这意味着这个人可以在8:00到10:00或10:30到12:30之间完成工作。
在工作日(8:00到17:00)的时间窗口中,我们将尝试将作业分配到列表,然后将此列表分配给工作人员。有多个名单和工人。
列表的唯一约束是,我们不能同时执行两个作业。 (但是,例如,你可以有 J1(8:00到12:00,执行时间1小时)和J2(8:00到12:00,执行时间2小时)它是因为J1可以在8:00到9:00之间完成,然后J2可以从9:00到11:00完成。
在javascript中,我的对象有一个开始时间,一个结束时间和估计的持续时间(使用有用且强大的时刻.js)。
列表只是一个带有专门推送的数组,如果可以添加作业,则返回true。
exemple 这是一个例子,我们有红色估计执行时间的棕色作业,它们在当天的时间窗口(黑色)。 最重要的工作是最后插入,要做的是尝试知道工作列表是否仍然可行。所以这里需要做的只是在稍后的两个其他工作之间滑动(绿色箭头)执行时间。 首先,我试图找到一种方法来了解是否可以将作业插入作业列表中。
然后我做了一个算法,其中执行时间在作业窗口时间总是 ASAP ,但我想我可以改进这个。
是否有任何建议以正确的方式来满足约束并允许在列表中插入最多的作业?
答案 0 :(得分:0)
我建议你先尝试一些解决方案,一纸或什么的,然后,如果你找不到,尝试一些研究。
提示:尝试对事物进行排序,看看它是否有助于做出决定。
这是一个经典算法问题,您应该查找Scheduling Algorithms
,并查看一些方法。
检查一下。
http://www.ctl.ua.edu/math103/scheduling/scheduling_algorithms.htm
答案 1 :(得分:0)
Here's a recursive example (which could be made iterative as a stack) with bit representation for the timeline and duration in half-hours. It exhausts all possibilities, exiting early if there's no fit (of course, if there is a fit, you could just output the first one and exit rather than returning all as in the example).
function toBin(start,duration){
return ((1 << duration) - 1) << (start - 8) * 2
}
function f(i,list,timeline,jobs){
if (i == jobs.length){
console.log(list);
} else {
for (var j=jobs[i].start; j+jobs[i].exec/2<=jobs[i].end; j+=0.5){
var bin = toBin(j,jobs[i].exec)
if (!(bin & timeline)){
var _list = list.slice();
_list.push("("+i+","+j+")");
f(i + 1,_list,timeline | bin,jobs);
}
}
}
}
Output:
var example = [{start:8, end:12, exec:2}, {start:8, end:12, exec:4}]
f(0,[],0,example);
/*
(job index, start time)
(0,8),(1,9)
(0,8),(1,9.5)
(0,8),(1,10)
(0,8.5),(1,9.5)
(0,8.5),(1,10)
(0,9),(1,10)
(0,10),(1,8)
(0,10.5),(1,8)
(0,10.5),(1,8.5)
(0,11),(1,8)
(0,11),(1,8.5)
(0,11),(1,9)
*/