我正在尝试制作一个排序程序来对锦标赛进行排序。
通过输入参赛者的名字,我希望这些名称以特定方式排序。标准是没有人可以在彼此之后进行比赛,但是每个人都必须面对面。
示例:
1 - 2
1 - 3
1 - 4
1 - 5
2 - 3
2 - 4
2 - 5
3 - 4
3 - 5
4 - 5
这些都是所有比赛,必须以这样的方式排序/组织,以使得尽可能接近不能相互匹配。
我知道的数学事实,因此无法解决所有人不会在彼此之后进行两场比赛。但我希望“排序”尽可能接近。
从某种意义上来说它必须有点“聪明”才能发挥最大作用。 排序必须是动态的,所以如果我输入7名参赛者,最多30名参赛者,排序将尽力而为。
现在我让参赛者以正确的顺序在一个arraylist中说1-17,或者我在arylylist中的所有排列中使用它们:1,2,1,3,1,4,2,3 ,2,4,3,4。
我尝试过比较数字,以不同方式迭代,但我死在水中。我正在寻求帮助,或者有人能指出我正确的方向,所以我可以转向
这样:
1 - 2
1 - 3
1 - 4
1 - 5
2 - 3
2 - 4
2 - 5
3 - 4
3 - 5
4 - 5
到此:
5-4
1-2
3-4
1-5
2-3
1-4
2-5
3-1
5-4
3-5 <--here number 5 has to go 2 matches in a row
答案 0 :(得分:2)
“我知道一个数学上的事实是不可能解决所以每个人都不会在彼此之后进行两场比赛。”
这是一个没有选手背靠背有两场比赛的情况: [3 - 5,2 - 4,1 - 5,2 - 3,1 - 4,2 - 5,3 - 4,1 - 2,4 - 5,1 - 3]
答案 1 :(得分:1)
我建议你的配对“随机”解决方案,以便参赛者无法预测他们每年的位置(假设活动是年度)。
我的解决方案首先制作所有配对的组合。随机函数函数交换两个随机配对。
“倒计时”功能可计算参赛者背靠背的配对次数。这是一个度量标准...或标准......您可以通过它来判断配对数组。
主循环运行大量随机数发生器循环,并记住最少背对背竞赛的配置。您可以改变循环次数。
您还可以添加其他功能来收集有关特定配对集的指标,并根据这些指标保留/拒绝。
因此,该解决方案是:(1)生成随机配对,以及(2)基于一个或多个标准保持/拒绝配对数组,以及(3)让计算机生成大量这些随机集合供您判断。
输出是配对数组,最后有背靠背的数量,如
[3 - 5,2 - 4,1 - 5,2 - 3,1 - 4,2 - 5,3 - 4,1 - 2,4 - 5,1 - 3] 0
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Contest {
static Random rand = new Random();
static class Pairing {
int contestantA;
int contestantB;
public Pairing(int a, int b) {
contestantA = a;
contestantB = b;
}
public String toString() {
return ""+contestantA+" - "+contestantB;
}
}
static int countBackToBacks(List<Pairing> pairs) {
int backs = 0;
for(int x=0;x<pairs.size()-1;++x) {
Pairing a = pairs.get(x);
Pairing b = pairs.get(x+1);
if(a.contestantA==b.contestantA || a.contestantA==b.contestantB ||
a.contestantB==b.contestantA || a.contestantB==b.contestantB)
{
++backs;
}
}
return backs;
}
static void randomize(List<Pairing> pairs) {
int a = rand.nextInt(pairs.size());
int b = rand.nextInt(pairs.size());
Pairing pa = pairs.get(a);
Pairing pb = pairs.get(b);
pairs.set(a, pb);
pairs.set(b, pa);
}
public static void main(String [] args) {
List<Pairing> pairs = new ArrayList<Pairing>();
int numEntries = 5;//Integer.parseInt(args[0]);
for(int x=0;x<numEntries-1;++x) {
for(int y=x+1;y<numEntries;++y) {
Pairing p = new Pairing(x+1,y+1);
pairs.add(p);
}
}
int bestVal = Integer.MAX_VALUE;
String best = "";
for(int x=0;x<1000000;++x) {
randomize(pairs);
int backs = countBackToBacks(pairs);
if(backs<bestVal) {
bestVal = backs;
best = pairs.toString();
}
}
System.out.println(best + bestVal);
}
}