【发布时间】:2017-06-20 02:12:31
【问题描述】:
我正在尝试找到解决以下问题的算法。
假设我有许多对象 A、B、C、...
我有这些对象的有效组合列表。每个组合的长度为 2 或 4。
例如。 AF、CE、CEGH、ADFG、...等等。
对于两个对象的组合,例如。 AF,组合的长度为2。对于四个对象的组合,例如CEGH,组合的长度。
我只能选择不重叠的组合,即我不能选择 AF 和 ADFG,因为它们都需要对象“A”和“F”。我可以选择 AF 和 CEGH 的组合,因为它们不需要公共对象。 如果我的解决方案仅包含 AF 和 CEGH 两个组合,那么我的目标是组合长度的总和,即 2 + 4 = 6。
给定一个对象列表及其有效组合,我如何选择不相互重叠的最有效组合,以便最大化组合长度的总和?我不想将其表述为 IP,因为我正在处理具有 180 个对象和 1000 万个有效组合的问题实例,并且使用 CPLEX 解决 IP 的速度非常慢。寻找其他优雅的方法来解决它。我可以将其转换为网络吗?并使用最大流算法解决它?还是动态程序?不知道如何解决这个问题。
【问题讨论】:
-
"CEGH,组合的长度。" ->“CEGH,组合的长度为4。”
-
考虑由 [[X 与 Y] 给出的对象上的无向图当且仅当 [XY 是至少一个有效组合的子集]]。 (你可以通过一次有效的组合来构建该图。)该图是连通的吗?如果不是,那么您可以轻松地将您的问题拆分为严格更小的不相交子问题。
-
如果它是连通的,则计算顶点容量为 log ( 1 + 对象所在的有效组合数) 和边容量为 log ( 1 + 边的有效组合数) 的子集并尝试使用contracting 不相交的可能但非必要连接并使用generalized max-flow。 (这些容量可以通过你的有效组合计算一次。)
-
当你得到不太高的流量时,尝试增长要收缩的子图。如果您可以使两个子图都相当大而不会允许过多的流量,那么您可以将您的问题减少到不是太多显着更小的子问题。
-
@RickyDemer 感谢您的回答-您能否将我引导到更详细解释的地方(如果存在)?也许举个例子?
标签: algorithm dynamic-programming combinatorics network-flow