Forum des métiers

Bonjour,

Je souhaite créer un fichier avec ou sans macro pour faciliter l'organisation du Forum que nous mettons en place pour la première fois.

Le besoin :

- Pour cette année, à partir de 6 voeux exprimés par les élèves dans une base de 28 intervenants, comment automatiser la constitution des groupes en respectant au maximum leurs choix et en ayant des groupes de 5-6 élèves (environ 150 répartis sur les 28 ateliers)?

L'idée étant que la feuille excel-macro permette de renseigner un nombre variable d'élèves et/ou d'intervenants selon les années. Nous pouvons modifier le nombre de voeux si cela aide.

- Une fois les groupes constitués et sachant que :

  • Les élèves effectuent 6 rotations
  • Certains ateliers peuvent ne pas ou très peu être sollicités. (Peut on automatiser des choix imposés ? )

Comment mettre en place la rotation sur les 6 plages horaires sans que les groupes se télescopent ?

Je joins au message les bases voeux et métiers, si jamais vous pouviez me donner des pistes pour me simplifier la tâche car l

14forum-ddm.xlsx (34.90 Ko)

a fonction trie est pratique mais ne m'épargne pas beaucoup^^. Vous l'avez deviné, je découvre le site et je suis grand débutant dans tout cela.

Merci d'avance pour votre intérêt et chapeau bas à votre esprit de partage de passionné.

Bien cordialement,

Guillaume.

Bonjour,

Pourquoi ne pas utiliser le logiciel de création des emplois du temps pour les classes ?

C'est un problème très complexe que vous souhaitez résoudre, vous vous rendez compte du nombre de combinaisons/répartitions possibles des élèves par groupes ? C'est pour ça qu'il existe des logiciels fait pour.

Il y a un grand nombre de paramètres à considérer : la satisfaction globale, la capacité max des ateliers, l'organisation chronologique, la satisfaction "singulière" (si certains élèves ont globalement plus de leurs choix que les autres, ça va raler), l'importance des choix… Ce n'est pas du tout un problème linéaire, le temps de calcul peut devenir exponentiel avec l'augmentation du nombre d'élèves.

Si en plus vous utilisez Excel2007 c'est très (trop) limitant pour une solution "formules". Ci-après une approche VBA que j'ai trouvé sur le forum d'un problème similaire (sans l'emploi du temps) :

Répartir participants selon choix

En somme, je ne crois pas qu'Excel soit adapté à ce genre de cas. Mais si j'ai du temps je regarderai.

Bonjour Saboh,

D'abord merci pour votre célérité, vous confirmez ce que j'avais annoncé à ma direction sur la complexité du processus. Peu entendu face à notre enthousiasme:)

Nous voilà dans de beaux draps !

Je n'ai pas la main sur les logiciels des EDT et le principal adjoint qui maitrise bien l'outil a été dépêché sur un autre établissement pour palier à un arrêt. Et ne sera pas de retour avant la tenue du Forum. Je n'ai personnellement que excel2007, mais ma direction a une version plus récente.

"C'est pour ça qu'il existe des logiciels fait pour". Pour information et je transmettrai la possibilité à ma direction, auriez vous des références de logiciels capable de le faire ?

Sinon, à quelles conditions cela est-il plus réalisable sous excel ?

Pour l'étape de constituer les groupes :

Cela devient - il possible si on contente 2 voeux sur les 6 (évidemment le plus haut possible dans les souhaits, mais on fait au mieux ! ) ?

De même la capacité max des groupes est adaptable aussi, dans une certaine mesure. Disons jusqu'à 8 élèves.

Pour l'étape de créer une rotation sur 6 ateliers :

Est-ce plus facile si on ne constitue pas de groupe fixe ? mais des groupes qui se reforme à chaque rotation (chacun a son itinéraire)

J'ai trouvé sur le net quelques fichiers qui traitent de problèmes similaires dont le vôtre, (et celui que j'ajoute en pièce jointe),

9classeur1.xlsm (58.26 Ko)

j'essayerai davantage ces prochains jours, mais je ne suis pas sur d'arriver à faire les modifications VB ou autres pour l'adapter à nos paramètres.

J'avais bien perçu la complexité sans pour autant arriver à la rationnaliser, je n'aurai pas les compétences pour l'appréhender ces prochains temps, en tout cas suffisamment tôt. Voilà pourquoi je fais appel à des esprits plus capables. J'essaye de faire aboutir une démarche collective et bienveillante. Si vous trouvez effectivement un peu de temps, ce serait génial.

Bien cordialement,

Guillaume.

Bonjour Guillaume,

Merci pour votre retour, plein de bon sens. Personnellement je ne connais pas trop ces logiciels, ce n'est pas "ma branche". En regardant rapidement en ligne j'ai trouvé Gruepr qui m'a l'air très prometteur, mais probablement en anglais (open source cependant). Je pense que de manière générale, tous les programmes de répartition des élèves par classe sont adaptés à ce genre de problème car au fond c'est la même chose.

Après c'est un problème que je trouve passionnant, et j'espère qu'avec les autres contributeurs on pourra vous proposer une solution convenable sur Excel également.

Enfin pour la "satisfaction" je pense que 2/6 est facilement atteignable. En fait ça va directement jouer sur le temps de calcul : pour résoudre ces problèmes il n'y a pas de résolution "linéaire" il faut procéder à tâtons, en partant d'une/des répartition(s) aléatoire(s) puis on les optimise. Donc plus on optimise, plus ça prend de temps, et plus on augmente la satisfaction générale.

Je pense que faire des groupes flexibles est intéressant pour nous, mais ça peut créer du bazar sur les changements d'atelier.

Y a-t-il des critères supplémentaires à respecter ?

  • mixité M/F(/N)
  • ateliers de taille variable
  • doublons d'ateliers ? 150 élèves / 8 = 19 groupes mini -> 6 choix sur quel panel ? vous en donniez 28, si doublons d'ateliers, faut-il essayer de tous les remplir en faisant de plus petits groupes ?
  • Pourquoi ne pas faire une liste de choix plus large si on sait qu'on ne va probablement pas tout satisfaire, ou alors ajouter une "blacklist" si des élèves veulent éviter certains ateliers.

Bon, on discute un peu dans le vent, je vais commencer à prototyper quelque chose et je reviens vers vous si d'autres questions me viennent. Bonne journée.

Voici l'algorithme que je souhaite suivre

image

Bonjour Saboh,

Pour un soucis d'efficacité et de clarté dans nos échange, je n'exprimerai pas forcement dans mon message toute ma reconnaissance pour votre intérêt, mais considérez le comme acquis et sincère.

Quand vous dîtes
" ..ça peut créer du bazar sur les changements d'atelier."

Si vous parlez de la gestion des élèves dans les rotations, cela ne sera pas un problème. Par contre, si c'est un bazar dans la programmation du fichier, là, ca m'échappe !

Mon chef d'établissement et sa secrétaire sont dessus. Je n'ai pas vu ca manière de procéder mais d'après notre dernier échange, il a plutôt opté pour un parcours individuel. C'est plus flexible que les groupes fixes

Il part des 26 ateliers / pour chaque atelier, 6 créneaux (15min d'entretien + 5 minutes de rotation) / Il affecte les élèves à priori un par un dans les ateliers à chaque créneaux en tenant compte autant que possible de leur souhait. Je lui est suggéré qu'à partir du moment ou l'élève a déjà 2-3 voeux, il peut les ventiler sur les ateliers déficitaires.

Finalement les contraintes les plus fortes pour l'évènement sont (et je dirais dans cet ordre):

  • Les 6 rotations (correspond au timing de la journée= 1/ 2 pension , horaires de prise en charge des élèves, en l'occurrence 14h-16h30, mobilisation des personnels..etc)
  • Remplir les ateliers (il n'est pas question d'avoir inviter des parents, entreprises, organismes, qui parfois posent une journée pour donner un coup de main et qu'ils se retrouvent sans interlocuteurs^^)
  • Respecter un maximum les voeux élèves (mais c'est aussi l'occasion pour eux de découvrir = Découverte Des Métiers) dons pas grave s'il n'ont pas leur dessert préféré^^
  • La taille des groupes (au départ simple division 150/28 = 5-6 / peut très bien monter à 8 élèves mais c'est négociable)
  • Mixité n'est pas un critère que nous avions retenu, ni le respect des affinités de camaraderie.

J'oublie peut-être quelque chose..

Je comprends votre algorithme, c'est instinctivement ce que je voulais faire après avoir utilisé la fonction "trier" mais je ne connais pas assez les possibilités du programme, et j'ai buté déjà à cette étape. Il me manque aussi la capacité à reconnaitre des données et à y associer une action.. bref des choses qui semble basique à un chevronné du programme. Je sais que ce n'est pas si compliqué, qu'avec la connaissance et un peu de rigueur je pourrais aboutir.

Enfin, j'ai téléchargé le programme conseillé, je l'installerai au collège et voir un peut s'il peut répondre au besoin. L'idée de tout ca est de voir les possibles car le format de l'évènement est amené à évoluer d'année en année.. ou pas.

Merci pour tout. Cordialement,

Guillaume

Bonjour de nouveau,

Bon apparemment votre problème n'a pas attiré beaucoup de monde, c'est un gros travail aussi. Je vous propose ci-après un fichier prototype.

Une bonne chose est qu'au final, en supposant que les élèves répartissent uniformément leurs choix, la répartition est très facile. En effet en prenant une marge de 8 élèves par atelier, pour 150 élèves sur 28 ateliers j'arrive toujours à obtenir 100% de satisfaction. Mais évidemment cela dépendra surtout des choix des élèves, moi je suis parti d'une répartition des vœux 100% aléatoire, donc assez uniforme.

Pour le fonctionnement c'est assez simple (et adaptable bien entendu), je suis parti sur cela pour le moment :

En feuille "Choix", la liste des élèves et leurs choix.

En feuille "BDD", la liste des ateliers et leurs capacités. Seule les colonnes B et C sont importantes, le reste me sert à déboguer pour le moment.

En feuille output, leurs affectations après lancement de la macro. Pour déboguer j'ai affiché certains coefficients entre chaque affectation et fait quelques calculs de vérification mais on les enlèvera bien entendu. Pour info les coefficients représentent l'ordre de priorité des élèves à chaque affectation (+ petit = + prioritaire).

Je suis parti sur une programmation un peu complexe avec des "objets customs" pour représenter les élèves, ateliers et listes. Ca permet de tout gérer en mémoire et d'adapter facilement la présentation des entrées/sorties dans le classeur.

Dans l'attente de votre retour. Bonne journée.

Bonjour Saboh,

J'espère avoir bien rempli, mais je suis peut-être passé à coté de qq chose:

Jai copier les noms -prénoms dans l'onglet choix et les choix sous forme de numéros désignant les ateliers. Dans l'ordre de préférence de choix1 (le plus voulu) à choix 6 (le moins voir pas du tout voulu ^^) C'est pour ca que si les 2-3 premiers voeux aboutissent ce sera déjà pas mal.

Jai copier les noms d'ateliers dans la colonne B de l''onglet BDD, je n'ai pas modifier la taille de groupe.

J'ai lancé le bouton "créer une répartition"

La ventilation sur l'onglet output fonctionne bien et je vois bien la répartition uniforme et l'indice de satisfaction identique entre les élèves

0,090909091

Mais pour l'instant les élèves non pas les voeux demandés. Et effectivement la répartition uniforme n'est pas la réalité que nous vivrons, car par exemple, l'atelier le plus demandé cette année est la "cuisine". J'ai compris qu'en l'état du prototype, c'est normal.

Cuisinier

Si la tâche est trop importante, n'hésitez pas à me dire que vous arrêtez là :)

Je ne sais pas en plus comment aider. Merci encore.

Bonne fin de semaine.

Bonjour Guillaume, je ne suis pas sûr d'avoir bien compris.

Dans la feuille "Choix", les colonnes C à H sont, pour chaque élève, ses choix dans l'ordre de priorité (1 = top, 6 = moins).

Les ateliers indiqués (p.ex. dans le fichier que je vous ai envoyé), en C2 on a "Atelier 2", doivent correspondre aux noms des ateliers de la feuille BDD. C'était probablement pas clair mais les numéros n'importent pas, le code regarde directement le nom de l'atelier.

Je les ai appelés "Atelier i" pour tester mais vous pouvez mettre "cuisine", "yoga" ou "ski nautique" sans problème. Il faut juste que les noms correspondent. Je vous renvoie le fichier sans la colonne des numeros qui vous a probablement induit en erreur.

Si je suis à coté de la plaque, vous pouvez me renvoyer le fichier avec le problème, en enlevant les noms bien entendu.

Pour la distribution non uniforme je m'en doutais, et normalement le code devrait tout de meme chercher un optimum.

UPDATE : excusez moi je dois etre complètement fou mais je n'avais pas vu le fichier joint à votre premier message.

Alors ne vous inquiétez pas je peux faire fonctionner la macro avec les numéros plutot que les noms d'ateliers. Mais pour l'instant j'ai gardé ma structure "pour tester".

Voyez ci-joint j'ai importé vos données et relancé la macro.

J'avais un plantage pour les élèves qui ont inséré plusieurs fois le meme voeux/les absents. J'ai manuellement corrigé cela temporairement mais je pourrai l'ajouter dans le code. J'obtiens une bonne répartition.

Pour l'interprétation des résultats je vais essayer de coller avec votre modèle, en regroupant les élèves.

Voir ci-joint en attendant.

Bonjour de nouveau,

J'ai repris l'algorithme pour l'adapter à votre fichier que je n'avais pas vu. Veuillez trouver ci-joint le résultat.

J'ai besoin de donner un ID aux élèves pour les homonymes car pas de nom de famille.

Je n'ai pas encore créé l'algorithme pour "regrouper" les résultats par groupes et par rotation. Cependant :

Ceci est un travail qui peut aussi etre fait sans VBA via powerquery/TCD ou formules. Je vous propose, si la répartition vous convient, de créer un nouveau fil sur le forum en demandant "j'ai ce tableau, comment regrouper mes résultats pour obtenir [le tableau que vous voulez]". Je n'aurai pas le temps de regarder cela ce weekend.

En espérant que le résultat soit convenable, bon weekend.

13forum-ddm.xlsm (120.88 Ko)

Bonjour,

Pardon pour les délais mais je suis débordé, c'est un gros temps fort cette période en milieu scolaire. Je regarde tranquillement, de toute façon l'idée est d'aboutir à un ou plusieurs outil qui facilitent la tâche pour l'année prochaine. J'ai un collègue qui semble bien connaitre excel je vais lui transmettre vos propositions.

Quoi qu'il en soit un grand grand merci !

Bonjour,

Avec l'approche des vacances j'imagine oui. Pas de soucis, le dernier fichier est le plus à jour, le reste peut être oublié.

Bon courage !

bonjour le fil,

@Saboh12617, peut-on donner le choix "6" d'une personne pendant la rotation "2" ?

Bonjour Bart,

Oui, à chaque rotation, pour chaque élève, sa liste des choix est parcourue dans l'ordre de ses priorités (les choix déjà assignés sont retirés de la liste).

Donc pour un élève, supposons que son choix 1 soit attribué à la rotation 1. Si tous les ateliers qu'il a mis en choix 2,3,4,5 sont déjà remplis quand la boucle arrive sur lui, alors ce sera son choix 6 qui est attribué.

Si le choix 6 est aussi rempli, alors il est attribué dans l'atelier le moins rempli.

Je comprends que le code soit difficile à appréhender, surtout que je ne l'ai pas encore "simplifié". Mais ce processus se trouve dans le Sub AssignAWish de la classe ListingElv.

Public Sub AssignAWish(Ateliers As Scripting.Dictionary)
  ' assignation des choix

  Dim wishI As Long, i As Long, j As Long, AteJ As Long, gotWish As Boolean
  Dim currStudent As Eleve
  ' parcours des eleves
  For i = 0 To Me.Count - 1
    ' temp
    Dim val As Long
    Set currStudent = Me.EleveAt(i)
    val = Me.EleveAt(i).outList.Count

    gotWish = False
    ' parcours de ses souhaits
    With currStudent.wishlist
      For wishI = 0 To .Count - 1
        ' on verifie qu'on n'est pas sur un dummy
        If Ateliers.Exists(.Item(wishI)) Then
          'assignation du premier souhait possible dans sa liste
          If Not Ateliers(.Item(wishI)).IsFull Then
            ' increment du nb eleves dans l'atelier
            Ateliers(.Item(wishI)).AddStudent
            ' suppression du souhait dans la liste de l'etudiant et
            ' ajout dans sa liste d'affectation
            currStudent.AssignAtelier .Item(wishI)
            ' sortie de la boucle sur les ateliers
            gotWish = True
            Exit For
          Else
            'Debug.Print "eleve n°" & i, Ateliers(.Item(wishI)).nom & " plein"
          End If
        End If
      Next wishI
    End With

    If Not gotWish Then
      ' gestion du cas ou tous les ateliers voulus sont deja pleins
      ' => assignation dans l'atelier le moins plein
      ' Recherche de l'atelier le moins plein & non deja fait par l'eleve
      AteJ = 0
      For j = 0 To Ateliers.Count - 1
        If Not currStudent.DidAtelier(CLng(Ateliers.Keys()(j))) And _
         CLng(Ateliers.Keys()(j)) <> -1 Then
          If Ateliers.Items()(j).Filling < Ateliers.Items()(AteJ).Filling Then AteJ = j
        End If
      Next j
      ' Assignation dans cet atelier
      Ateliers.Items()(AteJ).AddStudent
      currStudent.AssignAtelier CLng(Ateliers.Keys()(AteJ))
    End If

    If Not (currStudent.outList.Count > val) Then
      currStudent.AssignAtelier i     ' "Temps libre_" & i
    End If
  Next i                                         ' prochain eleve
End Sub

re,

@saboh12617, la formule de la colonne J de "outputsimple" donne des valeurs 1 à 6, je pense que cela est faux, ne faut-il pas prendre 6 à 1 ?

il y a des doublons, voir 25, "Lila" , 2 fois le 26.

Correct ?

re,

un essai

le max niveau de "satisfaction" est 92.9% et j'atteins 90.1%

9forum-ddm.xlsm (193.47 Ko)

Bonjour Bart,

Sur mon fichier original j'ai relancé 15x la macro et je n'ai jamais eu de doublons… Peut etre la chance mais ce que tu avances m'étonnes un peu, j'avais fait attention à ce point normalement.

Pour la formule du calcul de la satisfaction en colonne J par contre tu as raison, les coefficients sont inversés il faut bien donner 6 au premier voeux et 1 au dernier.

J'attendais que tu tombes sur ce fil, je suis content tes remarques sont toujours intéressantes !

Qu'est-ce que cow_18 ? le nom d'un algorithme ? En tout cas il semble meilleur que le miens car je plafonne, sur mon jeu de données, à 90 %.

re, bonjour Saboh12617,

merci pour les remarques,

maintenant une suboptimalisation, les capacités sont paramétrisés par rotation, les 3 plus petites n'ont que 2 rotations de 8 personnes et les 3 plus grandes ont 9-10 personnes pa rotation. (Naturellement, le graphique avec vos résutats ne sert plus à comparer les 2.

7forum-ddm.xlsm (192.96 Ko)

Chez moi quand je clique sur macro ça tourne indéfiniment, le code boucle je crois qu'il manque un stop au niveau de "l'erreur critique atelier plein" car ça revient dessus en continue mais sans s'arreter.

Si tu as le temps je veux bien que tu m'expliques dans les grandes lignes ta méthode de réparition. Si je comprends bien tu pars un peu "à l'envers", en partant des ateliers que tu remplis alors que je partais des élèves. Mais pourquoi limiter les rotations des ateliers, surtout les plus demandés ? C'est pour éviter les ateliers vides ? Ne perds-tu pas en satisfaction en faisant ainsi ?

Rechercher des sujets similaires à "forum metiers"