Discussion:
Algorithmus für Round Robin (Turnierplanung)
(zu alt für eine Antwort)
Jan Sauerwein
2004-05-21 14:25:14 UTC
Permalink
Hallo dcm,

Ich hoffe ich bin hier richtig. Ich suche einen Algorithmus zur Auslosung
einer Round Robin.

RoundRobin: Runden-System bei Turnieren. Jeder Spieler spielt gegen jeden
anderen seiner Gruppe.

Es ist noch relativ einfach bei Partien von zwei Spielern (1:1) all
möglichen Paarungen zu finden (einfache Kombinatorik):

Bei sagen wir 6 Spielern (nummeriert von 0 bis 5):
0:1 1:2 2:3 3:4 4:5
0:2 1:3 2:4 3:5
0:3 1:4 2:5
0:4 1:5
0:5

Also 6 über 2 mögliche Partien (= 15).

Wie bekomme ich jetzt nun jedoch schon einmal alle Partien, die
gleichzeitig gespielt werden können? Möglichst ohne Backtracking?

Doch die eigentlich schwierige Fragestellung beginnt erst jetzt.
Eine RoundRobin besagt, dass jeder gegen jeden gespielt haben muss. Bei
Partien in der nur zwei Parteien antreten ist das gleich mit der Menge
aller Tupel ohne Reihenfolge.
Wenn nun aber mehr Parteien als 3 an einer Partie beteiligt sind, wird das
ganze ziemlich kompliziert.

Ein "einfaches" und kleines Beispiel:
15 Mitspieler, 3er Partie.
Das wären 455 mögliche Partien ohne Betrachtung der Reihenfolge. Dann wären
alle möglichen Spielkombinationen abgedeckt. Das ist ziemlich viel und auch
nicht nötig, da nur jeder genau einmal gegen jeden gespielt haben soll.
Übrigens wären dies 91 Runden. Und viele Stunden Spielzeit.

So nun gilt es nur die relevanten Spiele zu ermitteln. Als erstes stellt
man fest, dass nicht alle Kombinationen aus Spielerzahl und Partiegröße
funktionieren können. Doch dazu später mehr. Hier erst einmal meine
bisherige Vorgehensweise:

Ich erstelle mir eine Liste aller möglichen zweier Tupel aus den 15
Spielern (ohne Reihenfolge). In dieser Liste hake ich nun ab, ob diese
beiden Spieler bereits gegen einander gespielt haben.

Nun gehe ich die Liste aller möglichen Partien durch. Für jede Kombination
gucke ich nun ob dort bereits eine Kombination aus meiner Liste vorkommt.
Ob also schon zwei Spieler gegen einander gespielt haben. Ist das der Fall,
wird die Kombination gelöscht.
Andernfalls werden die neu hinzugekommenen in der Liste markiert. Das laufe
ich durch bis alle möglichen Kombinationen durchlaufen sind.

Bei 15 Spielern und 3er Partien klappt das. So auch bei 3 (logisch oder?),
7, 31, ..., 2^n-1 Spielern und einer 3er Partie. (getestet - nicht
bewiesen, aber da fehlte mir die Lust, solte aber mittels Vollst. Induktion
ein Leichtes sein.)
Bei allen anderen Spielerzahlen haben nach Ablauf aller Spielkombinationen
nicht alle Spieler mindestens einmal gegen jeden anderen gespielt.

Das Problem ist aber noch nicht behoben; jetzt gilt es alle Partien zu
finden, die man gleichzeitig austragen könnte. Aus obiger 35 Partien
starken Liste ist dies noch nicht so schwierig, aber bei größeren
Teilnehmerfeldern wird das schon schwieriger. Ein generischer Algorithmus?

Meine Frage bezieht sich auf die Verallgemeinerung für beliebige
Partiegrößen und Teilnehmerfelder (bis mindestens 8), die Auslosung
parallel spielbarer Partien und einen Algorithmus, der mir vor Beginn der
ersten Auslosung sagt, ob die Kombination aus Teilnehmerzahl und
Partiegröße funktioniert.

Sollte das noch viel zu einfach gewesen sein. Wäre es fast perfekt das
ganze auch noch für variable Partiegrößen ermitteln zu können. Zum Beispiel
möchte man 6er und 8er Partien zulassen. Welche Anforderungen ergeben sich
daraus, und wie muss ausgelost werden.

Der Algorithmus kann ruhig etwas länger dauern, da ich mich bereits davon
verabschiedet habe, dies jedes mal für jedes Turnier neu auszurechnen und
statt dessen meinem Programm Schablonen mitzugeben.

Jeder Tipp und Denkansatz zu einer Lösung ist mir willkommen.

Vielen Dank schon einmal im Voraus.
Jan Sauerwein
Dirk Thierbach
2004-05-22 06:32:29 UTC
Permalink
Post by Jan Sauerwein
Ich hoffe ich bin hier richtig. Ich suche einen Algorithmus zur Auslosung
einer Round Robin.
RoundRobin: Runden-System bei Turnieren. Jeder Spieler spielt gegen jeden
anderen seiner Gruppe.
In de.sci.informatik.misc findest Du eine Beschreibung eines passenden
Algorithmus, der allerdings in einem anderen Kontext gebraucht wurde
(den ich vergessen habe). Google mal mit dem Stichwort "Turnier"
o.ae., notfalls zusaetzlich mit mir als Autor.

- Dirk
Jan Sauerwein
2004-05-22 16:22:01 UTC
Permalink
Hallo Dirk,
Post by Dirk Thierbach
In de.sci.informatik.misc findest Du eine Beschreibung eines passenden
Algorithmus, der allerdings in einem anderen Kontext gebraucht wurde
(den ich vergessen habe). Google mal mit dem Stichwort "Turnier"
o.ae., notfalls zusaetzlich mit mir als Autor.
Ich gehe mal davon aus du meintest diesen hier:
http://groups.google.de/groups?hl=de&lr=&ie=UTF-
8&selm=klkq501csligpsh0pn0ja7rjrf1cqfecsm%404ax.com

Das ganze löst mein Problem für Spiele zwischen zwei Parteien. Somit wäre
zumindest die Suche der parallel spielbaren Partien bei 1 vs. 1 gelöst. Das
Hauptproblem dies jedoch für beliebig große (jedoch mindestens bis 8)
Partien zu errechnen, ist damit nicht gelöst.

Ich habe hier aber mal anhand des in dem Thread genannten Beitrages:
http://groups.google.com/groups?q=spielplan+group:de.sci.mathematik&hl=en&lr=&ie=UTF-
8&oe=UTF-8&selm=4pcgp0%24qhp%40fbi-news.Informatik.Uni-Dortmund.DE&rnum=2

mögliche Ansatzpunkte auf Basis von Graphen-Algorithmen gesucht.

Die Darstellung als Graph vereinfacht die Übersicht etwas. So konnte ich
folgende Bedingungen für funktionierende Kombinationen aus Teilnehmern und
Partiegrößen finden:

x := Teilnehmerfeld, y := Partiegröße
1. (x - 1) % (y - 1) == 0
2. (x(x -1)/2) % (y(y - 1)/2) == 0

Erklärung zu 1. Damit das Ganze erfolgreich sein kann, müssen auf alle
Fälle die Anzahl der Partien stimmen. Das heißt ein Spieler spielt in jeder
Partie gegen y - 1 Spieler (gegen sich selbst spielt er nicht). Da er gegen
jeden genau einmal gespielt haben soll, muss also die Anzahl aller Gegner
durch die y - 1 teilbar sein. Die Anzahl der Gegner ist das Teilnehmerfeld
ohne den Spieler selbst, also x - 1.

Erklärung zu 2. In einem Graphen gibt es m * (m - 1) / 2 Kanten. Oder um
bei dem Spiel zu bleiben, es gibt x * (x - 1) / 2 Tupel aus Teilnehmern.
Mit einer Partie fallen nun jedes Mal eine bestimmte Anzahl an Tupeln weg.
Nämlich genau so viele Tupel wie mit den Mitspielern zu bilden wären.
Daraus folgt y * (y - 1) / 2. Damit am Ende keine Kante mehr übrig bleibt.
Also jeder gegen jeden gespielt hat, muss die Anzahl aller Tupel durch die
Tupel einer Partie teilbar sein.

Soweit so gut. Damit kann man nun abfragen ob eine gewünschte Kombination
überhaupt funktionieren kann. Ausgelost ist jedoch noch lange nichts.
Während wie in den Beiträgen weiter oben erklärt und diskutiert bei 1 vs 1
nur geraden gebraucht werden, klappt der Trick alle "parallel" verlaufenden
Kanten für jede Runde zu benutzen. Das klappt jedoch schon bei 1 vs 1 vs 1
nicht mehr. Hier bilden sich Dreiecke. Bisher habe ich mit dem neuen Wissen
meinen Backtracking-Algorithmus zwar etwas verbessern können. Bei einem
Teilnehmerfeld von 64 Spielern und 8er Partien rechnet er sich aber noch
immer einen Wolf.

Die gleichzeitig spielbaren Partien sind ebenfalls noch lange nicht
ausgewählt. Um das zu erreichen, muss der Backtracking-Algorithmus nicht
nur die erst beste mögliche Kombination ermitteln. Er muss noch immer eine
Kombination finden bei der möglichst viele Partien gleichzeitig gespielt
werden können, es also nicht zu Überschneidungen kommt.

Ich fürchte ich werde um einen generischen Algorithmus, der eine Näherung
ermittelt nicht umhinkommen. Oder einige Tage rechnen lassen und Schablonen
verteilen.

Sollte jemandem noch etwas einfallen, denkt an mich.

Danke.
Ein schönes Wochenende noch.
Jan Sauerwein

Loading...