Bonjour,
J'ai un petit pb de dénombrement à vous soumettre.
J'ai 6 salariés, et chaque jour, 3 salariés doivent travailler. Chaque salarié peut travailler au plus 4 jours. Combien de plannings différents peut-on créer sur une semaine ?
En faisant la combinaison de 3 parmi 6, j'ai le nombre de plannings possibles sur une journée. En multipliant par 7, j'ai le nombre de plannings sur une semaine, sans prise en compte des jours non travaillés. Mais comment enlever les plannings incluant des salariés bossant 5,6 ou 7 jours ?
Merci
malou edit > ** sujet transféré en détente**
A vrai dire, je ne sais pas jugé le niveau de cet exercice, d'où la difficulté de le classer dans le bon forum. Mais la solution m'intéresserait.
On peut noter les salariés si avec i de 1 à 6.
Et les jours de la semaine jk avec k de 1 à 7.
En supposant qu'on travaille le dimanche.
Il s'agit de trouver de combien de manières on peut choisir 21 couples (si, jk).
On peut remarquer que tous les salariés travaillent au moins un jour.
C'est peut-être une histoire du nombre de manières d'écrire 21 comme une somme de 6 termes ; chaque terme pouvant être égal à 1, 2, 3 ou 4.
Je ne vais pas pouvoir chercher beaucoup plus aujourd'hui.
Que dirais-tu de mettre ce sujet dans le forum "Détente" ?
As-tu inventé l'énoncé ?
Sinon, d'où vient-il ?
salut
une organisation avec un tableau à double entrée permet de réfléchir à la solution :
L M Me J V S D
1
2
3
4
5
6
il faut alors mettre quatre croix par ligne et trois croix par colonne
une fois un planning convenable trouvé alors tu pourras travailler avec des permutations (pour les travailleurs et pour les jours) pour avoir le nombre de plannings différents
Oui pas de soucis, pour déplacer : mais comment puis-je faire ?
C'est un pb envoyé par un étudiant en maths, je ne sais pas s'il a créé lui-même. Je le trouve intéressant.
Pour le déplacer, je peux le faire en tant que modérateur.
Cependant, je vais te laisser d'abord exploiter la piste de carpediem, que je salue 
de toute façon ça ne me semble pas facile
L M Me J V S D
1 x x x x
2 x x x x
3 x x x x
4 x x x x
5 x x x
6 x x
cet exemple permet de voir une première chose
si quatre salariés travaillent 4 j alors il reste 3 j pour l'un et deux jours pour l'autre soit une répartition : 4 4 4 4 3 2
ce qui signifie qu'il y a aussi les répartitions en jours par salarié : 4 4 4 4 4 1 et 4 4 4 3 3 3 (il est aisé d'en obtenir une à partir de mon exemple
prenons la répartitions : 4 4 4 3 3 3
il faut donc choisir 3 salariés travaillant 4 j et 3 salariés travaillant 3 j : c'est aisé à déterminer
pour chacune des ces répartitions il reste maintenant à répartir les jours ... et c'est là que sa se complique
choisir 4 j pour le premier salarié est immédiat (et peut-être même aussi pour le deuxième à 4j voire même les deux à 4 j)
mais ensuite le fait de n'avoir que trois salariés par jour va évidemment conduire à des contraintes et des relations de dépendance
maintenant vu la taille des données une autre façon de faire est d'écrire un script qui dénombre toutes les issues
je ne pense pas qu'il soit compliqué en soit et nous avons un maitre en la matière : littlefox
Bonjour,
J'arrive à la même conclusion que carpediem
Pour ma part,je trouve 21168 plannings possibles..
@dpi
Ta réponse est incorrecte. Pour les 4 premiers jours, on peut placer 3 des 6 travailleurs comme on veut.
On a 20 possibilités par jour donc 20^4 possibilités pour les 4 premiers jours. Il y a au moins une possibilité pour les 3 jours restants.
On a donc au moins 20^4 > 21168 plannings.
Je n'ai pas trouvé de solution non-calculatoire. Il y a 20^7 plannings avec 3 travailleurs par jour. Parmi ceux-ci, j'en compte 125030500 où aucun ne travaille plus de 4 jours. Soit ~9.77%.
Construire explicitement les 20^7 plannings et les vérifiers est possible mais long.
On peut raccourcir les calculs en complétant les plannings jour par jour et en revenant en arrière dès qu'un travailleur dépasse 4 jours.
On peut encore faire mieux en remarquant que seul le nombre de jours restant par travailleur est important. En effet, si on doit encore travailler 3 jours et qu'il reste (1, 4,0,2,1,0) jours pour chaque travailleurs, on aura le même nombre de plannings que s'il restait (4,2,1,1) jours.
On final il reste moins de (4+6-1)!/(6!(4-1!) = 84 possibilités à compter. Ce qui est immédiat. On pourrait presque le faire à la main
C'est ce que j'implémente ici:
from functools import cache
from itertools import combinations
def solve(workers: int, days: int, workers_per_day: int, max_days_per_worker: int):
total_free_worker_days = workers * max_days_per_worker - days * workers_per_day
@cache
def count_plannings(days_left_per_worker: tuple[int, ...]):
if sum(days_left_per_worker) == total_free_worker_days:
return 1
count = 0
for ws in combinations(range(len(days_left_per_worker)), workers_per_day):
new_days_left_per_worker = list(days_left_per_worker)
for w in ws:
new_days_left_per_worker[w] -= 1
new_days_left_per_worker.sort()
new_days_left_per_worker = tuple(d for d in new_days_left_per_worker if d > 0)
count += count_plannings(new_days_left_per_worker)
return count
return count_plannings((max_days_per_worker,) * workers)
def main():
print(solve(workers=6, days=7, workers_per_day=3, max_days_per_worker=4))
if __name__ == '__main__':
main()
Un exemple faisable à la main pour montrer comment ça marche: Combien de plannings existe-t-il pour 4 travailleurs sur 3 jours avec 2 travailleurs par jour et un maximum de 2 jours par travailleurs?
On cherche F(2,2,2,2):
F(2,2,2,2) = 6F(2,2,1,1) # On a 6 possibilités pour choisir nos deux travailleurs du jour.
F(2,2,1,1) = 1F(1,1,1,1) + 4F(2,1,1) + 1F(2,2)
F(1,1,1,1) = 6F(1,1)
F(1,1) = 1
=> F(1,1,1,1) = 6*1 = 6
F(2,1,1) = 2F(1,1) + F(2)
F(2) = 1
=> F(2,1,1) = 2*1+1 = 3
F(2,2) = 1F(1,1) = 1
=> F(2,2,1,1) = 1*6+4*3+1*1 = 19
=> F(2,2,2,2) = 6*19 = 114
On a compté 7 possibilités.
Il y a (3+4-1)!/(4!(3-1)!) = 15 combinaisons avec répétition de 3 jours restants répartis sur 4 travailleurs. On doit en retirer ceux dont la somme est impaire et ceux dont la somme est inférieure à 2.
Ce qui me fait me rendre compte qu'il y a une erreur dans mon calcul des possibilités pour le problème précédent: (5+6-1)!/(6!(5-1)!) = 210. Ça reste petit. On doit en retirer ceux dont la somme n'est pas multiple de 3. Et ceux dont la somme est inférieure à 4*6-7*3 = 3. Donc on a ~70 possibilités à compter.
En pratique la cache contient seulement 58 entrées:
Cliquez pour afficher
).

Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :