XL 2016 Répartition équitable de binômes

halecs93

XLDnaute Impliqué
Bonjour,

Je travaille toujours sur un fichier me permettant de répartir le plus équitablement possible des personnes. Le but étant de créer des binômes différents à affecter les samedis.

J'ai, je crois, pas mal avancé, mais je n'arrive pas à finaliser cet aspect "équitable".

Quelqu'un aurait une proposition plus fiable que la mienne ?

Un grand merci.

1722349327458.png
 

Pièces jointes

  • PLANNING DES SAMEDIS - fonctionnel ter XLD.xlsm
    69.3 KB · Affichages: 13
Solution
La macro avec 3 Dictionary :
VB:
Sub Tirages()
Dim tablo As Range, nNom%, delai%, dferie As Object, c As Range, dinterdit As Object
Dim d As Object, col%, r1%, r2%, txt$, rejet As Boolean, ecart%
Set tablo = [Tableau1] 'tableau structuré
nNom = tablo.Rows.Count
delai = 42 'au moins 42 jours avant de réutiliser un nom
'---jours fériés à éliminer---
Set dferie = CreateObject("Scripting.Dictionary")
For Each c In [feries]
    If Weekday(c) = 7 Then dferie(c.Value) = ""
Next c
'---binômes interdits---
Set dinterdit = CreateObject("Scripting.Dictionary")
For Each c In [Tableau5].Columns(1).Cells
    dinterdit(c & vbLf & c(1, 2)) = ""
    dinterdit(c(1, 2) & vbLf & c) = ""
Next c
Application.ScreenUpdating = False
Randomize
Set d =...

crocrocro

XLDnaute Occasionnel
Bonjour à tous,
en pj une solution avec le solveur
quelques explications :
j'ai créé 2 feuilles
la 1ère liste les noms des personnes avec leur id (numérique pour le solveur) , le nb de samedis affectés, attendus et l'écart en valeur absolue.
La somme des écarts srera l'objectif du solveur (à minimiser)
la 2ème est une transposition des samedi avec pour 2ème colonne l'id du nom affecté (calculé par le solveur)
en D1 l'écart actuel (cf. commentaire de la cellule)
en D3 formule donnant le nombre de valeurs (également utilisé par le solveur)
copie d'écran des règles du solveur
Si ce n'est pas déjà fait, ajouter le solveur (option -> compléments)
Pour lancer le solveur : Données -> Solveur -> résoudre.
L'arrêter au bout d'un certain temps (pour ce calcul une dizaine de secondes).
Il reste un travail de mise en forme pour mettre à jour le planning ...


1722410910272.png


1722410887365.png
 

Pièces jointes

  • PLANNING DES SAMEDIS crocrocro.xlsm
    86.3 KB · Affichages: 1
Dernière édition:

halecs93

XLDnaute Impliqué
Bonjour à tous,
en pj une solution avec le solveur
quelques explications :
j'ai créé 2 feuilles
la 1ère liste les noms des personnes avec leur id (numérique pour le solveur) , le nb de samedis affectés, attendus et l'écart en valeur absolue.
La somme des écarts srera l'objectif du solveur (à minimiser)
la 2ème est une transposition des samedi avec pour 2ème colonne l'id du nom affecté (calculé par le solveur)
en D1 l'écart actuel (cf. commentaire de la cellule)
en D3 formule donnant le nombre de valeurs (également utilisé par le solveur)
copie d'écran des règles du solveur
Si ce n'est pas déjà fait, ajouter le solveur (option -> compléments)
Pour lancer le solveur : Données -> Solveur -> résoudre.
L'arrêter au bout d'un certain temps (pour ce calcul une dizaine de secondes).
Il reste un travail de mise en forme pour mettre à jour le planning ...


Regarde la pièce jointe 1201260

Regarde la pièce jointe 1201259
Merci... je regarde.
 

crocrocro

XLDnaute Occasionnel
Je complète mon post précédent :
si certains samedis sont déjà affectés, il est possible de ne faire travailler le solveur que sur les lignes non-préaffectées :
Une contrainte cependant, la plage doit être avec des cellules contigües (par exemple $B$10: $B$30), il faut donc trier le tableau pour respecter la contrainte
 

halecs93

XLDnaute Impliqué
Je complète mon post précédent :
si certains samedis sont déjà affectés, il est possible de ne faire travailler le solveur que sur les lignes non-préaffectées :
Une contrainte cependant, la plage doit être avec des cellules contigües (par exemple $B$10: $B$30), il faut donc trier le tableau pour respecter la contrainte
Oui, en effet... l'idée est intéressante, mais contraignante...
 

crocrocro

XLDnaute Occasionnel
si certains samedis sont déjà affectés, il est possible de ne faire travailler le solveur que sur les lignes non-préaffectées :
Une contrainte cependant, la plage doit être avec des cellules contigües (par exemple $B$10: $B$30), il faut donc trier le tableau pour respecter la contrainte
Si on ne veut pas trier, cela impose de dupliquer toutes les contraintes du solveur par plage ed cellules contigües.
Dans l'exemple ci-dessous $B2:$B9 et $B21:$B31.
Ce qui est finalement plus lourd que le tri où l'on peut trouver des astuces.
A noter : Le Solveur met beaucoup plus de temps pour trouver une solution. Logique puisque qu'on lui contraint certaines valeurs.

1722430047959.png
 

Dranreb

XLDnaute Barbatruc
L'utilisation d'un ListeAléat conduirait à des bouts de codes plus courts parce que c'est une petite boite noire bien docile. Je ne me verrais plus écrire autrement une programmation en utilisant un. Vous pourriez y puiser au fur et à mesure, s'il en reste, un numéro de personne et l'en évacuer aussitôt. S'il n'en reste plus faites lui d'abord établir un nouveau mélange.
Avec ce processus vous ne devriez plus avoir d'écart supérieur à 1 entre les samedis effectués par des personnes différentes, parce que vous les aurez épuisées toutes avant de toutes les reconsidérer dans un ordre différent.
 
Dernière édition:

halecs93

XLDnaute Impliqué
L'utilisation d'un ListeAléat conduirait à des bouts de codes plus courts parce que c'est une petite boite noire bien docile. Je ne me verrais plus écrire autrement une programmation en utilisant un. Vous pourriez y puiser au fur et à mesure, s'il en reste, un numéro de personne et l'en évacuer aussitôt. S'il n'en reste plus faites lui d'abord établir un nouveau mélange.
Avec ce processus vous ne devriez plus avoir d'écart supérieur à 1 entre les samedis effectués par des personnes différentes, parce que vous les aurez épuisées toutes avant de toutes les reconsidérer dans un ordre différent.
Hmmm pas certain de tout saisir. Mais que faudrait-il modifier concrètement dans mon code ?
 

Dranreb

XLDnaute Barbatruc
La 1ère chose c'est de glisser/déplacer le module de classe ListeAléat vers le projet VBA de votre classeur. Ensuite étudiez sa propriété Count et ses méthodes Init, Aléat, et Supprimer (les commentaires explicatifs d'utilisation, surtout, pas le code).
 

Pièces jointes

  • ListeAléat.xlsm
    634.3 KB · Affichages: 3

Statistiques des forums

Discussions
313 866
Messages
2 103 082
Membres
108 521
dernier inscrit
manouba