Handle additionnal seeding criterium

This commit is contained in:
Claude Brisson
2024-02-15 13:47:38 +01:00
parent be40411237
commit 9ff354873d
4 changed files with 23 additions and 15 deletions

View File

@@ -16,7 +16,7 @@ sealed class Pairable(val id: ID, val name: String, open val rating: Int, open v
abstract fun toMutableJson(): Json.MutableObject abstract fun toMutableJson(): Json.MutableObject
abstract val club: String? abstract val club: String?
abstract val country: String? abstract val country: String?
open fun nameSeed(separator: String =" "): String { open fun fullName(separator: String = " "): String {
return name return name
} }
val skip = mutableSetOf<Int>() // skipped rounds val skip = mutableSetOf<Int>() // skipped rounds
@@ -95,7 +95,7 @@ class Player(
} }
override fun toJson(): Json.Object = toMutableJson() override fun toJson(): Json.Object = toMutableJson()
override fun nameSeed(separator: String): String { override fun fullName(separator: String): String {
return name + separator + firstname return name + separator + firstname
} }
} }

View File

@@ -4,6 +4,7 @@ import org.jeudego.pairgoth.model.*
import java.util.* import java.util.*
abstract class BasePairingHelper( abstract class BasePairingHelper(
val round: Int,
history: List<List<Game>>, // History of all games played for each round history: List<List<Game>>, // History of all games played for each round
var pairables: List<Pairable>, // All pairables for this round, it may include the bye player var pairables: List<Pairable>, // All pairables for this round, it may include the bye player
val pairing: PairingParams, val pairing: PairingParams,
@@ -125,15 +126,22 @@ abstract class BasePairingHelper(
val criterionP = p.eval(criterion) val criterionP = p.eval(criterion)
val criterionQ = q.eval(criterion) val criterionQ = q.eval(criterion)
if (criterionP != criterionQ) { if (criterionP != criterionQ) {
return (criterionQ * 1e6 - criterionP * 1e6).toInt() return -criterionP.compareTo(criterionQ)
} }
} }
if (p.rating == q.rating) { val additionalCriterion =
return if (p.name > q.name) 1 else -1 if (round <= pairing.main.lastRoundForSeedSystem1) pairing.main.additionalPlacementCritSystem1
else pairing.main.additionalPlacementCritSystem2
if (additionalCriterion != Criterion.NONE) {
val criterionP = p.eval(additionalCriterion)
val criterionQ = q.eval(additionalCriterion)
if (criterionP != criterionQ) {
return -criterionP.compareTo(criterionQ)
}
} }
return q.rating - p.rating return p.fullName().compareTo(q.fullName())
} }
open fun nameSort(p: Pairable, q: Pairable): Int { open fun nameSort(p: Pairable, q: Pairable): Int {
return if (p.name > q.name) 1 else -1 return p.fullName().compareTo(q.fullName())
} }
} }

View File

@@ -4,8 +4,8 @@ import org.jeudego.pairgoth.model.Pairable
fun detRandom(max: Double, p1: Pairable, p2: Pairable): Double { fun detRandom(max: Double, p1: Pairable, p2: Pairable): Double {
var inverse = false var inverse = false
var name1 = p1.nameSeed("") var name1 = p1.fullName("")
var name2 = p2.nameSeed("") var name2 = p2.fullName("")
if (name1 > name2) { if (name1 > name2) {
name1 = name2.also { name2 = name1 } name1 = name2.also { name2 = name1 }
inverse = true inverse = true

View File

@@ -22,13 +22,13 @@ import kotlin.math.min
import kotlin.math.roundToInt import kotlin.math.roundToInt
sealed class BaseSolver( sealed class BaseSolver(
val round: Int, // Round number round: Int,
history: List<List<Game>>, // History of all games played for each round history: List<List<Game>>, // History of all games played for each round
pairables: List<Pairable>, // All pairables for this round, it may include the bye player pairables: List<Pairable>, // All pairables for this round, it may include the bye player
pairing: PairingParams, pairing: PairingParams,
placement: PlacementParams, placement: PlacementParams,
val usedTables: BitSet val usedTables: BitSet
) : BasePairingHelper(history, pairables, pairing, placement) { ) : BasePairingHelper(round, history, pairables, pairing, placement) {
companion object { companion object {
val rand = Random(/* seed from properties - TODO */) val rand = Random(/* seed from properties - TODO */)
@@ -77,7 +77,7 @@ sealed class BaseSolver(
} }
// println("choose Bye: " + p.nameSeed() + " mms2 " +2*p.main+" "+ weightForBye) // println("choose Bye: " + p.nameSeed() + " mms2 " +2*p.main+" "+ weightForBye)
} }
println("Bye player : " + chosenByePlayer.nameSeed()) println("Bye player : " + chosenByePlayer.fullName())
byePlayers.add(chosenByePlayer) byePlayers.add(chosenByePlayer)
nameSortedPairables.remove(chosenByePlayer) nameSortedPairables.remove(chosenByePlayer)
// Keep chosenByePlayer in pairingSortedPairables to be identical to opengotha // Keep chosenByePlayer in pairingSortedPairables to be identical to opengotha
@@ -91,8 +91,8 @@ sealed class BaseSolver(
weight(p, q).let { if (it != Double.NaN) builder.addEdge(p, q, it/1e6) } weight(p, q).let { if (it != Double.NaN) builder.addEdge(p, q, it/1e6) }
weight(q, p).let { if (it != Double.NaN) builder.addEdge(q, p, it/1e6) } weight(q, p).let { if (it != Double.NaN) builder.addEdge(q, p, it/1e6) }
weightsLogger?.apply { weightsLogger?.apply {
this.println("Player1Name=${p.nameSeed()}") this.println("Player1Name=${p.fullName()}")
this.println("Player2Name=${q.nameSeed()}") this.println("Player2Name=${q.fullName()}")
this.println("baseDuplicateGameCost=${dec.format(pairing.base.avoidDuplicatingGames(p, q))}") this.println("baseDuplicateGameCost=${dec.format(pairing.base.avoidDuplicatingGames(p, q))}")
this.println("baseRandomCost=${dec.format(pairing.base.applyRandom(p, q))}") this.println("baseRandomCost=${dec.format(pairing.base.applyRandom(p, q))}")
this.println("baseBWBalanceCost=${dec.format(pairing.base.applyColorBalance(p, q))}") this.println("baseBWBalanceCost=${dec.format(pairing.base.applyColorBalance(p, q))}")
@@ -384,7 +384,7 @@ sealed class BaseSolver(
if ((2 * cla1 < groupSize && 2 * cla2 >= groupSize) || (2 * cla1 >= groupSize && 2 * cla2 < groupSize)) { if ((2 * cla1 < groupSize && 2 * cla2 >= groupSize) || (2 * cla1 >= groupSize && 2 * cla2 < groupSize)) {
val randRange = maxSeedingWeight * 0.2 val randRange = maxSeedingWeight * 0.2
val rand: Double val rand: Double
if (p1.nameSeed() > p2.nameSeed()) {rand = detRandom(randRange, p2, p1)} if (p1.fullName() > p2.fullName()) {rand = detRandom(randRange, p2, p1)}
else {rand = detRandom(randRange, p1, p2)} else {rand = detRandom(randRange, p1, p2)}
maxSeedingWeight - rand maxSeedingWeight - rand
} else { } else {