我正在研究一种活动调度算法。让我们说有N个活动。每项活动只能在指定的时间(例如上午8点至下午5点)内完成,并且有完成活动所需的持续时间(例如2小时)。我想在一天中完成尽可能多的活动,包括开始和结束时间。 E.g。
我希望从上午8点到晚上8点尽可能多地开展活动。我查看了Greedy Activity Selection算法,但我的情况与此有点不同。非常感谢任何帮助!
我试过这个逻辑:
Activity[] possibleActivities; // this has all the activities, Activity object has startTime, endTime and duration.
int dayStartTime= 8; //8am
int dayEndTime= 18; //6pm
Arrays.sort(possibleActivities); // sort the activities based on the startTime
int hours=dayStartTime;
List<Activity> dailyActitiy=new ArrayList<>();
for(Activity activity: possibleActivities){
if(activity.startTime<=hours && hours<dayEndTime){
dailyActitiy.add(activity);
hours+=dailyActitiy.duration;
}
}
return dailyActitiy;
答案 0 :(得分:1)
在调度文献中,这将被称为具有可变处理时间,发布日期和截止日期的单机调度问题。这个变体是NP难的(如果我正确地阅读经典文献),所以我通过一个现成的解算器推荐integer programming。
一种方法是为所有活动时间槽对制作0-1变量(例如,活动2,在早上7点到11点之间1.5小时得到变量x(上午2点到8点30分),x(2) ,上午7:30-9:00,x(上午2点到9点30点),x(上午2点30分,上午10点30点),上午2点(上午2点到10点30点),上午2点30分))指示活动是否应该在时间段内完成。目标是最大化所有这些变量的总和。有两种类型的约束:对于每个活动,其变量之和最多应为1,因此每个活动最多只安排一次;对于每个时间单位(在示例中为半小时),包含该单位的所有变量的总和应至多为1,因此每个时刻最多只有一个预定活动。