Creation macro type solver sudoku Excel 2013

On entre dans le vif du sujet avec le tirage des équipes pour les répartir en 4 groupes. On connait le nombre d'équipes par groupe : on met ce nombre dans chacun des 3 premirs groupes, le reste dans le 4e (si le nombre d'équipes est inférieur au multiple du nombre de sites par 4, les "trous" se retrouvent ainsi concentrés dans le 4e groupe, ce qui est destiné à garantir 3 équipe par site au moins).

Le tirage consiste donc à reclasser aléatoirement les équipes pour en constituer une nouvelle liste à partir de laquelle on servira successivement les 4 groupes.

On a des numéros correspondant chacun à une équipe, on les tire un à un successivement pour obtenir un nouvel ordre. Evidemment chaque tirage ne doit pas tirer un numéro déjà tiré.

Pour ne pas avoir à tester à chaque tirage qu'il ne s'agit pas d'un doublon, j'utilise la méthode que je nomme volontiers string-Galopin ( ) du nom de l'intervenant à qui je l'ai emprunté il y a déjà longtemps ( ). Et string car elle consiste à transformer les numéros en chaînes de caractères (en prenant les caractères de la table à partir du 33e (pour éliminer les caractères de contrôle et l'espace).

Ceci fait, on initialise le générateur de nombres aléatoires, et on procède au tirage proprement dit : on tire un numéro de 1 au nombre de caractère de la chaîne, on en extrait le caractère dont le rang correspond au numéro tiré, on l'ajoute à une nouvelle chaîne des caractères tirés et on l'enlève de la chaîne initiale. Comme on tire toujours sur le nombre de caractères restant dans la chaîne de départ, il ne peut pas y avoir de doublon.

Il suffit de convertir les caractères de la chaîne tirée en numéros (opération inverse de la première et de servir (au cas particulier le tableau des groupes qu'on aura dimensionné en conséquence.

Procédure simple mais il s'agit du tirage principal, déterminant pour la suite des opérations. Les numéros sont convertis en nom d'équipe pour être stockés dans le tableau grp (niveau module) qui servira à la fin de l'opération pour insérer les noms d'équipes dans le tableau de résultats.

Entretemps on identifie les équipes par leur numéros d'indice dans la "colonne" du tableau grp correspondant à chaque groupe (0 à x, x pouvant varier de 4 à 8).

A suivre.

La proc. pilote reprend la main pour à l'étape suivante opérer le choix de la grille de répartition dont on a déjà parlé.

Ce choix va être stocké dans la variable module grilR et opéré par appel d'une fonction : GrilleRépart à laquelle on passe le nombre de sites utilisés en argument.

La fonction opère un tirage aléatoire entre 4 possibilités de grilles : ces grilles consistent en un tableau de 21 valeurs, comme on l'a déjà décrit. Les grilles de base sont établies pour 7 sites utilisés. Puis selon le nombre de sites on modifie la grille choisie pour l'adapter : pour 5 ou 6 sites on élimine les 6 dernières valeurs, pour 8 sites les 3 dernières. Hormis pour 5 et 7 sites, quelques valeurs doivent en outre être modifiées dans les autres cas.

Il est certainement possible d'établir quelques autres grilles. J'en avais défini 3 de plus mais que je n'ai pas retenu dans la mesure où elles réduisaient le nombre de journées programmables. Le choix entre 4 possibilités permet déjà une certaine diversification, on pourra ultérieurement tenter d'en définir de nouvelles...

Ceci fait, la procédure opère l'effacement du tirage précédent, avant de lancer la procédure chargée de composer la répartition finale : TirageJours en lui passant en arguments le nombre de jours à composer et le nombre max. de jours correspondant à la situation traitée.

A suivre

La proc. composant le tableau final va composer un tableau de même forme que celui qui sera affecté à la feuille Répartition, soit un tableau de colonnes dont la première listera les sites utilisés autant de fois qu'il y a de jours programmés, dans le même ordre pour chacun des jours. Les autres colonnes indiqueront les équipes (ou 3) associées à chaque site pour chaque journée.

Cette composition donne lieu à 2 autres tirages aléatoires des éléments utilisés.

D'abord l'ordre dans lequel sera utilisée la grille de répartition. On a vu qu'elle est en fait composée de groupes de 3 valeurs, permettant chacun de définir la composition d'une journée (de façon différente des autres journées). La grille peut comporter une nombre de groupes de 3 valeurs égal ou supérieur au nombre de jour. On tire donc les groupes de 3 valeurs qu'on retient et dans quel ordre.

Ce tirage fait en une fois pour toutes les journées, est matérialisé par une variable accueillant un nombre d'éléments égal au nombre de jours, chaque élément indiquant à quel indice du tableau grilR on fera appel pour le jour, indice de la première valeur de chaque groupe de 3, donc tous ces indices seront des multiples de 3 : 0, 3, 6, 9...

Le tirage est fait en début de procédure par appel d'une fonction : TirageJourGrille en lui passant en arguments le nombre de jours, et le nombre max de jours que permet la grille.

Un autre tirage est fait de façon à définir pour chaque jour un ordre spécifique des sites. Les sites sont numérotés de 1 à x et on tire un ordre de ces numéros pour chaque jour (l'application de la grille se fait sur un ordre prédéfini, on modifie cet ordre en faisant varier la correspondance avec les sites). Le tirage est fait en cours de composition, pour chaque journée.

Comme on a déjà dit qu'on reclassait les sites dans le même ordre pour chaque jour, cela implique que chaque jour une fois défini, devra être trié pour aboutir à la prrésentation finale.

Le tirage sites est opéré par appel d'une fonction : TirageSite à laquelle on passe le nombre de sites en argument. Le résultat est recueilli dans une variable (sit) sous forme de tableau.

La procédure opère en utilisant des boucles :

Première boucle (externe) sur le nombre de jours, de 1 au nombre de jours définis au départ.

Pour chaque jour, on va composer la partie du tableau correspondant au jour. On dimensionne en préservant ce qui est déjà dans le tableau (jours précédents). Tableau de 5 colonnes auquel on ajoute un nombre de lignes (au départ on les ajoute à rien de préexistant) égal au nombre de sites. A chaque fois on introduit une ligne supplémentaire (qui sera utilisée pour le tri de la journée, et sera ensuite la première ligne du jour suivant, on la supprimera à la fin).

On sert d'abord la première ligne de la journée en ce qui concerne les 4 colonnes groupes : la première prend systématiquement la valeur 0, les 3 autres les valeurs prélevées dans la grille (en tenant compte du tirage opéré pour l'ordre de prélèvement dans la grille).

On sert les lignes suivantes en incrémentant de 1 les valeurs de la ligen précédente.

On tire ensuite l'ordre des sites et on sert la colonne site en conséquence.

Il faut alors retrier les lignes du jour pour les remettre dans l'ordre des sites. On opére selon la méthode classique du tri à bulles : on compare la première valeur (colonne site) successivement aux autres, si les deux valeurs ne sont pas dans le bon ordre on switche (la ligne supplémentaire en fin sert au switch), double boucle pour parcourir toutes les lignes en les comparant (et une boucle pour les opérations de switch). A l'issue toutes les valeurs sont dans le bon ordre...

Une fois supprimée la ligne en trop, on se trouve en présence d'un tableau dont la colonne site comprend des numéros d'ordre (remis dans l'ordre) et les autres colonnes des numéros convertibles en numéros d'indice du tableau grp contenant les noms des équipes.

On finalise donc le tableau en remplaçant les numéros de sites par leur nom (liste des sites) et les indices par les noms d'équipes.

On affecte ce tableau à la feuille sur la plage d'accueil (dimensionnée à la même taille).

On sert la colonne à gauche de ce tableau (en fusionnant les cellules correspondant à chaque journée) de façon à indiquer les journées, et bordures pour achever la mise en forme...

L'opération est terminée.

Quelques tests (limités) ont été fait pour opérer le débogage élémentaire (en principe tu ne devrais pas avoir d'erreur en appuyant sur le bouton), mais il est trop tôt pour garantir que je n'ai pas fait d'erreur, soit de calcul, soit (plus de risques) de report en recopiant les paramètres (ce que tu constateras si des doublons apparaissent...)

A toi de tester de façon plus approfondie donc !

Cordialement.


bonsoir MFerrand,

je suis très épaté mais aussi très gêné du travail que cela vous donne,

a part vous dire merci je ne sais quoi dire

Pas de quoi être gêné... Si je n'avais pas envie de prendre le temps de le faire, je ne l'aurais point fait !

En fait cela se situe pour moi dans le prolongement d'un travail ressemblant par certains côtés (il s'agissait de compositions de tables de jeux lors d'un tournoi...) que j'avais abandonné en cours de route, ne trouvant pas un listage suffisant de compositions compatibles.

J'ai donc le sentiment d'avoir un peu avancé sur ce type de question... Je t'en remercie ! Mais je pense qu'il y a encore du chemin à faire pour parvenir à quelque chose de vraiment satisfaisant. J'en suis encore à des résultats plutôt empiriques et je préfèrerais arriver à une façon plus mathématique d'aborder le problème...

Sinon, je n'ai certes aucun besoin de faire ce type de calcul, rien ne m'y oblige... Mais de même rien ne m'empêche de le faire !

Et si tu y trouves avantage, tant mieux !

Maintenant, avant de poursuivre sur quelques prolongements, je ferai d'abord une "pause" sur d'autres types de problèmes...

bien sur qu j'y trouve des avantages.

prenez le temps qu il vous faudra.

bonne soirée.

Rechercher des sujets similaires à "creation macro type solver sudoku 2013"