Prüfen, ob die Gewinn-Verlust-Wertung einer Liga möglich ist

8

Sie veranstalten eine 1-gegen-1-Basketballliga mit einem Spielplan. Am Ende der Liga muss jeder Spieler seinen vermeintlichen Gewinn-Verlust-Rekord melden (es gibt keine Unentschieden), aber Sie möchten überprüfen, ob die vorgeschlagene Platzierung angesichts des Zeitplans tatsächlich möglich war.

Zum Beispiel: Sie haben vier Spieler (Alice + Bob + Carol + Dave) und Ihr Zeitplan ist ein einfaches Round Robin. Die gemeldeten Tabellen [ A: 3-0 B: 1-2 C: 1-2 D: 1-2] und [ A: 2-1 B: 1-2 C: 1-2 D: 2-1] wären möglich, aber das Stehen [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] wäre nicht.

Nehmen wir nun an, der Zeitplan ist stattdessen ein 3-Spiele-Kopf-an-Kopf-Spiel zwischen Alice + Bob und Carol + Dave. Das gemeldete Stehen [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] ist jetzt möglich, aber [ A: 3-0 B: 1-2 C: 1-2 D: 1- 2] wäre nicht mehr.

(Der Zeitplan muss in keiner Weise symmetrisch sein. Sie könnten Alice nur 10 Mal gegen Bob spielen lassen und dann Bob + Carol + Dave 58 Round Robin gegeneinander spielen lassen.)

Problem : Überprüfen Sie bei einem Zeitplan mit k Teilnehmern und n Gesamtspielen effizient, ob aus diesem Zeitplan tatsächlich eine vorgeschlagene Gewinn-Verlust-Wertung hervorgehen könnte.


Die O ( ) Brute-Force-Methode ist offensichtlich. Zählen Sie alle möglichen Spielergebnisse auf und prüfen Sie, ob sie mit der vorgeschlagenen Wertung übereinstimmen. Und wenn k klein ist, erhöht n nicht viel Komplexität - es ist sehr einfach, die Rangliste einer Zwei-Personen-Liga zu überprüfen, unabhängig davon, ob sie zehn oder zehn Milliarden Spiele spielt. Darüber hinaus habe ich bei der Suche nach einer besseren Methode nicht viel Fortschritte gemacht und war neugierig, ob jemand zuvor ein ähnliches Problem gesehen hat.2n

ManyCookies
quelle

Antworten:

8

Dies kann als Max-Flow-Problem modelliert werden.

Stellen Sie als Vorverarbeitungsschritt sicher, dass die Anzahl der Spiele der Summe der Anzahl der Siege entspricht (wenn nicht, wissen Sie, dass etwas nicht stimmt).

Sei eine Menge von Eckpunkten, die den gespielten Spielen entsprechen, und eine Menge von Eckpunkten, die den Spielern entsprechen. Lassen und bezeichnen zwei weitere Ecken (Quelle und Senke).GPst

Fügen Sie nun für jedes Spiel das zwischen und wird, eine Kante von nach mit Kapazität und Kanten von nach und nach auch mit Kapazität . Dies modelliert die Tatsache, dass das Spiel jedem Spieler einen Punkt geben kann.gGp1Pp2Psg1gp1gp21

Fügen Sie dann für jeden Spieler eine Kante von nach Kapazität der gemeldeten Anzahl von Gewinnen für Spieler . Dies modelliert die Tatsache, dass dieser Spieler höchstens diese Anzahl von Spielen gewinnen sollte.pPptp

Von hier aus ist leicht zu erkennen, dass, wenn die gemeldeten Bewertungen möglich sind, ein sättigender Fluss von nach und wechselseitig auftritt. Sie müssen also nur überprüfen, ob der maximale Fluss in diesem Diagramm der Anzahl der gespielten Spiele entspricht.sts,t

Alternativ können Sie auch ein Diagramm mit einem Scheitelpunkt pro Spiel und einer Anzahl von Scheitelpunkten für jeden Spieler erstellen, die der Anzahl der Siege entsprechen. Verbinden Sie diese auf die gleiche Weise wie zuvor und prüfen Sie, ob die Anzahl der Kanten in einer maximalen Übereinstimmung gleich ist die Anzahl der Spiele (aber das ist fast das gleiche wirklich).

Quaste
quelle
Sehr schön! Und anstatt einen Knoten für jedes der m separaten Spiele zwischen P1 und P2 zu haben, könnten Sie alle zu einem Knoten (einem "Serien" -Knoten) mit Kantenkapazitäten m anstelle von 1 zusammenfassen?
ManyCookies
In der Vorverarbeitung sollten Sie auch überprüfen, ob die Anzahl der von jedem Spieler gemeldeten Gewinne + Verluste der Gesamtzahl der von diesem Spieler gespielten Spiele entspricht.
Ilmari Karonen
Auch wenn Ihre Antwort technisch korrekt erscheint, beachten Sie, dass in der Praxis die Lösung des Max-Flow-Problems weder erforderlich ist, um einfaches Betrügen zu erwischen (wobei Spieler nur betrügen, indem sie zusätzliche Gewinne und / oder weniger Verluste beanspruchen; die Vorverarbeitung allein wird dies erfassen), noch ausreichend um subtileres Betrügen zu erwischen (wo z. B. Alice ein Match gegen Bob verliert, aber beide später zustimmen, es trotzdem als Alices Sieg zu melden; es gibt keine Möglichkeit, dies nur anhand der angegebenen Daten zu erkennen). Aber das ist ein Problem mit dem Problem von @ ManyCookies, wie angegeben, nicht mit Ihrer Lösung.
Ilmari Karonen
@ManyCookies: Sicher, das sollte auch funktionieren :)
Tassle
@IlmariKaronen: Ja, Sie können eine beliebige Anzahl von Vorverarbeitungsschritten hinzufügen, damit die Dinge in der Praxis schneller laufen, aber diese sind nicht unbedingt erforderlich, während der von mir vorgeschlagene Vorverarbeitungsschritt hauptsächlich darin bestand, die Überprüfung des Max-Flow-Zustands zu vereinfachen (ohne ihn) Sie müssten überprüfen, ob der Durchfluss an beiden Enden gesättigt ist, was auf diesen Vorverarbeitungsschritt hinauslaufen würde.
Quaste