17. september 2008 - 15:45Der er
6 kommentarer og 3 løsninger
Matematisk hjælp til Pubcrawl
Hej Eksperter,
- Jeg har 6 hold der skal på Pubcrawl. - Hvert hold skal besøge 5 værtshuse. - Holdene må ikke være et sted alene (dvs. der skal være 2 hold hver gang et sted besøges) - Holdene skal møde ét hold én gang på turen. (dvs. et hold må ikke drikke med et andet hold 2 steder)
Er det noget I kan få til at gå op - for jeg kan ikke?
Jeg siger det samme som Brianlindhardt. Det er logisk efter min mening. og så fordeler jeg besøgene over tid. 1 hold kan jo ikke være på to eller flere værtshuse på en gang :-)
#!/usr/bin/env python # -*- coding: UTF-8 -*- """ Dette python program laver en pubcrawl tabel efter antal hold antal hold på samme værtshus antal værtshuse """
# variable til optimerings formål Last_range = {}
def combinations( n, p ): """ k (n, p) n antal udfald p størrelse af delmængde n! -------- p!(n-p)! """ last = Last_range.get(( n, p ),False) if last: print "kilroy was here" return last current = range( 1, p + 1 ) max = range( n - p + 1, n + 1 ) resultat = [] while current != max: res = [] for number in current: res.append( number-1 ) resultat.append( res ) index = -1 if current[ index ] != max[ index ]: current[ index ] = current[ index ] + 1 else: for indices in range( -2, -p - 1, -1 ): if current[ indices ] != max[ indices ]: current[ indices ] = current[ indices ] + 1 for other_indices in range( indices + 1, 0 ): current[ other_indices ] = current[ indices ] + other_indices - indices break res = [] for number in max: res.append( number-1 ) resultat.append( res ) Last_range[(n, p)] = resultat return resultat
if __name__ == "__main__":
h = input("antal hold ialt: ") hp = input("antal hold pr pub: ") p = input("antal pub's: ")
teamListe = combinations( h, hp) antal_team = len(teamListe) pub = {} pubs = [ chr(P) for P in range(ord("A"),ord("A")+p) ] hold = {} holdene = [ x for x in range(h)] for x in range(h): hold[x] = { "tider":[], "pubs":[] } tider = [ x for x in range(max(antal_team, h)) ] for tid in tider: for P in pubs: pub[ P,tid]=[] Q = 0 while teamListe != []: for tid in tider: for P in pubs: for team in teamListe[:]:
# check om hold er på pub på dette tidspunkt x =[] for z in team: x.extend( hold[z]["tider"] ) if tid in x: continue
# check om alle hold har være på denne pub x = [] for z in team: x.extend(z for z in hold[z]["pubs"] if P == z) if len(x) > Q: continue
pub[ P, tid ] = team
for x in team: hold[x]["tider"].append(tid) hold[x]["pubs"].append(P)
del teamListe[ teamListe.index(team) ] break Q += 1 print "Pub/tid 18:00 19:00 20:00 21:00 22:00 23:00 00:00 01:00" for P in pubs: print "%(P)6s\t" % vars(), for tid in tider: team = pub[ P, tid ] if team == []: team = "" print "%(team)6s\t" % vars(), print "\n"
Tjah, det var lge det program, jeg ikke gad at lave for at checke det !-)
Problemet er nemlig at det er asymmetrisk, så enten er der for få kombinationer eller for mange til at opfylde betingelserne, og jeg troede (åbenbart fejlagtigt !-) at der var for få ...
-- men der kan så laves flere mulige løsninger !o]
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.