找到多组对象的最佳匹配的算法

时间:2017-01-22 23:35:57

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

我为这个长期问题提前道歉,我试图尽可能多地总结它。

我正在开发一个武术联盟的应用程序。
该应用程序的第一个模块需要开发一个复杂的算法来安排锦标赛,即安排n参与者进入大小的括号x的{​​(1)每个括号中的4个参与者。
括号必须以最佳方式排列,以应对多种情况。

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

  • 腰带(可以翻译成武术的程度) 数)
  • 重量类别(例如60-70千克,80-90千克......)
  • 年龄类别(例如16-18,18-25,26-36 ......)
  • 学院名称(该参数的目标是使其最大化 括号内的差异)
  • 允许参加具有一个等级的其他参与者 他身上的腰带(真,假)
  • 被允许参加一个体重的参加者 他以上的类别(真,假)
  • 允许参加一个年龄段的参加者 他以上的类别(真,假)

条件:

每个"最佳"括号有x个参与者,他们共享相同的腰带,体重类别,年龄类别,所有这些参与者必须具有学院名称参数的最大差异。

如果有参与者不符合上述条件并且他们没有支架或者他们只能适合x-y大小的括号,那么算法必须做到最好(&# 34;最好"将在后面描述)决定并替换参与者内部的完美"括号根据最后3个布尔参数 在所有替换之后,学院名称之间必须存在差异。

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

我的一般观点如何解决它:

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

例如"完美" 4个参与者的括号将被排名为Z,缺少学院名称差异的权重将被排名为(请参阅黄色标记的段落以获得更多解释)
–(17X<Z)所以如果2个参与者分享相同的学院名称,成绩为Z-(17X<Z),如果3名参与者共享相同的学院名称Z-2(17X<Z),等等......

如果支架在腰带,重量类别或年龄类别之间缺乏匹配,则等级将会减少另一个–(17X<Z)

重要的规则是一个房子里面有最多&#34;坏&#34;完全没有支架的等级

  

(它的17倍是因为括号中的学院条件的最大差异   4是4X,年龄类别的最大差异是另外4X和   剩下的&#34;糟糕的连接&#34;参与者之间是16,我加1   为了产生大于0或小于Z的等级。

这很容易,但我得出结论,如果我想要&#34; Best&#34;或者最佳等级I需要递归地重复一次巨大且不可能的次数,以便达到所有括号的更高的一般等级,并最终达到最佳的一般等级。

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

2 个答案:

答案 0 :(得分:1)

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

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都在括号中。

答案 1 :(得分:0)

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

来自维基百科的

  

上面使用的非正式术语意味着存在一个   算法解决在多项式时间内运行的任务,这样就可以了   完成任务的时间因大小的多项式函数而异   算法的输入(与指数时间相反)。   一些算法可以提供的一般问题类   多项式时间的答案称为“P类”或“P”。对于一些   问题,没有已知的方法可以快速找到答案,但如果有的话   提供了显示答案是什么的信息   可以快速验证答案。一类问题   哪个答案可以在多项式时间内得到验证,称为NP,其中   代表“非确定多项式时间。”

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