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

Algorithm to find the most optimal match of multiple groups of objects

本文关键字:最佳 算法 对象      更新时间:2023-10-16

我提前为这个长问题道歉,我尽可能多地总结了一下。

我正在开发一个武术联盟的申请
应用程序的第一个模块需要开发一个复杂的算法来安排比赛,即将n参与者安排在x大小的括号中(例如,每个括号中有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或小于CCD_ 10的等级)。

这是容易的部分,但我得出的结论是,如果我想要"最佳"或最佳成绩,我需要递归地重复大量不可能的次数,以便达到所有括号中更大的一般成绩,并最终达到最佳一般成绩

我一点也不确定,也许需要一种不同的思考方式
这并不重要,但对于一般知识来说,开发语言是C#
非常感谢您的时间和考虑。

简单而不完美的方法:尝试为每个人分配一个值,以表示他们在查找匹配项时有多麻烦。最麻烦的是无法匹配的最低体重、腰带和年龄,这意味着他们必须与腰带/年龄/体重完全相同的人匹配。将每个值标准化为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

接下来定义一个函数来确定两名球员之间的差异,这不会是上面的简单减法——你不希望有人拥有10岁的四级腰带和28岁的一级腰带。你的差异函数应该是这样的:

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-1Person实例,这就是您的第一个括号。重复此步骤,直到所有Person都在括号中。

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

来自维基百科:

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

这里有一个关于这个主题的精彩视频:P与NP与计算复杂性Zoo