Zufallsgenerator für eine faire Team zusammensetzung bein Fahrad-Polo
Wisser: Pweza, Skruppy
Mitwisser:
Status: working, finished
Tags: software, python
Also nach dem das immer total nervig is, dass beim Polo immer alle rumheulen, dass sie sich benachteiligt fuehlen, will ich das mal mit nem Shuffle APP loesen. ich wollt das ganze erstmal in Python schreiben, das isch darueber python lernen laesst und ich Apple doff find (lizenzen und so) das uebertragen in ne App for kann fisch ja immer noch tun wen das programm mal funtzt und fuers iPhone giebts eh nen python App
Also zur Programm anforderung:
Klar wie ja schon gesagt faires Shuffle :)
die situtuation is folgende:
es kommen uebern tag verteilt immer wieder spieler dazu, dafuer gehen andere auch wieder frueher.
Primaer
Was noch toll währe
#! /usr/bin/env python import random # kommt noch nen input hin welches file f = open('shuffle.txt', 'r+') playerlist = [] playerstack = [] team1 = [] team2 = [] cond = 0 # List die Spielerliste aus der Datei aus und schreibt diese in den STACK playerlist for line in f: ram = line.strip() playerlist.append(ram) f.close() # Schreibt playerlist in zufaelliger folge in den STACK playerstack for player in playerlist: rand = random.randint(0, len(playerlist)-1) playerstack.append(playerlist.pop(rand)) # weis net ob das mit STACK's ueberhaupt geht aber ich haette es gerne, das an dieser stelle jedem player eine varieabel mit der anzal an spielen hinzugefuegt wird, die dann im naechsten Shuffle mit beruecksichtigt wird # Stellt team1 aus dem STACK zusammen und loescht diese aus selbigen if len(playerstack) >= 3: team1.append(playerstack.pop(0)) team1.append(playerstack.pop(1)) team1.append(playerstack.pop(2)) print 'Team1:{}'.format(team1) # die verbleibenden player werden in die Team varieable uebernommen um nach nach einen neuen Shuffle mit weitern ergaenst zu werden else: while len(playerstack) > 0: team1.append(playerstack.pop()) # Stellt team2 aus dem STACK zusammen und loescht diese aus selbigen if len(playerstack) >= 3: team2.append(playerstack.pop(0)) team2.append(playerstack.pop(1)) team2.append(playerstack.pop(2)) print 'Team2:{}'.format(team2) # die verbleibenden player werden in die Team varieable uebernommen um nach nach einen neuen Shuffle mit weitern ergaenst zu werden else: while len(playerstack) > 0: team2.append(playerstack.pop()) #print player[rand] #print x #print playerstack
Die Anzahl der Kombinationen berechnet sich wie follgt.
n
Leute stehen zur auswahlk_1
Leute in Team 1k_2
Leute in Team 2\[ {n \choose k_1} \cdot {n - k_1 \choose k_2} = \frac{n!}{2 \cdot k_1! \cdot k_2! \cdot [n - k_1 - k_2]!} \]
\[{n \choose k_1} \cdot {n - k_1 \choose k_2} \cdot \frac{1}{2} = \frac{n!}{2 \cdot k_1! \cdot k_2! \cdot [n - k_1 - k_2]!} \]
#!/usr/bin/python import copy import random def evSum(combination): i = 0 for a in combination: for b in a: i += b return i def evQuad(combination): i = 0 for a in combination: for b in a: i += 2**b return i available = range(1, 18) ratingFunctions = [evSum, evQuad] bestCombinations = [] bestRating = -10000 def combine(combination, available, start, position, team): global bestCombinations, bestRating if team == -1: ratingPoints = 0 for ratingFunction in ratingFunctions: ratingPoints += ratingFunction(combination) a = copy.deepcopy(combination) if ratingPoints > bestRating: bestCombinations = [a] bestRating = ratingPoints elif ratingPoints == bestRating: bestCombinations.append(a) elif position == -1: a = copy.copy(available) for el in combination[team]: a.remove(el) combine(combination, a, \ start=len(a) - 1, position=len(combination[team]) - 1, team=team - 1) else: for i in range(start, position - 1, -1): combination[team][position] = available[i] combine(combination, available, \ start=i - 1, position=position - 1, team=team) combine([[0,0,0], [0,0,0]], available, \ start=len(available) - 1, position=2, team=1) #for combination in bestCombinations: # print(combination) combCnt = len(bestCombinations) winner = random.randint(0, combCnt - 1) print("The winner from %i best combinations is:" % combCnt) print(bestCombinations[winner])