【发布时间】:2020-03-07 05:01:56
【问题描述】:
我有一些带有权重的活动,我想通过最大化总权重来选择不重叠的活动。这是已知问题并且存在解决方案。
就我而言,我可以在一定程度上改变活动的开始时间,而持续时间保持不变。这会给我一些灵活性,我可能会提高我的利用率。
示例场景类似于以下,其中所有活动都应该在区间 (0-200) 内:
(start, end, profit)
a1: 10 12 120
a2: 10 13 100
a3: 14 18 150
a4: 14 20 100
a5: 120 125 100
a6: 120 140 150
a7: 126 130 100
如果不改变灵活性,我会选择 (a1, a3, a6) 就是这样。另一方面,对于任何 t 给出。在这种情况下,我可能会想出这个时间表,并且可以选择除 a7 之外的所有任务,因为 shift 无法避免冲突。
t: 5
a1: 8 10 120 (shifted -2 to left)
a2: 10 13 100
a3: 14 18 150
a4: 18 24 100 (shifted +4 to right)
a5: 115 120 100 (shifted -5 to left)
a6: 120 140 150
在我的问题中,就活动持续时间而言,我拥有的总时间非常长。虽然活动平均需要 10 秒,但我的总时间甚至是 10000 秒。然而,这并不意味着可以选择所有活动,因为转移灵活性不足以使某些活动不重叠。
在我的问题中,还有一些重叠的活动集群和非常大的空白空间,没有活动,还有另一个重叠的活动集群,即 a1、a2、a3 和 a4 可以说是 cluster1 a5、a6 和 a7 是 cluster2。每个集群可以通过将其中的一些向左和向右移动来及时扩展。通过这样做,我可以选择比原来的活动选择问题更多的活动。但是,我不知道如何决定将哪些任务向左或向右移动。
我的期望是找到一个接近最优的解决方案,其中总利润会以某种方式局部最优。我不需要全局最优值。此外,我没有关于集群利用率的任何标准,即我不能保证每个集群的最小活动数量等。实际上,这些集群是我直观描述的。没有定义集群。然而,在时域中,活动以某种方式被分离为集群。
活动开始和结束时间也是整数,因为我可以忽略分数。我会有大约 50 个活动,平均持续时间为 10 个。时间窗口是10000。
这个问题有什么可行的解决办法吗?
【问题讨论】:
-
将“班次”编码为离散的附加选项是否可行?例如,给定 2 小时的灵活性,而不是从 6 开始到 7 结束的灵活任务,我们的选择列表现在将包括 (4,5), (5,6), (7,8), (8 ,9) 和 (6,7)? (然后我们必须保证每个这样的集合中最多有一个被选中。看起来像约束满足。)
-
就我而言,我的活动时间大约为 5 秒,而我的灵活性大约为 2 分钟。因此,每个包含的任务不可能重叠。在这种情况下,我面临另一个问题;如何从非重叠组中选择最多一项任务。这也是另一个问题
-
不确定我是否理解。问题正文中的一个最小示例以及数据类型(正如您所建议的,我们正在查看的范围类型)可能会有所帮助。
-
@SamiŞimşekli 我对“在我的问题中,我为时域中的每个活动都有足够的空间”感到有些困惑。 - 你是说你可以保证如果你以最佳方式转移它们,就可以选择所有活动?您的示例设法选择了所有活动,因此不会混淆。
-
另外,您对每个集群内的最大活动数有一些期望/保证吗?
标签: optimization dynamic-programming greedy