-1

オープンソースのチャンピオンシップ ソフトウェア (Java) の問題を解決する必要があります。このソフトウェアは、さまざまな基準 (参加者のランキング、既に行われた試合?、...) を使用して、試合の最適な組み合わせを見つけることができます。

現在、使用されているアルゴリズムは、一致のすべての組み合わせ (冗長な組み合わせを含む) を比較するため、最適ではありません。このアプローチでは、ソフトウェアは「参加者数の階乗」の組み合わせを比較します。冗長性なしで一致のすべての組み合わせを生成するアルゴリズムを探しています。

4人の参加者の例を含む現在のコード:

// Example with 4 participants
public static void main (String[] args) {
   String[] participants = {"A","B","C","D"};
   double factorial = factorial(participants.length);
   for(double i=0;i<factorial;i++) {
      String[] combination = permutation(i,participants);
      System.out.println("Combination "+(int)i+" : "+combination[0]+" vs "+combination[1]+", "+combination[2]+" vs "+combination[3]);
   }
}

// Current code
public static <K> K[] permutation (double k, K[] objects) {
   K[] permutation = objects.clone();
   for (int i = 2; i < permutation.length + 1; i++) {
      k = k / (i - 1);
      swap(permutation, (int)(k % i), i - 1);
   }
   return permutation;
}
public static <K> void swap (K[] objects, int indexA, int indexB) {
   K temp = objects[indexA];
   objects[indexA] = objects[indexB];
   objects[indexB] = temp;
}
public static double factorial (int value) {
   double result = value;
   while (value != 2) {
      result *= --value;
   }
   return result;
}

出力:

Combination 0 : D vs A, B vs C
Combination 1 : D vs B, A vs C
Combination 2 : D vs C, A vs B
Combination 3 : D vs C, B vs A
Combination 4 : D vs A, C vs B
Combination 5 : D vs B, C vs A
Combination 6 : C vs D, B vs A
Combination 7 : C vs D, A vs B
Combination 8 : B vs D, A vs C
Combination 9 : A vs D, B vs C
Combination 10 : B vs D, C vs A
Combination 11 : A vs D, C vs B
Combination 12 : C vs A, D vs B
Combination 13 : C vs B, D vs A
Combination 14 : B vs C, D vs A
Combination 15 : A vs C, D vs B
Combination 16 : B vs A, D vs C
Combination 17 : A vs B, D vs C
Combination 18 : C vs A, B vs D
Combination 19 : C vs B, A vs D
Combination 20 : B vs C, A vs D
Combination 21 : A vs C, B vs D
Combination 22 : B vs A, C vs D
Combination 23 : A vs B, C vs D 

ご覧のとおり、多くの冗長性があります (「A vs B、C vs D」は、「B vs A、C vs D」および「B vs A、D vs C」などと同じです)。参加者が 10 人以上 (10! = 3.628.800...) の場合、各組み合わせの比較 (最良のものを見つける目的で) の損失時間はかなりのものになります。

希望する出力の例 (順序は関係ありません) :

Combination 0 : A vs B, C vs D
Combination 1 : A vs C, B vs D
Combination 2 : A vs D, B vs C

あなたの助けは大歓迎です。

4

1 に答える 1