【问题标题】:Algorithm for finding maximum number of valid combinations?查找最大有效组合数的算法?
【发布时间】:2011-12-11 23:47:45
【问题描述】:

好的...所以我有一个棘手的问题(至少对我来说)。

我有一个简单对象的列表,我需要弄清楚如何找到利用最大数量的组合。这些对象的类中的每一个都有一个属性(字符串)作为它们的名称,一个属性(列表)用于它们喜欢与之结合的其他元素的名称,以及一个属性(列表)用于它们所使用的其他元素的名称不喜欢结交。

如果一个元素被添加到一个集合中,并且该特定元素“喜欢”该集合中已有的一个(或多个)其他元素,则添加的元素为该集合中它喜欢的每个项目返回 +1 的分数.同样,对于添加的元素不喜欢的集合中的每个其他元素,都会返回 -1 的分数。将所有元素添加到最终集合后,每个元素的分数必须 >= 0。

我将如何找到可以返回最大集合的元素组合?如果多个组合返回相同数量的元素,则应返回所有可能的组合。

我希望这是有道理的......另外,我使用的是 C# (.NET 4.0),但可以使用任何编程语言,我只需要弄清楚它背后的逻辑。

提前致谢,
桑尼

【问题讨论】:

  • 您正在查看的对象是否是有限的集合或特定范围的对象?单个对象可以在集合中重复吗?
  • 另外,“喜欢”和“不喜欢”列表是否已为每个项目预定义和固定,所有项目的长度是否相同?如果长度不同,您可以在添加它们之前尝试按受欢迎程度对项目进行排序。
  • 关系是否对称?我的意思是如果A喜欢B,是否意味着B喜欢A,如果A不喜欢B,是否意味着B不喜欢A?
  • @jball - 集合的初始大小可以是任意的,结果列表可以根据需要使用尽可能多或尽可能少的初始元素。最终结果列表只能包含唯一元素。
  • @500 - 内部服务器错误 - 喜欢和不喜欢是静态的,并在运行前确定。

标签: algorithm combinations maximize


【解决方案1】:

我认为你说这是一个棘手的问题是对的。我认为对象是图中的节点,而喜欢/不喜欢的信息则是赋予节点之间的链接权重。忽略“like”字段并为所有链接赋予权重 0 或权重 -1。在这种情况下,您的问题是找到最大节点数,使得它们之间的所有链接的权重为 0,并且没有一个链接的权重为 -1。假设您有一个程序可以有效地执行此操作。

现在看问题http://en.wikipedia.org/wiki/Clique_problem,这是一个已知的难题。如果您有最大集团问题,则在所有节点之间创建链接。如果两个节点在最大 clique 中链接,则权重为 0。如果链接不存在,则权重为 -1。现在运行一个程序来解决你的问题,你已经解决了 max clique。所以我认为你的问题是 NP-Complete,并且不太可能有一个有效的解决方案。

【讨论】:

  • 谢谢,wiki atricle 正是我想要解释的。我最多只处理一打或两打节点,所以我想我会尝试暴力破解它,看看性能如何。
猜你喜欢
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2020-04-24
  • 1970-01-01
  • 2015-05-22
  • 2010-09-13
相关资源
最近更新 更多