IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

danielhagnoul

Version Julia de l'algorithme pour planifier les horaires de travail en équipes

Note : 3 votes pour une moyenne de 1,00.
par , 05/10/2021 à 13h03 (1741 Affichages)
  • Le 2021-10-05, j'utilise Julia_1.6.1 sur VS_Code_1.60.2. Ordinateur : W10 Pro, i9-10900F.
  • Préalables, mes billets précédents sur Julia sont supposés connus et assimilés.


Source de l'algorithme : https://www.developpez.net/forums/bl...avail-equipes/

Puisque Julia travaille de 1:n et non de 0:n, on doit modifier indice_horaire = mod(i + j, 4) en indice_horaire = mod(i + j - 2, 4) + 1

Exemples utilisant l'algorithme modifié
Code Julia : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
using Base, Dates
 
# on défini les struct
struct Personne
    nom::String
    prénom::String
end
 
struct Equipe
    indice::Int16
    personne_1::Personne
    personne_2::Personne
    personne_3::Personne
end
 
struct Année
    an::Int16
    indice_rotation::Array{Int16}
end
 
struct tranche_horaire
    nom::String
    durée::Int16
    tranche::String
end
 
struct Result
    indice_équipe::Int16
    date::DateTime
    indice_horaire::Int16
end
 
# on personalise l'affichage
Base.show(io::IO, p::Personne) = println(io, " $(p.nom) $(p.prénom) ")
Base.show(io::IO, e::Equipe) = println(io, " Equipe $(e.indice) : $(e.personne_1), $(e.personne_2), $(e.personne_3) ")
Base.show(io::IO, t::tranche_horaire) = println(io, " $(t.nom) $(t.tranche) ")
 
# on construit l'indice de rotation pour un an
function construire_indice_rotation(nombre_jours_an)
    n = 1
    r = [1]
    for i in 1:1:nombre_jours_an
        if n > nombre_jours_an - 1
            break
        end
        push!(r, r[i] + mod(i, 2))
        n = n + 1
    end
    pushfirst!(r, 1)
    return r
end
 
# on utilise la version Julia de l'algorithme
function indice_horaire(indice_équipe, indice_rotation)
    return mod(indice_équipe + indice_rotation - 2, 4) + 1
end
 
function main()
 
    # on défini les tranches horaires
    H1 = tranche_horaire("Matin", 8, "de 5 h à 13 h")
    H2 = tranche_horaire("Après_midi", 8, "de 13 h à 21 h")
    H3 = tranche_horaire("Nuit", 8, "de 21 h à 5 h")
    H4 = tranche_horaire("Repos", 0, "toute la journée")
 
    Hn = [H1, H2, H3, H4]
 
    # on défini les équipes
    équipe_1 = Equipe(
        1,
        Personne("Dupond", "Jean"), 
        Personne("Lagarde", "Hector"), 
        Personne("Durand", "Henri")
    )
 
    équipe_2 = Equipe(
        2,
        Personne("Dupond", "Pierre"), 
        Personne("Lagarde", "François"), 
        Personne("Durand", "Jean Paul")
    )
 
    équipe_3 = Equipe(
        3,
        Personne("Dupond", "Henri"), 
        Personne("Lagarde", "Jean"), 
        Personne("Durand", "Hector")
    )
 
    équipe_4 = Equipe(
        4,
        Personne("Dupond", "François"), 
        Personne("Lagarde", "Jean Paul"), 
        Personne("Durand", "Pierre")
    )
 
    En = [équipe_1, équipe_2, équipe_3, équipe_4]
 
    # le nombre de jour en 2021
    days_in_year_2021 = daysinyear(2021)
 
    # on défini l'année 2021
    an_2021 = Année(
        2021,
        construire_indice_rotation(days_in_year_2021)
    )
 
    # le premier janvier de 2021
    date_2021_1_1 = DateTime(2021, 1, 1)
 
    # exemple, calcul des horaires pour l'équipe 2
    let r = []
 
        println("==== Exemple 1 ====")
 
        # on traite les 15 premiers jours de l'année
        for k in 1:1:15 
            push!(r, [date_2021_1_1 + Day(k-1), 
            indice_horaire(équipe_2.indice, an_2021.indice_rotation[k])])
        end
 
        # on affiche le résultat
        for k in r
            println("$(k[1]) : indice_horaire $(k[2])")
        end
 
        #=
            2021-01-01T00:00:00 : indice_horaire 2
            2021-01-02T00:00:00 : indice_horaire 2
            2021-01-03T00:00:00 : indice_horaire 3
            2021-01-04T00:00:00 : indice_horaire 3
            2021-01-05T00:00:00 : indice_horaire 4
            2021-01-06T00:00:00 : indice_horaire 4
            2021-01-07T00:00:00 : indice_horaire 1
            2021-01-08T00:00:00 : indice_horaire 1
            2021-01-09T00:00:00 : indice_horaire 2
            2021-01-10T00:00:00 : indice_horaire 2
            2021-01-11T00:00:00 : indice_horaire 3
            2021-01-12T00:00:00 : indice_horaire 3
            2021-01-13T00:00:00 : indice_horaire 4
            2021-01-14T00:00:00 : indice_horaire 4
            2021-01-15T00:00:00 : indice_horaire 1 
       =#
    end
 
    # exemple, calcul de l'horaire du 2021-11-17 pour l'équipe 2
    let date_t = DateTime(2021, 11, 17), day_of_year = dayofyear(date_t)
 
        println("==== Exemple 2 ====")
 
        # indice horaire pour l'équique 2 pour le jour day_of_year/days_in_year_2021
        indice_horaire_2 = indice_horaire(équipe_2.indice, an_2021.indice_rotation[day_of_year])
 
        println("$(équipe_2) \n $(date_t) : $(Hn[indice_horaire_2])")
 
        #=
            Equipe 2 : Dupond Jean, Lagarde Hector, Durand Henri 
 
            2021-11-17T00:00:00 :  Après_midi de 13 h à 21 h 
        =#
    end
 
    # exemple, calcul des horaires du 2021-06-01 au 2021-07-15 pour toutes les équipes
    let date_t_1 = DateTime(2021, 6, 1),
        day_of_year_1 = dayofyear(date_t_1),
        date_t_2 = DateTime(2021, 7, 15), 
        day_of_year_2 = dayofyear(date_t_2)
 
        println("==== Exemple 3 ====")
 
        # r contiendra un array de Result
        r = []
 
        for E in En
            for D in day_of_year_1:1:day_of_year_2
                push!(r, Result(E.indice, date_2021_1_1 + Day(D-1), indice_horaire(E.indice, an_2021.indice_rotation[D])))
            end
        end
 
        for k in r
            println("Equipe $(k.indice_équipe) \n $(k.date) : $(Hn[k.indice_horaire])")
        end
 
        #=
            Equipe 1
            2021-06-01T00:00:00 :  Repos toute la journée
 
            Equipe 1
            2021-06-02T00:00:00 :  Matin de 5 h à 13 h
 
            Equipe 1
            2021-06-03T00:00:00 :  Matin de 5 h à 13 h
 
            Equipe 1
            2021-06-04T00:00:00 :  Après_midi de 13 h à 21 h
 
            Equipe 1
            2021-06-05T00:00:00 :  Après_midi de 13 h à 21 h
 
            Equipe 1
            2021-06-06T00:00:00 :  Nuit de 21 h à 5 h
            ... 
 
            Equipe 4
            2021-07-12T00:00:00 :  Repos toute la journée
 
            Equipe 4
           2021-07-13T00:00:00 :  Repos toute la journée
 
           Equipe 4
           2021-07-14T00:00:00 :  Matin de 5 h à 13 h
 
           Equipe 4
           2021-07-15T00:00:00 :  Matin de 5 h à 13 h
        =#
 
    end
 
    return
end
 
@time main() # 0.135841 seconds (282.31 k allocations: 16.842 MiB, 74.41% compilation time)

Licence Creative Commons Attribution 2.0 Belgique

Envoyer le billet « Version Julia de l'algorithme pour planifier les horaires de travail en équipes » dans le blog Viadeo Envoyer le billet « Version Julia de l'algorithme pour planifier les horaires de travail en équipes » dans le blog Twitter Envoyer le billet « Version Julia de l'algorithme pour planifier les horaires de travail en équipes » dans le blog Google Envoyer le billet « Version Julia de l'algorithme pour planifier les horaires de travail en équipes » dans le blog Facebook Envoyer le billet « Version Julia de l'algorithme pour planifier les horaires de travail en équipes » dans le blog Digg Envoyer le billet « Version Julia de l'algorithme pour planifier les horaires de travail en équipes » dans le blog Delicious Envoyer le billet « Version Julia de l'algorithme pour planifier les horaires de travail en équipes » dans le blog MySpace Envoyer le billet « Version Julia de l'algorithme pour planifier les horaires de travail en équipes » dans le blog Yahoo

Mis à jour 09/10/2021 à 12h36 par danielhagnoul

Catégories
Programmation , Julia

Commentaires

  1. Avatar de User
    • |
    • permalink
    Sympa ! il faudra que je me mette aussi à julia
  2. Avatar de Pierre Fauconnier
    • |
    • permalink
    Salut Denis

    Citation Envoyé par User
    Sympa ! il faudra que je me mette aussi à julia
    C'est fou cette soif qu'on a d'apprendre encore et encore...
  3. Avatar de User
    • |
    • permalink
    Salut Pierre,

    Probablement des choses à rattraper