我为你的配对提出了一个“随机”的解决方案,这样参赛者就无法预测他们每年的位置(假设活动是一年一度的)。
我的解决方案首先是对所有配对进行组合。randomizer 函数交换两个随机配对。
“count-back-to-backs”功能计算参赛者背靠背配对的次数。这是您判断配对数组的指标……或标准……。
主循环运行大量随机化循环并记住背靠背比赛最少的配置。您可以改变循环的数量。
您还可以添加其他函数来收集有关一组特定配对的指标,并根据这些指标保留/拒绝。
因此,该解决方案是:(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);
}
}