Besoin d'aide pour identifier un algorithme de programmation de ligue

9

J'essaie de créer un calendrier de ligue sportive. J'ai du mal à identifier un algorithme pour m'aider à remplir efficacement chaque emplacement.

Des exemples de données pour construire le calendrier seraient:

  1. 10 équipes
  2. Chaque équipe se joue 1 fois (45 matchs au total requis)
  3. Chaque équipe ne joue pas plus d'une fois par jour
  4. Dans mes tests, j'utilise 9 jours avec 5 emplacements par jour.

Table combinée (contient 45 combos)

ID
Team1ID
Team2ID
bitAssigned

Tableau des horaires (contient 45 plages horaires)

scheduleID
homeTeamID
awayTeamID
GameDate
GameTime

À l'heure actuelle, mes procédures existantes remplissent environ 90% des emplacements, laissant 10% de mes emplacements vides à un conflit d'horaire basé sur les règles ci-dessus.

Je passe en revue ma table de programme dans l'ordre croissant de date / heure.
Ma première place pourrait être samedi à 8h.
Je recherche une liste d'équipes qui n'ont pas encore été programmées. Je fais ensuite un éventail de combinaisons possibles de ces équipes. J'utilise ensuite ce tableau pour extraire 1 enregistrement aléatoire de ma table de combinaisons de combinaisons qui n'ont pas encore été planifiées et je place ces équipes sur le calendrier. J'ai ensuite défini cette combinaison comme utilisée.

Je répète la boucle encore et encore et à chaque fois que ma liste d'équipes disponibles se réduit et que mon tableau est également plus petit.

Je constate que certains jours se passent bien, et d'autres jours, mes 2 dernières équipes restantes ont déjà joué la semaine précédente, donc elles ne sont pas ajoutées au calendrier.

La seule chose que je n'ai pas encore essayée est de "réinitialiser" les jours de conflit et de les réessayer pour voir si j'obtiens de meilleurs placements.

Est-ce que quelqu'un a des suggestions?

Steve
la source
5
calendrier du tournoi à la ronde
kevin cline
Merci Kevin. tu as raison. Il me semble qu'en ce moment, mon réseau commence au même endroit à chaque fois et qu'il n'y a pas de rotation, donc pas de flux ordonné pour jumeler les équipes.
steve
1
J'utilise une approche complètement aléatoire. Choisissez au hasard un emplacement et deux équipes. Si les règles sont satisfaites, planifiez le match. Sinon, jetez-le et réessayez. Je fixe une limite au nombre total de tentatives et si la limite est atteinte, je rejette tout le programme et recommence. Cela fonctionne plutôt bien en pratique.
Cerad
J'ai fini par aller et suivre l'approche du tournoi à la ronde. J'ai terminé à 95% d'écrire le script pour me connecter à la base de données, mais lors des tests, il semble fonctionner de manière fluide et équilibrée. Je traite mes journées comme des «rondes» et elles restent agréables et équilibrées. Je peux jouer mes tours dans n'importe quel ordre et mettre les jeux pour chaque tour dans n'importe quel ordre, mais le fait de déplacer un jeu d'un tour à l'autre enfreindrait finalement les règles.
Steve

Réponses:

5

Voici un algorithme que j'ai inventé moi-même. Je ne sais pas s'il existe déjà ou s'il s'agit en fait de l'implémentation du tournoi à la ronde:

1 4    1 5   1 6   1 3   1 2
2 5    4 6   5 3   6 2   3 4
3 6    2 3   4 2   5 4   6 5

vous commencez avec

pic de rotation

et gardez toujours le 1 dans la même position et tournez le reste.

De cette façon, vous obtiendrez toujours un calendrier de matchs uniques. Ceci est extrêmement facile à mettre en œuvre et s'adapte à n'importe quel nombre d'adversaires, même ou irrégulier. Si vous avez un nombre irrégulier d'adversaires, ne placez pas une équipe en 1 position et ils ont un tour gratuit.

Pieter B
la source
2
Comment gérez-vous les soldes domicile / extérieur?
Eric Cope
Cela ne fonctionne pas réellement - dans cet algorithme de rotation simple, les équipes tournantes qui sont séparées de 2 emplacements (2/4, 3/5) ne joueront jamais.
mdryden
@mdryden ça marche. Vérifiez-le mieux et veuillez supprimer votre commentaire.
Pieter B
@PieterB Je pensais que cela fonctionnerait, mais cela ne fonctionne pas s'il y a un nombre impair d'équipes, car celles qui sont côte à côte (comme 4 et 5) ne se joueront jamais. Vous pouvez le voir assez facilement à la fin avec le 1, et aussi à l'autre extrémité parce que vous avez l'équipe pendant (avec le bye) Voici une bonne réponse qui traite également du nombre impair: stackoverflow.com/a/6649732/ 6489306
ragingasiancoder
@ragingasiancoder s'il y a un nombre impair d'équipes, ajoutez une équipe fictive. La réponse que vous avez liée décrit exactement la même solution que celle que j'ai présentée.
Pieter B
1

Je pense que vous le faites à l'envers. Ne commencez pas avec le tableau de programmation, commencez par un tableau / tableau / quelle que soit toutes les combinaisons de jeux (les 45 jeux). À partir de là, c'est un processus simple d'affecter les jeux à une journée, basé sur une équipe qui ne joue qu'une fois par jour. Et comme les matchs ne se produisent qu'une seule fois (l'équipe A ne joue qu'une seule fois contre l'équipe B), la planification est facile car il vous suffit de vous assurer que le match n'a pas déjà eu lieu (les entrées sont "uniques" de cette façon).

Codeur inconnu
la source
1

J'ai généré le calendrier du tournoi à la ronde à 10 équipes ci-dessous. Cela m'a pris environ 3 minutes.

Informations sur les horaires:

10 équipes - 1 tournoi à la ronde (seules les 6 premières semaines sont affichées)
Date de début de saison 1/6/15 - date de fin 3/5/15
2 matchs chaque mardi, 3 matchs chaque jeudi, 5 matchs chaque semaine sans dates de saut

  • Toutes les équipes sont réparties pour jouer dans les 5 plages horaires également.
  • Tous jouent à 9 matchs.
  • Tous se jouent une fois.
  • Tous sont répartis uniformément en tant que domicile et visiteur (5/4 ou 4/5). Remarque: à la fin du tournoi à la ronde 2, toutes les équipes jouent 18 matchs (9 à domicile et 9 en tant que visiteur) et toutes les équipes ont 2 byes.
  • Tous sont distribués pour jouer uniformément dans les 5 plages horaires chaque semaine.

Nous avons utilisé un ordinateur principal Honeywell obsolète et un peu moins de 3 ans pour assembler le tout. Une fois notre logiciel de planification débogué, il a fallu plusieurs heures à l'ordinateur principal pour rechercher des millions de permutations et de combinaisons afin de calculer et de créer les modèles équilibrés pour 4 à 22 équipes que nous recherchions.

10 Team Division Schedule   DATE 12/20/14

DATE   DAY TIME    LOCATION  GM  HOME vs VISITOR

Jan  6 Tue 6:00pm  Field #1   1  # 1 vs #10 
Jan  6 Tue 6:00pm  Field #2   1  # 2 vs # 9 
Jan  8 Thu 6:30pm  Field #3   1  # 3 vs # 8 
Jan  8 Thu 6:30pm  Field #4   1  # 4 vs # 7 
Jan  8 Thu 6:30pm  Field #5   1  # 5 vs # 6

Jan 13 Tue 6:00pm  Field #1   2  # 6 vs # 3 
Jan 13 Tue 6:00pm  Field #2   2  #10 vs # 8 
Jan 15 Thu 6:30pm  Field #3   2  # 7 vs # 2 
Jan 15 Thu 6:30pm  Field #4   2  # 9 vs # 1 
Jan 15 Thu 6:30pm  Field #5   2  # 4 vs # 5

Jan 20 Tue 6:00pm  Field #1   3  # 7 vs # 9 
Jan 20 Tue 6:00pm  Field #2   3  # 5 vs # 2 
Jan 22 Thu 6:30pm  Field #3   3  # 6 vs #10 
Jan 22 Thu 6:30pm  Field #4   3  # 3 vs # 4 
Jan 22 Thu 6:30pm  Field #5   3  # 8 vs # 1

Jan 27 Tue 6:00pm  Field #1   4  # 9 vs # 5 
Jan 27 Tue 6:00pm  Field #2   4  # 1 vs # 7 
Jan 29 Thu 6:30pm  Field #3   4  # 2 vs # 3 
Jan 29 Thu 6:30pm  Field #4   4  # 8 vs # 6 
Jan 29 Thu 6:30pm  Field #5   4  #10 vs # 4

Feb  3 Tue 6:00pm  Field #1   5  # 4 vs # 8 
Feb  3 Tue 6:00pm  Field #2   5  # 7 vs # 5 
Feb  5 Thu 6:30pm  Field #3   5  # 1 vs # 6 
Feb  5 Thu 6:30pm  Field #4   5  #10 vs # 2 
Feb  5 Thu 6:30pm  Field #5   5  # 3 vs # 9

Feb 10 Tue 6:00pm  Field #1   6  # 3 vs # 7 
Feb 10 Tue 6:00pm  Field #2   6  # 6 vs # 4 
Feb 12 Thu 6:30pm  Field #3   6  # 5 vs # 1 
Feb 12 Thu 6:30pm  Field #4   6  # 9 vs #10 
Feb 12 Thu 6:30pm  Field #5   6  # 8 vs # 2 

Il n'y a pas d'algorithme qui résout les problèmes de planification globale associés aux centaines ou milliers de différents types de ligues, de sports et de situations potentielles. Ce que nous avons fait pour résoudre ce problème était d'adopter une approche différente pour calculer les horaires. Cela commence par des calculs très complexes pour déterminer les bons couples d'équipes de tournoi à la ronde (matchs), mais ce n'était que le début. D'autres pièces sont nécessaires pour créer un calendrier équilibré utile qui peut être publié et distribué. Les joueurs, entraîneurs, parents, etc., ont tous besoin de savoir non seulement à qui ils jouent ; mais où ils jouent ; à quelle heure ils jouent ; s'ils sont à la maison ou en visite ; et pour de nombreuses ligues, un numéro de match .

J'espère que cela vous aide, vous et d'autres, à comprendre ce qui nous a pris 3 ans pour comprendre.

Communauté
la source