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?
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
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.