【问题标题】:Optimal group selection from a dictionary Python从字典 Python 中选择最佳组
【发布时间】:2011-04-21 16:00:38
【问题描述】:

所以我有一个带有 key:value(tuple) 的字典。像这样的东西。 {"name":(4,5),....} 其中 (4,5) 代表两个类别 (cat1, cat2)。给定第二类的最大数量,我想找到字典条目的最佳组合,以使第一类最大化或最小化。

例如,如果 maxCat2 = 15,我想从字典中找到一些条目组合,这样,当我将每个条目中的 cat2 值相加时,我的年龄在 15 岁以下。可能有很多这样的条件。在这些可能性中,我想选择一个,当我将每个条目的 cat1 的值相加时,它大于其他任何可能性。

我想过编写一个算法来获取字典中条目的所有排列,然后查看每个排列是否符合 maxCat2 标准,然后查看其中哪一个给我最大的总 cat1 值。如果我有 20 个条目,这意味着我会检查 20 个!组合,这是一个非常大的数字。有什么办法可以避免这种情况吗?谢谢。

【问题讨论】:

  • 这么多……文字!格式化并举出例子,因为这会让许多阅读它的人感到厌烦(无意冒犯)。
  • 到目前为止您尝试了哪些方法,哪些方法不适合您?邮政编码或它没有发生!

标签: python algorithm


【解决方案1】:

正如Jochen Ritzel 所指出的,这可以看作是knapsack problem 的一个实例。

通常,您有一组对象同时具有“重量”(在您的示例中为“第二类”)和“价值”(或“成本”,如果是最小化问题)。

问题在于选择对象的子集,使其“值”的总和最大化/最小化,受制于权重总和不能超过指定最大值的约束。

虽然这个问题一般来说是棘手的,但如果对权重和最大值的约束是固定的,则存在使用dynamic programmingmemoization的多项式时间解。

从广义上讲,这个想法是定义一组值,其中

Cij 表示仅考虑前 i 个对象可获得的最大总和(“值”),其中总重量(的选择的子集)不能超过 j

这里有两种可能的选择来计算Cij

  • 任何一个元素i都包含在子集中,然后

    Cij = i + Ci-1,j-权重i

  • 或元素i不在所选对象的子集中,所以

    Cij = Ci-1,j

需要选择两者中的最大值。

如果 n 是元素个数,w 是最大总权重,那么答案以 Cnw 结尾.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2013-12-16
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多