Math 选择最佳组合

Math 选择最佳组合,math,optimization,combinations,permutation,Math,Optimization,Combinations,Permutation,我有一个问题,我目前正在通过暴力解决,但我正在寻找一个更优雅的解决方案。我有一个跨多个节点运行各种功能的系统。每个函数都由一个“角色”定义。可以将每个“角色”定义为允许一个或多个客户端持有它。此外,与其他客户相比,可以优先考虑特定客户(或多个客户) 复杂性在于“角色”也可能相互关联。例如,如果客户不持有“RoleB”,则可能只能持有“RoleA”,如果客户持有“RoleD”,则可能只能持有“RoleC”。此外,角色可以优先关联(即,持有“RoleE”的客户最好持有“RoleF”,但这不是强制性的

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

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

客户可以宣传其愿意担任任意数量的角色,但无需这样做。i、 e“客户端1”可以广告角色“A”、“B”和“C”,而“客户端2”只能广告角色“A”和“B”

我已经用蛮力的方式解决了这个问题,但很明显,随着相关角色数量的增加,解决这个问题所需的时间会呈指数级增长

目前,我的算法是: 计算出客户宣传某个角色的所有可能组合,然后单独评估该角色,生成按偏好排序的合法组合列表

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

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

理想情况下,我需要的东西可以运行亚秒

希望我的解释不是太模糊,有人能给我指出正确的方向! 提前谢谢。
Cam

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

感谢Saposhiente,我已经看过BSP的内容,但我认为它不太适合这种情况。如果我错了,请纠正我,但对于BSP问题,您有一个“方程”,需要确定是否有解决方案。在我的例子中,我有很多解决方案,需要找到一个最优的(或接近最优的)。因此,我认为BSP在这种情况下不起作用。有趣的阅读!除了“首选项”部分,您的问题简化为BSP。NP完全问题的问题是,虽然它们很难解决,但它们的解决方案很容易验证;在这种情况下,BSP的解是返回方程的一个可能解。运行一个可用的算法可以保证为您提供一个解决方案(如果存在),但不一定是首选的最佳算法。是的,我同意它可以提供一个解决方案,但不能保证最佳解决方案。不幸的是,这对我的应用程序没有多大用处,因为我需要一个近似最优解决方案的东西。谢谢你的建议,非常感谢。看起来加权最大SAT可能是一种可能性