2009-08-03 14 views
0

Ich arbeite an einer Programmierübung, die mich seit einiger Zeit interessiert. Ziel dieser Übung ist es, programmatisch einen Softballplan für eine Saison zu generieren. Wonach ich suche, ist eher ein allgemeiner Ratschlag als ein bestimmter Answasser, da ich versuche, dabei etwas zu lernen.Hilfe beim Erstellen eines Zeitplangenerators

Der Teil des Programms, mit dem ich wirklich zu kämpfen habe, ist, wie man alle Spiele erzeugt, die in einer Nacht gespielt werden. Dies ist die grundlegende Funktionalität, die ich in der ersten Interaktion erreichen möchte.

Problem: Gegeben eine Liste von Teams, generieren Sie einen Zeitplan, der jedes Team 2 Spiele spielen, und kein Team kann das gleiche Team zweimal in einer Nacht spielen.

Antwort

2

ging ich mit der Umsetzung, die ich auf Wikipedia für Round Robin http://en.wikipedia.org/wiki/Round-robin_tournament

Der Standardalgorithmus für Round-Robins gefunden ist jeden Teilnehmer eine Nummer zuweisen, und koppeln sie in der ersten Runde aus ...

1 2 3 4 5 6 7 
    14 13 12 11 10 9 8 

... fix dann einen Konkurrenten (Nummer eins in diesem Beispiel), und drehen Sie die andere im Uhrzeigersinn ...

1 14 2 3 4 5 6 
13 12 11 10 9 8 7 


1 13 14 2 3 4 5 
12 11 10 9 8 7 6 

... bis Sie fast wieder in der ursprünglichen Position landen

1 3 4 5 6 7 8 
2 14 13 12 11 10 9 
+0

Ich würde gerne den Algorithmus im Code dafür sehen ... – ganders

1

Es scheint, als könnten Sie das ganz einfach tun, indem Sie einfach Ihre Teamliste drehen.

z.B. gegeben Teams 1..10, dies zu tun:

Team A: 1 2 3 4 5 6 7 8 9 10 
Team B: 2 3 4 5 6 7 8 9 10 1 

so in Spiel ein, Team A spielt Team B. Für Spiel zwei, drehen wieder:

Team A: 1 2 3 4 5 6 7 8 9 10 
Team B: 3 4 5 6 7 8 9 10 1 2 

Neun Spiele erhalten Sie eine volle Runde geben -robin, und dann kannst du wieder am Anfang anfangen. Nehmen Sie die Spiele in Paaren für Ihre nächtlichen Matchups.

EDIT

Kylotan weist darauf hin, dass dies nicht wirklich funktioniert, wie es jedes Team spielt zweimal auf einmal hat. Hoppla. Wenn Sie etwas gefunden haben, das wirklich funktioniert, ermutige ich Sie, es zu posten und zu akzeptieren :-)

+0

Ich wusste, dass es eine einfache und elegante Lösung für dieses Problem geben musste. Dies überwindet die erste von mehreren Herausforderungen. –

+0

Ich habe diese Lösung implementiert und es funktioniert. Das einzige Problem, das ich habe, dass es zu computergeneriert aussieht, aber das kann ich mit –

+2

leben. Spielt Team 2 nicht gegen Team 1 und Team 3 für Spiel eins? – Kylotan

0

Verwenden Sie diese Art der Zirkulation. Sie halten die Teams in einem Ring und drehen den Ring herum.

Team A: 1 2 3 
Team B: 4 5 6 

Team A: 4 1 2 
Team B: 5 6 3 

Team A: 5 4 1 
Team B: 6 3 2 

Team A: 6 5 4 
Team B: 3 2 1 

Team A: 3 6 5 
Team B: 2 1 4 
0

Die folgende Lösung ist vielleicht nicht die beste, aber sehen Sie, ob es für Sie funktioniert.

Ich beginne mit einer Struktur zu schaffen jedes Spiel

public struct Game { 
    private int TeamA; 
    private int TeamB; 
    private bool GamePlayed; 

    // I am adding this to quickly see what team is playing. I used this for debugging 
    // purposes to make sure the same team doesn't play another team twice. 
    public override ToString() { 
     return TeamA.ToString() + " vs. " + TeamB.ToString(); 
    } 
} 

Dann habe ich eine Liste erstellen zu halten, die einander spielen alle verschiedenen Kombinationen von 10 Teams comtains. Es sollte 45.

List<Game> AllGamesInSchedule = new List<Game>(); 

for (int i = 1; i <= 10; i++) { 
    for (int j = (i + 1); j <= 10; j++) { 
     AllGamesInSchedule.Add(new Game(i, j)); 
    } 
} 

// This prints all the different game combinations out to the console to see 
// that they are all different. 
foreach (Game game in AllGamesInSchedule) { 
    Console.WriteLine(game.ToString()); 
} 

Jetzt können Sie eine Methode erstellen, die Spiele aus dieser Liste auswählt. Sobald ein Spiel ausgewählt wurde, ändern Sie das Feld GamePlayed in true, um zu wissen, dass Sie dieses Spiel nicht erneut auswählen sollten. Oder Sie können das Spiel einfach aus der Liste entfernen.

Sie sagten, Sie wollten Führung und das ist, warum ich nicht die Methode geschaffen habe, Spiele auszusuchen.

Hoffnungen das hilft.

Verwandte Themen