2009-08-03 5 views
0

Je travaille sur un exercice de programmation qui m'intéresse depuis un certain temps. Le but de cet exercice est de générer un programme de softball pour une saison par programme. Ce que je cherche, c'est un conseil général plutôt qu'une réponse spécifique car j'essaie d'apprendre quelque chose dans le processus.Aide à la création d'un générateur de programme

La partie du programme avec laquelle je me bats vraiment est comment générer tous les jeux qui sont joués en une nuit. C'est la fonctionnalité de base que j'essaie d'atteindre dans la première interaction.

Problème: Avec une liste d'équipes, générez un planning dans lequel chaque équipe joue 2 parties, et aucune équipe ne peut jouer la même équipe deux fois en une nuit.

Répondre

2

Je suis allé avec la mise en œuvre que j'ai trouvé sur Wikipedia pour Round Robin http://en.wikipedia.org/wiki/Round-robin_tournament

L'algorithme standard pour ronds-rouges-gorges est d'attribuer à chaque concurrent un certain nombre, et les apparier au premier tour ...

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

... puis fixer un concurrent (numéro un dans cet exemple) et faire pivoter les autres dans le sens horaire ...

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 

... jusqu'à ce que vous vous retrouviez presque à la position initiale

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

J'aimerais voir l'algorithme dans le code pour cela ... – ganders

1

Il semble que vous pourriez le faire tout simplement en tournant votre liste d'équipes.

par exemple. les équipes données 1..10, faites ceci:

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

donc dans le premier match, l'équipe A joue l'équipe B. Pour le deuxième match, faites pivoter à nouveau:

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

Neuf jeux vous donnera un tour complet -robin, et alors vous pouvez recommencer au début. Prenez les jeux en paires pour vos affrontements nocturnes.

EDIT

Kylotan souligne que cela ne fonctionne pas vraiment, comme à chaque équipe de jouer deux fois à la fois. Oops. Si vous avez trouvé quelque chose qui fonctionne vraiment, je vous encourage à le poster et l'accepter :-)

+0

Je savais qu'il devait y avoir une solution simple et élégante à ce problème. cela surmonte le premier de plusieurs défis. –

+0

J'ai implémenté cette solution et cela fonctionne. Le seul problème c'est que ça a l'air trop généré par ordinateur, mais c'est quelque chose que je peux vivre avec –

+2

Ce système n'a-t-il pas l'équipe 2 qui joue contre l'équipe 1 et l'équipe 3 pour le premier match? – Kylotan

0

Utilisez ce type de circulation. Vous gardez les équipes dans un anneau et tournez l'anneau autour.

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

La solution suivante peut ne pas être la meilleure, mais voyez si cela fonctionne pour vous.

Je commence par la création d'une structure pour tenir chaque jeu

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(); 
    } 
} 

Puis-je créer une liste qui comtains toutes les différentes combinaisons de 10 équipes jouant les uns des autres. Il devrait y avoir 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()); 
} 

Maintenant, vous pouvez créer une méthode qui sélectionne les jeux de cette liste. Une fois qu'un jeu est sélectionné, changez le champ GamePlayed en Vrai pour savoir que vous ne devriez pas choisir ce match à nouveau. Ou vous pouvez simplement supprimer le jeu de la liste.

Vous avez dit que vous vouliez des conseils et c'est pourquoi je n'ai pas créé la méthode pour choisir des jeux.

Espère que cela aide.