选择最佳组合

时间:2013-11-30 06:50:37

标签: math optimization combinations permutation

我有一个问题,我目前正在通过蛮力解决,但我正在寻找一个更优雅的解决方案。我有一个跨多个节点运行各种功能的系统。每个函数都由“角色”定义。可以将每个“角色”定义为允许一个或多个客户端保留它。另外,可以优先于特定客户端(或多个客户端)而不是其他客户端。

复杂性在于“角色”也可能彼此相关。例如,如果客户端不持有“RoleB”,则客户端可能只能持有“RoleA”,或者如果客户端持有“RoleD”,则客户端可能只能持有“RoleC”。此外,角色可以优先相关(即,持有'RoleE'的客户端最好持有'RoleF',但这不是强制性的。)

客户可以宣传其愿意担任任意数量的角色,但不是必须这样做。即'client1'可以为角色'A','B'和'C'做广告,而'client2'只能为角色'A'和'B'做广告。

我以蛮力的方式解决了这个问题,但很明显,随着相关角色的数量增加,解决它需要指数级的时间。

目前,我的算法是: 为广告给定角色的客户制定所有可能的组合,然后单独评估该角色,以生成按优先顺序排列的合法组合列表。

为上一步中生成的列表生成所有可能的组合,并对这些列表进行迭代,根据关于角色组的强制,非法,偏好和不利关系的启发式方法确定哪个是“最优”。随着相关角色数量的增加,这是指数级爆炸的部分。

我尝试了一些'早期'方法,根据角色关系确定理论上最大可能的“得分”,并且一旦我们遇到具有“得分”> =这样的组合我们就这样停止处理,但我想知道是否有更多的数学解决方案。任何解决方案都可能是最佳组合的近似值,但这很好。

理想情况下,我需要能够运行亚秒级的东西。

希望我的解释不是太模糊,有人可以指出我正确的方向! 提前致谢。 凸轮

1 个答案:

答案 0 :(得分:0)

听起来像Boolean satisfiability problem有一些额外的复杂功能。 BSP是一个NP完全问题,因此没有算法可以在不到指数的时间内解决它,但是有一些算法(在链接中提到)可以做得比暴力更好。