Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Exercice planification avec le solveur

edisonalva

XLDnaute Nouveau
Bonjour à tous,

Je cherche à déterminer pour un exercice à l’aide du solveur pour les employés d’un service les jours pendant lesquels ils seront au repos sur une semaine.
Les repos sont affectés sur des périodes de deux jours consécutifs uniquement (pas de repos isolés)

Mes contraintes :
- Couverture exacte du besoin RH
- Changement de vacation de type ordonné : Enchaînements interdits: Soir-Matin, Nuit-Soir, Nuit-Matin

Mes contraintes flexibles:
- Interdiction d’affecter un repos isolé
- Répartition équitable des repos

Je n'arrive pas à trouver la solution pour faire interdire les enchaînement. Comment faire pour mettre le minimum de contrainte dans le Solveur? Pouvez vouz m'aidez SVP? Merci d'avance
 

Pièces jointes

  • excercice medecin.xlsx
    19.4 KB · Affichages: 74

ODVJ

XLDnaute Impliqué
Bonsoir à tous,

Pour la petite histoire, et aussi pour répondre à la question sur le solveur posée par notre ami disparu edisonalva, il est possible de résoudre le problème via un simplex.
Perso je n'ai pas réussi avec excel parce que son solveur est trop limité.
Même avec solverstudio pour excel (c'est gratuit, essayez-le!), je n'ai pas réussi (pour l'instant).

En passant par glpk (plus précisément : gusek parce qu'il est plus sympa), ça fonctionne, il faut 4 à 5 secondes pour obtenir un résultat qui satisfait toutes les contraintes : les 21, 31, 32, 2 repos consécutifs et un repos complémentaire pour certains employés.

Il n'y a que 2 contraintes dans le modèle parce que les données intègrent les contraintes d’enchaînements et de repos.

C'est pour cela que je parlais de 252 combinaisons il y a quelques temps. A l'époque je ne considérais que les repos de 2 jours consécutifs dans une semaine.
En ajoutant maintenant une journée de repos volante, il reste 1 116 combinaisons.
Quand je parle de combinaison, je veux dire que 7 jours avec 4 possibilités (repos, matin, soir et nuit) ce n'est rien d'autre que de l'écriture en base 4 de nombres allant de 0 à 16 383.
Quelques filtres sur les 21, 31 et 32 diminuent les 16 384 combinaisons.
Une formule pour isoler les combinaisons valides en terme de repos et on aboutit à 1 116 combinaisons valides et utilisables.

A partir de là, une variable binaire V(i,j) de 1 116 par 12 qui vaut 1 quand l'employé j utilise la combinaison i.
i est un indice qui renvoie à un entier entre 0 et 13 383 dont l'écriture en base 4 sur 7 positions décrit la semaine de travail de l'employé j.
La contrainte sur cette variable binaire c'est que chaque colonne (chaque employé donc) ne contient qu'un seul 1 (il n'a qu'un seul emploi du temps).
Des employés différents pouvant avoir le même emploi du temps, il n'y a pas de contraintes sur les lignes.

Il suffit ensuite d'ajouter un tableau à 3 dimensions qui binarise le tableau 1 116 par 7 des écritures en base 4 des combinaisons valides. La 3ème dimension est celle des postes : matin, soir, nuit.
Si une écriture contient un 3, il y aura un 1 positionné en nuit au même emplacement que le 3. Si c'est une 2 ou un 1, le 1 sera positionné au niveau soir ou matin.

L'intérêt d'une complication du modèle de données, c'est que ça simplifie le travail sur les contraintes tout en gardant la propriété linéaire du modèle.

Bon, ça doit faire 4 ou 5 paragraphes que je vous embrouille et ça n'est plus vraiment de l'excel.
Donc en résumé, c'est possible avec un solveur.

Pour ton travail, job75, qu'est-ce que tes macros sont denses !!!
A chaque fois que je commençais à les comprendre (grâce au pas à pas pour voir leur fonctionnement) ....... tu envoyais une nouvelle version.....

J'ai comme l'impression que tu pourrais améliorer le résultat en retravaillant le traitement des valeurs qui suivent un zéro.

Tu travailles par colonne alors que moi je l'avais envisagé par ligne.
En prenant manuellement ton approche, il est assez facile d'obtenir un résultat qui respecte toutes les contraintes (ou alors j'ai eu un coup de bol).
J'ai rempli les 1, les 2 et les 3 puis j'ai mis des zéros sur les employés non affectés.
J'ai tout de suite mis un double zéro pour ces derniers de façon à les garder pour les 5 autres jours.
Je me suis arrangé pour que les 3 soient sur la même ligne ou avant un repos.
Pour les 2, c'est presque la même chose mais en plus lâche.
Avec un ou deux rétropédalage vers la fin, j'ai fini par obtenir un résultat conforme.

En revanche, pour l'automatiser, c'est beaucoup plus compliqué.
C'est pour cela que je me suis penché sur le solveur.
C'est lui qui fait le boulot.


Cordialement
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…