我为这个长期问题提前道歉,我试图尽可能多地总结它。
我正在开发一个武术联盟的应用程序。
该应用程序的第一个模块需要开发一个复杂的算法来安排锦标赛,即安排n
参与者进入大小的括号x
的{(1)每个括号中的4个参与者。
括号必须以最佳方式排列,以应对多种情况。
每个参与者都有几个参数:
条件:
每个"最佳"括号有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# 非常感谢你的时间和考虑。
答案 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