Inscription / Connexion Nouveau Sujet
Niveau exercices
Partager :

Dénombrement

Posté par
joquetino
05-09-24 à 13:27

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**

Posté par
Sylvieg Moderateur
re : Dénombrement 05-09-24 à 13:52

Bonjour joquetino,
Merci de renseigner ton niveau dans ton profil.

Posté par
joquetino
re : Dénombrement 05-09-24 à 13:54

Bonjour,

C'est fait,

Merci

Posté par
Sylvieg Moderateur
re : Dénombrement 05-09-24 à 13:59

Merci
Es-tu certain que c'est un exercice niveau terminale ?

Posté par
joquetino
re : Dénombrement 05-09-24 à 14:01

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.

Posté par
Sylvieg Moderateur
re : Dénombrement 05-09-24 à 14:43

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 ?

Posté par
carpediem
re : Dénombrement 05-09-24 à 14:54

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

Posté par
joquetino
re : Dénombrement 05-09-24 à 14:55

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.

Posté par
Sylvieg Moderateur
re : Dénombrement 05-09-24 à 15:08

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

Posté par
joquetino
re : Dénombrement 05-09-24 à 16:26

Ok merci. Malgré l'aide de Carpediem, je dois reconnaitre que je sèche un peu ...

Posté par
carpediem
re : Dénombrement 05-09-24 à 18:01

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

Posté par
dpi
re : Dénombrement 05-09-24 à 18:27

Bonjour,
J'arrive à la même conclusion que carpediem
Pour ma part,je trouve  21168 plannings possibles..

Posté par
joquetino
re : Dénombrement 06-09-24 à 09:19

Bonjour,

Merci d'avoir réfléchi sur cet exo, qui était loin d'être trivial au final.

Bonne journée.

Posté par
LittleFox
re : Dénombrement 06-09-24 à 11:00

@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.

Posté par
LittleFox
re : Dénombrement 06-09-24 à 11:01

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()

Posté par
LittleFox
re : Dénombrement 06-09-24 à 11:47

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.

Posté par
LittleFox
re : Dénombrement 06-09-24 à 12:44

En pratique la cache contient seulement 58 entrées:

 Cliquez pour afficher


Petite note: il serait facile de modifier le code pour accepter un nombre max de jours différents pour chaque travailleurs (les 4/5 par exemple ).
On pourrait aussi tenir compte d'un nombre de travailleurs différent pour chaque jour

Posté par
carpediem
re : Dénombrement 06-09-24 à 19:07

LittleFox : merci et



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1706 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !