【问题标题】:Activity selection algorithm with 2 types of activities具有 2 种活动类型的活动选择算法
【发布时间】:2016-04-26 18:05:49
【问题描述】:

我正在尝试使用动态编程来解决这个问题,但我不知道如何定义子问题以及它们之间的关系。

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

谢谢。

【问题讨论】:

  • 将它们分成 2 个集合,尝试从 Grays 中选择 2 个,从 Yellows 中选择 1 个,就像您对常规选择问题所做的那样,比较 -> 获取新时间戳 -> 删除无效活动(从两个集合中)跨度>
  • 准确地说:如果黄色活动与 3 个灰色活动重叠怎么办?如果单个黄色活动与 1000 个不重叠的灰色活动重叠怎么办——我们仍然选择 1 个黄色而不是 1000 个灰色吗?
  • 将选择一个黄色活动而不是任何数量的非重叠灰色活动。 @j_random_hacker

标签: algorithm dynamic-programming


【解决方案1】:

将它们分成 2 个集合,尝试从 Grays 中选择 2 个,从 Yellows 中选择 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)       
}

注意:

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

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多