【问题标题】:Algorithm to find the most optimal match of multiple groups of objects寻找多组对象的最佳匹配的算法
【发布时间】:2017-06-07 10:23:35
【问题描述】:

对于这个冗长的问题,我提前道歉,我试图尽可能地总结它。

我正在开发一个武术联盟的应用程序。
应用程序的第一个模块 需要开发一个复杂的算法来安排比赛,即将n 参与者安排在@987654322 大小的括号中@(例如每个括号中有 4 位参与者)。
必须针对多种条件以最优化的方式排列括号。

每个参与者都有几个参数:

  • 腰带(武术中可以翻译成 数)
  • 体重类别(例如 60-70 公斤、80-90 公斤……)
  • 年龄类别(例如 16-18、18-25、26-36…)
  • 学院名称(该参数的目标是使最大 括号内的差异)
  • 被允许与具有一个等级的其他参与者进行对抗 他上方的腰带(真,假)
  • 被允许参加对一个体重的参与者 他上面的类别(真,假)
  • 允许针对一岁的参与者参加 他上面的类别(真,假)

条件:

每个“最佳”括号都有x 参与者共享相同的腰带、体重类别、年龄类别,并且所有参与者都必须具有学院名称参数的最大方差。

如果有参与者不能满足上述条件并且他们没有括号,或者他们只能适应x-y大小的括号,那么算法必须做出最好的(“最好”将稍后描述)根据最后 3 个布尔参数决定并替换“完美”括号内的参与者。
同样在所有替换之后,学院名称之间必须发生差异。

我的问题是解决该问题的最佳方法是什么? 我会感谢一些里程碑或参考一些讨论此类问题的数学文献(我不希望任何人为我解决它,只是指导)。

我对如何解决的一般看法:

用一个等级对所有括号进行排序,然后与所有括号的总等级相关。

例如,4 名参与者的“完美”括号将被评为Z,缺少学院名称差异的权重将被评为(更多解释请参见黄色标记段落)
–(17X<Z) 所以如果 2 位参与者共享相同的学院名称,则成绩将为 Z-(17X<Z),如果 3 位参与者共享相同的学院名称 Z-2(17X<Z),依此类推……

如果括号将或/也与他们的腰带、体重类别或年龄类别不匹配,则等级将被另一个–(17X<Z)降低。

重要的规则是等级最“差”的房子比没有括号更可取

(它的 17X 因为与学院条件的最大差异在括号中 4 是 4X,年龄类别的最大差异是另一个 4X 和 参与者之间的其余“不良联系”是 16,我加 1 以产生大于 0 或小于 Z 的等级。

这是简单的部分,但我得出的结论是,如果我想要“最佳”或最佳成绩,我将需要递归地重复大量且不可能的次数,以便在所有括号中达到更高的一般成绩最终达到最优综合等级。

我完全不确定,也许需要换一种思维方式。
它不是那么重要,但对于一般知识来说,开发语言是 C#。
非常感谢您的时间和考虑。

【问题讨论】:

  • 你几乎可以肯定这个问题过于复杂了。我建议您可以注入不同的算法并从一个简单的算法开始。
  • N 可能有多大?我问是因为一旦你应用了选择限制(与腰带、体重、年龄有关),这个问题可能会受到蛮力的影响。如果是这样,您只需要一个评分函数来为任何给定的括号集分配一个数字。然后遍历每个合法集合并选择最好的。
  • @FMc tnx 给您的评论,N 平均约为 400,我明白您的意思,但任务是找到最佳的通用组合
  • 解决此问题的一种简单方法是找到给定竞争者的所有可能匹配项,然后在为每个人完成此操作后,对竞争者进行优先排序,以便那些潜力最少的竞争者对手首先匹配。
  • @ mVChr 但是如果一个竞争者有 5 个相同的最佳匹配,但我将选择的每场比赛都会对其他竞争者之间的其他比赛产生不同的影响,我将如何获得最佳的综合成绩所有括号?

标签: java c# c++ algorithm computer-science


【解决方案1】:

简单不完美的方法:尝试为每个人分配一个值,以表示他们找到匹配项的麻烦程度。最麻烦的是最低的体重、腰带、年龄都无法匹配,这意味着他们必须与完全相同的腰带/年龄/体重的人匹配。将每个值标准化为 0-n 比例(因此年龄组 5-9 = 0、10-14 = 1 等)。将 person 值指定为这些值的总和,因此:

Age 15      +2
Belt Yellow +1
Weight 110  +3
Yes         +.5
Yes         +.5
No          +0
Score=7.0

接下来定义一个函数来确定 2 个玩家之间的差异,这不会是上面的简单减法 - 你不希望某人 10 岁的 4 级腰带与 28 个 1 级腰带相匹配。您的差异函数将类似于:

int diff(Person p1, Person p2)
{
  var diff = 0.0f;
  bool ageDiffAcceptable = p1.Age - p2.Age == 1 && p2.CanPlayerOlder || p2.Age - p1.Age == 1 && p2.CanPlayerOlder;
  var ageDiff = (p1.Age - p2.Age) * (ageDiffAcceptable ? 1 : 1.5);
  diff += pow(agDiff, 2) // Someone that is 2 age groups away will increase at a higher rate; adjust this 2 based on the importance of this particular field

  // Same for weight and belt

  // Account for player score - we want to prefer similarly scored players as a tiebreaker
  diff += abs(p1.Score - p2.Score) / Constants.MaxScore;
  return diff;
}

有了这些,从得分最低的Person 开始,找到差异最小的x-1 Person 实例,这就是你的第一个括号。重复直到所有Person 都在括号中。

【讨论】:

  • 非常感谢您抽出宝贵时间写下这篇文章!我将在算法的第一部分使用该逻辑。但主要问题是如何将所有括号的最佳组合组合在一起 - 我的意思是所有括号将在竞争者之间具有最佳连接,但只要我考虑它,我不确定它是否可能。
【解决方案2】:

好的,经过一番研究,我得到了答案。
答案是没有答案,它是P versus NP problem。 计算机科学中未解决的问题之一。 找到最佳匹配等于在国际象棋游戏中找到最完美的绝对正确的移动 - 这是不可能的。

来自维基百科:

上面使用的非正式术语“快速”表示存在 算法求解在多项式时间内运行的任务,使得 完成任务的时间随着大小的多项式函数而变化 算法的输入(与指数时间相反)。 一些算法可以提供的一般问题类别 多项式时间内的答案称为“P 类”或简称为“P”。对于一些 问题,没有已知的方法可以快速找到答案,但如果 提供了显示答案的信息,它是 可以快速验证答案。问题类别 可以在多项式时间内验证答案的称为 NP, 代表“非确定性多项式时间”。

这是一个关于这个主题的精彩视频: P vs. NP and the Computational Complexity Zoo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多