Code works fine except...
MRAB
google at mrabarnett.plus.com
Tue May 5 13:33:58 EDT 2009
Ross wrote:
> On May 5, 12:32 am, John Yeung <gallium.arsen... at gmail.com> wrote:
>> On May 5, 1:12 am, John Yeung <gallium.arsen... at gmail.com> wrote:
>>
>>> [...] the problem may require bigger guns (either much better
>>> math or much more sophisticated programming).
>> Yes, I'm responding to myself.
>>
>> Well, I went ahead with the approach I mentioned earlier, generating
>> all possible matches and then selecting among them as needed to fill
>> up the courts, trying to keep the number of matches played by each
>> player as fair as possible. (I should mention that this, or something
>> similar, was suggested earlier by someone else in a different thread,
>> in response to the same question by the same OP.)
>>
>> I did use "bigger guns" (mainly a class for player objects, with
>> custom __cmp__ method), but still didn't do anything with doubles.
>>
>> I haven't tested it much, but I'll post it if anyone's interested.
>> (That way people can pick on me instead of the OP. ;)
>>
>> John
>
> I'm interested to see what you did. From your description, it sounds
> like I've tried what you've done, but when I implemented my version,
> it took minutes to evaluate for bigger numbers. If that isn't the case
> with yours, I'd be interested in seeing your implementation.
>
Here's my approach (incomplete):
def get_pair(player_list, played):
for first in range(len(player_list)):
player_1 = player_list[first]
for second in range(first + 1, len(player_list)):
player_2 = player_list[second]
pair = player_1, player_2
sorted_pair = tuple(sorted(pair))
if sorted_pair not in played:
played.add(sorted_pair)
del player_list[second]
del player_list[first]
return pair
return None
def round_robin(player_list, courts, played):
playing = []
for c in range(courts):
pair = get_pair(player_list, played)
if pair is None:
break
playing.append(pair)
byes = player_list[:]
player_list[:] = byes + [player for pair in playing for player in pair]
yield playing, byes
def test_round_robin(players, rounds, courts, doubles=False):
player_list = range(players)
played = set()
for r in range(rounds):
for playing, byes in round_robin(player_list, courts, played):
print playing, byes
More information about the Python-list
mailing list