Fahrad-Polo-Shuffle

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

  • Ein team besteht aus 3 Leuten
  • Es spielen 2 teams auf einen Feld
  • Keine/r soll laenger warten muessen als die anderen (das is der haupt grund)
  • Es giebt n durchlaeufe

Was noch toll währe

  • es giebt n court's
  • Jede/r sollte mal mit und auch mal gegen jede/n andren spielen

Implementierungen

pweza

code

#! /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

Skruppy

Mathe

Die Anzahl der Kombinationen berechnet sich wie follgt.

  • n Leute stehen zur auswahl
  • k_1 Leute in Team 1
  • k_2 Leute in Team 2
Wenn k_1 == k_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]!} \]

Wenn 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]!} \]

Code

#!/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])
projects/fahrad-polo-shuffle.txt · Zuletzt geändert: 2012/02/19 03:01 von skruppy