活动调度算法设计,以最大限度地增加活动数量

时间:2017-03-05 20:48:29

标签: java algorithm greedy

我正在研究一种活动调度算法。让我们说有N个活动。每项活动只能在指定的时间(例如上午8点至下午5点)内完成,并且有完成活动所需的持续时间(例如2小时)。我想在一天中完成尽可能多的活动,包括开始和结束时间。 E.g。

  1. 活动1(上午8点至下午5点)需要2小时
  2. 活动2(早上7点至11点)需要1.5小时
  3. 活动3(上午11点至下午3点)需要1小时
  4. 活动4(下午1点至3点30分)需要1.5小时
  5. 活动5(早上6点至晚上8点)需要3个小时
  6. 活动6(上午11点至下午6点)需要2小时
  7. 活动7(下午2点至下午5点)需要1小时
  8. 活动8(晚上7点至12点)需要1小时
  9. 我希望从上午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;
    

1 个答案:

答案 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,因此每个时刻最多只有一个预定活动。