Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多组目标的最优匹配算法_Java_C#_C++_Algorithm_Computer Science - Fatal编程技术网

Java 多组目标的最优匹配算法

Java 多组目标的最优匹配算法,java,c#,c++,algorithm,computer-science,Java,C#,C++,Algorithm,Computer Science,对于这个冗长的问题,我提前表示歉意,我尽可能地对其进行了总结 我正在为一个武术联盟开发一个应用程序。该应用程序的第一个模块需要开发一个复杂的算法来安排比赛,即将n参与者安排在x大小的括号中(例如,每个括号中有4名参与者).支架必须在多种条件下以最佳方式布置 每个参与者都有几个参数: 腰带(武术的学位等级,可以翻译成 (数字) 重量类别(例如60-70千克、80-90千克……) 年龄类别(例如16-18、18-25、26-36……) Academy name(该参数的目标是使 括号内的差异) 允

对于这个冗长的问题,我提前表示歉意,我尽可能地对其进行了总结

我正在为一个武术联盟开发一个应用程序。
该应用程序的第一个模块需要开发一个复杂的算法来安排比赛,即将
n
参与者安排在
x
大小的括号中(例如,每个括号中有4名参与者).
支架必须在多种条件下以最佳方式布置

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

  • 腰带(武术的学位等级,可以翻译成 (数字)
  • 重量类别(例如60-70千克、80-90千克……)
  • 年龄类别(例如16-18、18-25、26-36……)
  • Academy name(该参数的目标是使 括号内的差异)
  • 允许与具有一个等级的其他参与者对抗 他上面的皮带(对,错)
  • 允许与一个权重的参与者进行比较 他之上的类别(对,错)
  • 允许对一岁的参与者进行参与 他之上的类别(对,错)
条件:

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

如果有参与者无法适应上述条件,并且他们没有括号,或者他们只能适应
x-y
大小的括号,那么算法必须做出最佳(“最佳”将在后面描述)决策,并在“完美”范围内替换参与者根据最后3个布尔参数用括号括起来。
此外,在所有替换之后,学院名称之间必须发生差异

我的问题是,解决这个问题的最佳方法是什么? 我会很感激一些里程碑或参考一些数学文献来讨论这样的问题(我不希望有人帮我解决它,只是指导)

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

对所有括号进行等级排序,然后与所有括号的一般等级关联


例如,一个由4名参与者组成的“完美”等级将被列为
Z
,缺少学院名称差异的权重将被列为(更多解释请参见黄色标记的段落)
-(17X简单的不完美方法:尝试为每个人分配一个值,以表示他们找到匹配的困难程度。最麻烦的是无法匹配的最低体重、腰带和年龄,这意味着他们必须与完全相同的腰带/年龄/体重的人匹配。将每个值标准化为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岁的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
都在括号内。

好的,经过一些研究,我得到了答案。
答案是没有答案,这就是答案。 计算机科学中尚未解决的问题之一。 在国际象棋比赛中,找到最佳的对局就等于找到最完美的绝对正确的一步——这是不可能的

来自维基百科:

上面使用的非正式术语“快速”表示存在 求解在多项式时间内运行的任务的算法,例如 完成任务的时间随尺寸的多项式函数而变化 算法的输入(与指数时间相反)。 某些算法可以提供答案的一般类问题 多项式时间的答案被称为“P类”或仅仅是“P” 问题,没有已知的方法可以快速找到答案,但如果 提供的信息表明答案是什么 可以快速验证答案。针对 一个答案在多项式时间内可以被验证的称为NP,它 表示“不确定多项式时间”

以下是一段关于此主题的精彩视频:

你几乎肯定把这个问题复杂化了。我建议你可以注入不同的算法,从一个简单的算法开始。有多大的
N
可能?我问,因为一旦你应用了选择限制(与腰带、体重、年龄有关),这个问题可能是暴力造成的。如果是这样,你只需要一个评分函数来为任何给定的括号集分配一个数字。然后只需迭代每个合法的集合并选择最好的一个。@FMc tnx对于你的评论,N平均约为400,我理解你的意思,但任务是找到最佳的一般组合一种简单的方法来评估oach这将是为给定的竞争者找到所有可能的匹配,然后一旦你为每个人都这样做了,对竞争者进行优先级排序,以便那些潜在对手最少的人首先得到匹配。@mVChr但是如果一个竞争者有5个相等的最佳匹配,但我选择的每一个匹配都会对其他人产生不同的影响在其他竞争者之间的比赛中,我如何才能获得所有括号的最佳综合分数?非常感谢你花时间写下这篇文章!我将在算法的第一部分使用这种逻辑。但首要问题是如何将所有括号的最佳组合组合在一起