具有两种活动的活动选择算法

时间:2016-04-26 18:05:50

标签: algorithm dynamic-programming

我试图使用动态编程解决这个问题,但我无法确定如何定义子问题及其之间的关系。

所以它与常规活动选择问题基本相同,只是你有两种类型的活动(让他们称之为黄色和灰色),所以每个活动都有一个开始时间结束时间和颜色。 黄色活动的优先级高于灰色活动,因此如果黄色活动与2个灰色活动重叠,则黄色活动将进入解决方案并且灰色活动不会被激活。

感谢。

1 个答案:

答案 0 :(得分:0)

将它们拆分为2个集合,尝试从Grays中选择2,从黄色中选择1,就像使用常规选择问题一样,比较 - >获得新的时间戳 - >删除无效活动(来自两个集合)

A = { }, Selection
loop {
   G1 = Select(1 from Gray)  
   Y1 = Select(1 from Yellow)  
   if (Y1.finish < G1.finish) { 
      Selection = Y1;
   }
   else {
      G2 = Select(2 from Gray)
      if (Y1.finish < G2.finish)
          Selection = Y1;
      else
          Selection = {G1, G2}
   }

   A = A U Selection;
   LowerBound = Selection.Last.Finish;
   RemoveFrom(Yellow : have starting time < LowerBound)
   RemoveFrom(Gray   : have starting time < LowerBound)       
}

注意:

  • 灰色和黄色应按原始问题排序
  • 选择是您在原稿中执行的常规选择操作 问题
    - &GT;所以Select(2...)并不意味着选择前两个 收集,但前2个可行的活动
  • 为了便于实现,考虑使用2个队列,以及其他一些技术来获取LowerBound,如果正确实现,应该是O(n)时间和空间(减去排序)