On Sun, May 3, 2009 at 7:36 PM, Ross <ross.j...@gmail.com> wrote:
> For the past couple weeks, I've been working on an algorithm to
> schedule tennis leagues given court constraints and league
> considerations (i.e. whether it's a singles or a doubles league). Here
> were my requirements when I was designing this algorithm:
>
> -Each player plays against a unique opponent each week.
> -Similarly, in a doubles league, each player plays with a unique
> partner each week.
> -Each player gets a fair number of bye weeks (i.e. the player with the
> most bye weeks will have no more than one bye week than the player
> with the least number of bye weeks)
>
> I'm very close to arriving at my desired solution, but I have one
> glaring flaw. When I have an even number of players sign up for my
> league and there are court constraints, my current algorithm gives the
> first player in my league a bye week every single week. I'll post my
> code below and see how you guys think I should add to/ amend my code.
>
> def round_robin(players, rounds):
>    if len(players)%2:
>        players.insert(0, None)
>    mid = len(players)//2
>    for i in range(rounds):
>        yield zip(players[:mid], players[mid:])
>        players = players[0:1] + players[mid:mid+1] + players[1:mid-1] +
> players[mid+1:] + players[mid-1:mid]
>
>
> def test_round_robin(players, rounds, courts, doubles = False):
>    players = range(players)
>    for week in round_robin(players,rounds,courts):
>            if doubles == True:
>                    doubles_week = len(week)/2.0
>                    byes = doubles_week - courts
>                    if byes == 0:
>                            bye_list = []
>                    else:
>                            bye_list = 
> week[::int(round(1.072*(courts/byes)+1.08))]
>                    playing = [u for u in week if u not in bye_list]
>                    midd = len(playing)//2
>                    doub_sched = zip(playing[:midd], playing[midd:])
>                    print doub_sched, bye_list
>            else:
>                    byes = len(week)- courts
>                    if byes == 0:
>                            bye_list = []
>                    else:
>                            bye_list = 
> week[::int(round(1.072*(courts/byes)+1.08))]
>                    playing = [u for u in week if u not in bye_list]
>                    print playing, bye_list

Probably not the cause of the problem, but where did the magic numbers
1.072 and 1.08 come from?

Cheers,
Chris
-- 
http://blog.rebertia.com
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to