【问题标题】:Grouping lists minimizing sum of unique items with Python使用 Python 分组列表最小化唯一项目的总和
【发布时间】:2021-07-21 19:58:41
【问题描述】:

这可能是一个与之前提出的其他问题非常相似的问题,但我找不到针对我的具体案例的解决方案。

我有物品清单。 编辑我将显示 4 个列表,但真正的问题可能有数千个列表,比如 3000:

清单 1:项目 A、B、C、D

清单 2:C、D、E、F 项

清单 3:项目 A、D、F

清单 4:项目 B、C、D、F

我想对列表进行分组,以便生成的组具有最小的唯一项总和。

例子:

列表 (1 + 2):A、B、C、D、E、F = 6 项

列表 (3 + 4):A、B、C、D、F = 5 项

总计 = 6 + 5 = 11 项

替代解决方案

列表 (1 + 4):A、B、C、D、F = 5 项

列表 (2 + 3):A、C、D、E、F = 5 项

总计:5 + 5 = 10 个项目,这将是比第一个更好的解决方案。 EDIT 组数应该可以在代码中/通过用户输入进行编辑,范围可以从 1 到 10。

目的是创造场景:

  • 1 组 --> 将所有 3.000 个列表合并在一起,结果是唯一项的简单计数
  • 2 组 --> 每组 1.500 个列表(大约,不必精确),目的是找到智能分组以最小化 2 组的唯一项的总和
  • 3 组 --> ...
  • 4 组 --> ...
  • 3.000 个组 --> 每个列表是一个组,其中结果是每个列表中不同项目的总和

非常感谢。

【问题讨论】:

  • 这个问题有一个直截了当的答案,当它关闭时我正在写它。它不应该被关闭。
  • @Sujay 我想你还没有真正理解这个问题。问题不在于如何找到两个列表中唯一元素的数量。
  • 如何找出所有组合并取得最佳效果?这种方法有什么问题?您是否正在寻找一个启发式函数来丢弃某些组合?
  • @daniherrera 有一个完整图的(n-1)!! 完美匹配 - 其中!!double factorial - 所以蛮力方法只适用于非常小的n
  • @daniherrera 运用常识。

标签: python


【解决方案1】:

这可以建模为maximum weight matching 问题。考虑一个图表,其中您的列表是顶点,并且在任何两个顶点之间都有一条边,其权重是某个足够大的常数减去两个列表联合中不同元素的数量。 (较大的常数是为了使权重不是负数,因此最大权重匹配必然包括所有顶点。)

然后问题是找到一组不共享任何顶点的边,其权重总和最大化。这可以使用 blossom algorithm 在 O(n4) 时间内实现。

该问题也称为“最小权重完美匹配”问题,因此您可以通过搜索该术语找到有关其他方法的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多