Files
open-web-leaderboard/balance.py
Yannik Schmidt 12c001ac71 lol
2021-12-20 15:15:35 +01:00

37 lines
1.3 KiB
Python

def swap(teams, teamIndex, pos1, pos2):
tmp = teams[teamIndex][pos1]
teams[teamIndex][pos1] = teams[teamIndex][pos2]
teams[teamIndex][pos2] = tmp
def ratingDiff(team1, team2):
'''Positive if first > seconds, negative if second > first, 0 if equal'''
return sum([p.rating for p in team1]) - sum([p.rating for p in team2])
def balance(players):
# initial teams #
playersByRating = sorted(players, key=lambda p: p.rating)
teams = dict( { 0 : [] }, { 1 : [] } )
for i in range(0, len(playersByRating)):
teams[i%2] = playersByRating[i]
# optimize positions worst case ~8n^2 * 2log(n) #
for teamIndex in teamIndex.keys():
changed = True
while changed:
changed = False
for curIndex in range(0, len(teams[teamIndex]))
for compareIndex in range(curIndex, len(teams[teamIndex]))
if curIndex == compareIndex:
continue
elif swapBasedOnPos(curIndex, teams[teamIndex])
changed = True
swap(teams, teamIndex, curIndex, compareIndex)
# optimize ratings simple #
changedRating = True
while changedRating:
for curIndex in range(0, len(teams[0])):
if rating diff