V souvislosti sports scheduling mám seznam her, kde týmy hrají více než 1x hra, potenciálně. Pokud je to ten případ, jejich hry by měly být back-to-back. Protože to je možná ne feasable vzhledem k povaze párování, alespoň by měly být co nejblíže k sobě.
Toto je příklad počáteční párování, kde každý tým hraje 2x:
[('t05', 't09'), ('t07', 't03'), ('t01', 't09'), ('t03', 't01'), ('t07', 't05'), ('t02', 't06'), ('t04', 't06'), ('t10', 't08'), ('t10', 't04'), ('t08', 't02')]
Všimněte si, že to není double round-robin konfiguraci, kde každý tým hraje každý druhý dvakrát v domov a pryč hry. To je prostě konfigurace, kde týmy hrají dvě hry.
Snažím se implementovat algoritmus na tyhle hry, aby každý tým hry je co nejblíže k sobě. To je první, jednoduchý přístup:
matches = list(matches)
c = collections.Counter([t for m in matches for t in m.teams])
for t, n in c.iteritems():
if n > 1:
# matches containing the team t
indices = [i for i, m in enumerate(matches) if t in m.teams]
for i in indices:
# bring these matches to the front
matches.insert(0, matches.pop(i))
return matches
Tohle je výsledek:
[('t10', 't04'), ('t10', 't08'), ('t01', 't09'), ('t05', 't09'), ('t08', 't02'), ('t07', 't03'), ('t07', 't05'), ('t02', 't06'), ('t04', 't06'), ('t03', 't01')]
Samozřejmě, že to není moc dobrý, jak je to jednostranné a je přínosem více týmů na konci seznamu tím, že umístí své hry, v přední části seznamu. S one-sided myslím, že to vypadá na jen jeden tým v každé hře a funguje třídění pro tým, bez ohledu na druhý tým, který bude zlomit zpět-k-zpět rovnováhu pro druhý tým.
To by byl ideální případ maximalizace pomocí programování s omezujícími podmínkami, například pomocí python-constraint nebo pyomo. Ale já jsem opravdu špatný na modelování constraint satisfaction problémy (CSP), takže jsem neměl ponětí, kde začít s tímto případem.
Nějaké nápady?