这是什么算法?

时间:2009-07-08 09:52:10

标签: c# algorithm

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

所以这样说吧;

class Item
  int A
  int B
  int C

我有一个10x不同的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

我不知道如何编写这个快速高效的代码。 :(

2 个答案:

答案 0 :(得分:3)

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

如果混合整数编程求解器不够快,您需要查看一些更专业的算法。对于你的问题,Knapsack Problems,第11.10章中关于多选背包问题(几乎完全是你的问题)和第9章的内容是相关的。

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

答案 1 :(得分:1)

我将此问题作为未注册的用户发布,点击注册后,它没有将我的注册用户与我的注册用户相关联,很好= /

关于van的评论:

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

它也必须是最佳解决方案,而不是近似值。