【问题标题】:What kind of algorithm is this?这是什么算法?
【发布时间】:2009-07-08 09:52:09
【问题描述】:

这是什么算法,我几乎一无所知,但这就是我在代码中尝试做的事情......我有类“项目”,属性int Aint B——我有多个List<Item> 的列表,每个列表中有随机数量的 Item,与任何其他列表不一致。我必须从每个列表中选择 1 项以获得总和 Item.A 的最高可能值,同时遵守 Item.B 的总和也必须至少为某个数字。将来可能还会有另一个属性Item.C 符合该总和必须等于某个数字。我不知道怎么写这个:(

这么说吧;

class Item
  int A
  int B
  int C

我有一个 10 倍不同的 List<Item>,每个里面都有一个随机数的项目

我们必须找到最合适的组合

a) Highest sum of Item.A
b) Constraint that the sum of Item.B must be higher than X
c) Constraint that the sum of Item.C must be equal to X

我不知道如何编码才能快速高效。 :(

【问题讨论】:

  • 对我来说,这看起来像是 NP 难的二进制编程。尤其是对 Item.C 的等式约束,这将很困难。你有更多的结构吗?
  • 绝对不是线性规划!这是一个非常棘手的问题,除非这些列表中的类有更多的“顺序”可以用来发挥优势。还有更多信息吗?列表有多大,通常有多少项目? ---- NP-硬信息:en.wikipedia.org/wiki/NP-hard。 ----
  • (re:用户帐户;我为您合并了它们)

标签: c# algorithm


【解决方案1】:

正如我在评论中提到的,这是一个二进制编程问题,可以转换为multi-dimensional Knapsack problem。我会首先尝试使用现成的混合整数规划 (MIP) 求解器来解决它,就像 Lieven 在他的一个 cmets (lpSolve) 中建议的那样,因为你“只有”有大约 100-200二进制变量。您可能需要稍微调整一下参数。一些 MIP 求解器允许您添加搜索启发式,这可能会有所帮助。鉴于您的限制,我必须承认我不知道标准 MIP 求解器需要多长时间,但我不会屏住呼吸。

如果混合整数规划求解器对您来说速度不够快,您想看看一些更专业的算法。对于您的问题,Knapsack Problems、关于多项选择背包问题的第 11.10 章(几乎正是您的问题)和第 9 章中提出的问题是相关的。

编辑:根据您的 cmets,好消息是您的数据范围非常好,而且问题似乎可以在合理的时间内解决。这个paperDOI,以防链接消失)提出了一种算法,根据作者的说法,它可以在几秒钟内解决您的大小问题(参见第 4.4 和 5.1 节)。坏消息是它包含很多数学......

【讨论】:

  • 感谢您的参考,现在正在阅读多项选择背包问题。
【解决方案2】:

我以未注册用户的身份发布了这个问题,点击注册后,它并没有将我的未注册用户与我的注册用户关联起来,很好 =/

关于范的评论:

通常会有大约 14 个列表左右 在每个列表中,通常会有大约 5-15 个“项目” 每个项目都有这 3 个属性。 我们必须从每个列表中准确选择一项。 当我们从每个列表中选择一项后计算所有 PropertyA 的总和时,我们正在寻找 PropertyA 的最大值 约束是 PropertyB 和 PropertyC,所选组合也必须确认,再次使用组合中的值的总和。

它也必须是最优解,而不是近似值。

【讨论】:

  • 14 个列表,每个列表有大约 10 个项目,从每个列表中选择一个,这大约是一百万亿种可能的组合。似乎很难找到最佳的。
  • @ShaunO:可以发布一些样本集吗?真的是随机的吗?从什么范围? 1-10 还是 1-10^10?这些信息尤其有助于对 PropertyC 的平等约束?你真的需要平等约束吗,因为它使它变得更加复杂?
  • 属性A一般为100-300~,属性B一般为0-70,属性C一般为0-3。在特定组合中,Property C 必须等于 3。今晚回家后,我将发布一些真实世界的示例数据。现在我正在使用嵌套的 foreach 循环,但根据当前数据,它有 4.2 万亿个可能性。
  • 有哪些数据类型?总是整数还是可以浮动?另外,它们可以是负数吗?
  • 它们总是整数,永远不会是负数。
猜你喜欢
  • 2011-02-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多