参加者が毎年の配置を予測できないように、ペアリングに「ランダムな」ソリューションを提案します(イベントが毎年行われると仮定します)。
私の解決策は、すべての組み合わせを組み合わせることから始まります。ランダマイザー機能は、2つのランダムなペアを交換します。
「連続カウント」機能は、競技者が連続して戻るペアリングの数をカウントします。これは、ペアリングの配列を判断するためのメトリック...または基準...です。
メインループは多数のランダマイザーループを実行し、連続したコンテストが最も少ない構成を記憶しています。ループの数を変えることができます。
他の関数を追加して、特定のペアリングのセットに関するメトリックを収集し、それらのメトリックに基づいて保持/拒否することもできます。
したがって、この解決策は次のとおりです。(1)ランダムなペアリングを生成し、(2)1つ以上の基準に基づいてペアリングの配列を保持/拒否し、(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);
}
}