From 7e58dc70d5a30e85e02a6668fb09277fdfd264a5 Mon Sep 17 00:00:00 2001 From: Quercitron Date: Fri, 20 Nov 2015 02:54:50 +0300 Subject: [PATCH] Update Swiss tournament pairing - For the last round, for each unpaired player pair against the highest ranked player they haven't played against --- ...SwissPairingMinimalWeightMatchingTest.java | 13 +++-- .../mage/game/tournament/TournamentSwiss.java | 5 +- .../SwissPairingMinimalWeightMatching.java | 55 ++++++++++++------- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/tournament/SwissPairingMinimalWeightMatchingTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/tournament/SwissPairingMinimalWeightMatchingTest.java index 068639b97be..c132059c797 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/tournament/SwissPairingMinimalWeightMatchingTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/tournament/SwissPairingMinimalWeightMatchingTest.java @@ -74,7 +74,7 @@ public class SwissPairingMinimalWeightMatchingTest { round.addPairing(pair2); rounds.add(round); - SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds); + SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds, false); RoundPairings roundPairings = swissPairing.getRoundPairings(); Assert.assertEquals(2, roundPairings.getPairings().size()); @@ -124,7 +124,7 @@ public class SwissPairingMinimalWeightMatchingTest { round.addPairing(pair2); rounds.add(round); - SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds); + SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds, true); RoundPairings roundPairings = swissPairing.getRoundPairings(); Assert.assertEquals(2, roundPairings.getPairings().size()); @@ -164,7 +164,7 @@ public class SwissPairingMinimalWeightMatchingTest { round.addPairing(pair2); rounds.add(round); - SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds); + SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds, false); RoundPairings roundPairings = swissPairing.getRoundPairings(); Assert.assertEquals(1, roundPairings.getPairings().size()); @@ -220,7 +220,7 @@ public class SwissPairingMinimalWeightMatchingTest { round.getPlayerByes().add(player4); rounds.add(round); - SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds); + SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds, false); RoundPairings roundPairings = swissPairing.getRoundPairings(); Assert.assertEquals(2, roundPairings.getPairings().size()); @@ -267,7 +267,7 @@ public class SwissPairingMinimalWeightMatchingTest { round.getPlayerByes().add(player5); rounds.add(round); - SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds); + SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(players, rounds, false); RoundPairings roundPairings = swissPairing.getRoundPairings(); Assert.assertEquals(2, roundPairings.getPairings().size()); @@ -302,7 +302,8 @@ public class SwissPairingMinimalWeightMatchingTest { List rounds = new ArrayList<>(); for (int i = 0; i < roundsCount; i++) { - SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(new ArrayList<>(players), rounds); + SwissPairingMinimalWeightMatching swissPairing = + new SwissPairingMinimalWeightMatching(new ArrayList<>(players), rounds, i + 1 == roundsCount); RoundPairings roundPairings = swissPairing.getRoundPairings(); Assert.assertEquals(playersCount / 2, roundPairings.getPairings().size()); diff --git a/Mage/src/mage/game/tournament/TournamentSwiss.java b/Mage/src/mage/game/tournament/TournamentSwiss.java index 91622534ad8..e755d47a6f0 100644 --- a/Mage/src/mage/game/tournament/TournamentSwiss.java +++ b/Mage/src/mage/game/tournament/TournamentSwiss.java @@ -68,10 +68,11 @@ public abstract class TournamentSwiss extends TournamentImpl { protected Round createRoundSwiss() { List roundPlayers = getActivePlayers(); + boolean isLastRound = (rounds.size() + 1 == getNumberRounds()); RoundPairings roundPairings; if (roundPlayers.size() <= 16) { - SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(roundPlayers, rounds); + SwissPairingMinimalWeightMatching swissPairing = new SwissPairingMinimalWeightMatching(roundPlayers, rounds, isLastRound); roundPairings = swissPairing.getRoundPairings(); } else { SwissPairingSimple swissPairing = new SwissPairingSimple(roundPlayers, rounds); @@ -86,7 +87,7 @@ public abstract class TournamentSwiss extends TournamentImpl { for (TournamentPlayer playerBye : roundPairings.getPlayerByes()) { // player free round - add to bye players of this round round.getPlayerByes().add(playerBye); - if (round.getRoundNumber() == getNumberRounds()) { + if (isLastRound) { playerBye.setState(TournamentPlayerState.FINISHED); } else { playerBye.setState(TournamentPlayerState.WAITING); diff --git a/Mage/src/mage/game/tournament/pairing/SwissPairingMinimalWeightMatching.java b/Mage/src/mage/game/tournament/pairing/SwissPairingMinimalWeightMatching.java index 880694e04be..22040ac3a17 100644 --- a/Mage/src/mage/game/tournament/pairing/SwissPairingMinimalWeightMatching.java +++ b/Mage/src/mage/game/tournament/pairing/SwissPairingMinimalWeightMatching.java @@ -57,7 +57,7 @@ public class SwissPairingMinimalWeightMatching { // weight of pairings private final int[][] w; - public SwissPairingMinimalWeightMatching(List players, List rounds) { + public SwissPairingMinimalWeightMatching(List players, List rounds, boolean isLastRound) { playersCount = players.size(); swissPlayers = new ArrayList(); @@ -147,29 +147,42 @@ public class SwissPairingMinimalWeightMatching { // calculate weight // try to pair players with equal scores w = new int[n][n]; - for (int i = 0; i < playersCount; i++) { - PlayerInfo player = swissPlayers.get(i); - for (int p = player.points; p >= 0 ; p--) { - int first = -1; - int last = -1; - for (int j = 0; j < playersCount; j++) { - if (swissPlayers.get(j).points == p) { - if (first < 0) { - first = j; - } - last = j; - } - } - if (first < 0) { - continue; - } - int self = (p == player.points ? i : first - 1); - int diff = 10 * (player.points - p); - for (int j = Math.max(first, i); j <= last; j++) { - w[i][j] = Math.abs(j - (last + first - self)) + diff; + int pointsDiffMultiplier = 10; + if (isLastRound) { + // for the last round, for each unpaired player starting with the first place, pair + // against the highest ranked player they haven't played against + for (int i = 0; i < playersCount; i++) { + for (int j = 0; j < i; j++) { + w[i][j] = Math.abs(i - j) + + pointsDiffMultiplier * Math.abs(swissPlayers.get(i).points - swissPlayers.get(j).points); w[j][i] = w[i][j]; } } + } else { + for (int i = 0; i < playersCount; i++) { + PlayerInfo player = swissPlayers.get(i); + for (int p = player.points; p >= 0; p--) { + int first = -1; + int last = -1; + for (int j = 0; j < playersCount; j++) { + if (swissPlayers.get(j).points == p) { + if (first < 0) { + first = j; + } + last = j; + } + } + if (first < 0) { + continue; + } + int self = (p == player.points ? i : first - 1); + int diff = pointsDiffMultiplier * (player.points - p); + for (int j = Math.max(first, i); j <= last; j++) { + w[i][j] = Math.abs(j - (last + first - self)) + diff; + w[j][i] = w[i][j]; + } + } + } } // avoid pairing players that have played each other already