momente şi schiţe de informatică şi matematică
To attain knowledge, write. To attain wisdom, rewrite.

Repartizarea pe zile a încadrării profesorilor (VI.bis)

limbajul R | orar şcolar
2021 jan

Drumuri oarecum greşite

Teoretic, distribuţia D14 evidenţiată în [1] este dintre cele destul de reuşite: 75% dintre distribuţiile individuale conţinute sunt „acceptabile” (şi aproape jumătate dintre acestea sunt chiar „perfecte”) – adică au abateri mici faţă de o distribuţie omogenă pe zile, a orelor profesorului. Numai că realitatea impune între altele, acest aspect perturbator important: mulţi profesori trebuie să-şi facă orele în două schimburi (unele clase funcţionează în prima parte a zilei, altele în a doua parte).

Să revedem D14, de data aceasta pe schimburi (putem depista clasele dintr-un acelaşi schimb prin grepl(), dat fiind că ştim nivelele claselor din primul schimb):

library(tidyverse)
cf_omg <- function(ore_zi) {  # din [1]
    ore <- ore_zi[ore_zi != 0]
    round(sd(ore)/mean(ore)*diff(range(ore)), 2)
}  # coeficientul de omogenitate al unei distribuţii individuale
bind_omg <- function(M) cbind(M, apply(M, 1, cf_omg)) 

D14 <- readRDS("D14.rds")  # distribuţie a orelor cu doar 14 cazuri de "respins"
Z14 <- as.matrix(table(D14[c("prof", "zl")]))  # numărul de ore pe zi, la profesori
Z14 <- bind_omg(Z14)  # adaugă coloana coeficienţilor de omogenitate

D1 <- D14  %>%  
      filter(grepl('11|12|7|8', cls))  # orele claselor din primul schimb
D2 <- D14  %>%  
      filter(grepl('5|7|9|10', cls))  # orele claselor din schimbul doi (din D14)

Z1 <- as.matrix(table(D1[c('prof', 'zl')]))
Z2 <- as.matrix(table(D2[c('prof', 'zl')]))
Z <- cbind(Z1, Z2)  # distribuţiile individuale (ore pe zi) pe schimburi

# demersuri pentru formatarea tipăririi matricelor
prof <- attr(Z14, "dimnames")[[1]]
df_ore <- data.frame(n1 = 1:59, c1 = 1:59, sep1 = rep(" ", 59), 
                  c2 = 1:59, sep2 = rep("  ", 59), c3 = 1:59)
df_ore$n1 <- prof
df_ore$c1 <- Z[, 1:5]
df_ore$c2 <- Z[, 6:10]
df_ore$c3 <- Z14[, 6]
df_ore <- df_ore  %>%  arrange(c3)  # ordonează după coeficienţi
names(df_ore) <- NULL
print(df_ore, rownames=FALSE)

             Lu Ma Mi Jo Vi   Lu Ma Mi Jo Vi        
         P20  1  1  1  1  1    3  3  3  3  3    0.00
         P48  0  0  0  0  0    1  1  1  1  1    0.00
         P43  0  0  0  0  0    1  1  1  0  0    0.00
         P56  0  0  0  0  0    1  1  1  0  0    0.00
         P57  0  0  0  0  0    0  0  1  1  0    0.00
         P01  3  4  3  4  2    2  2  3  2  3    0.10
         P03  3  2  2  2  2    3  4  3  3  4    0.10
         P17  3  3  3  2  2    1  2  1  2  2    0.11
         P10  4  3  3  3  2    1  1  2  2  2    0.12
         P11  2  2  1  1  2    3  3  3  4  2    0.12
         P12  1  2  2  2  1    3  2  3  3  3    0.12
         P13  2  3  3  2  3    2  1  2  2  2    0.12
         P34  1  0  0  1  2    2  3  3  3  1    0.14
         P36  2  2  3  2  3    1  1  0  1  1    0.14
         P37  1  0  1  1  3    2  4  2  2  0    0.14
         P26  2  2  2  2  1    2  2  2  1  2    0.15
         P30  4  1  2  1  2    0  2  2  3  1    0.15
         P31  0  0  2  2  0    4  3  1  2  4    0.15
         P33  2  2  2  2  3    1  2  2  1  0    0.16
         P45  1  0  1  1  1    0  0  1  1  1    0.29
         P06  1  2  3  2  2    3  3  2  4  4    0.32
         P04  3  4  4  3  1    2  2  2  3  3    0.33
         P21  2  2  2  2  0    3  2  1  2  4    0.35
         P49  0  0  1  0  0    1  2  1  0  0    0.35
         P47  0  0  1  1  0    2  1  0  0  1    0.37
         P09  1  3  3  3  1    3  1  3  2  3    0.39
         P07  5  5  4  3  4    1  1  1  1  0    0.40
         P15  1  1  2  4  3    3  4  2  1  0    0.40
         P50  0  0  1  1  1    2  0  0  0  0    0.40
         P51  1  0  1  1  0    0  1  0  1  0    0.40
         P14  4  4  2  1  0    1  0  3  4  3    0.41
         P46  0  1  0  1  0    0  1  1  0  0    0.43
         P52  0  0  0  0  0    0  1  2  1  0    0.43
         P53  1  0  0  1  0    1  0  0  0  1    0.43
         P54  0  1  0  0  1    1  1  0  0  0    0.43
         P55  1  2  1  0  0    0  0  0  0  0    0.43
         P22  3  3  2  2  3    2  1  1  1  1    0.44
         P23  4  2  3  3  3    1  1  1  1  0    0.44
         P24  1  1  1  0  1    3  2  4  4  2    0.44
         P25  4  2  1  2  2    1  2  3  1  1    0.44
         P18  0  2  3  2  1    3  1  1  3  4    0.50
         P27  2  3  3  1  3    2  1  1  1  1    0.50
         P29  1  2  0  1  2    1  2  4  3  2    0.50
         P39  1  1  1  1  1    1  2  2  3  3    0.52
         P02  6  2  2  2  3    1  4  4  2  2    0.61
         P40  1  0  0  1  1    3  2  2  1  2    0.69
         P41  1  1  2  1  1    2  2  1  2  0    0.69
         P08  3  4  2  2  3    1  2  4  3  0    0.81
         P19  2  3  2  2  1    2  2  3  2  1    0.92
         P32  2  1  1  1  1    3  3  3  2  1    0.95
         P44  0  0  2  1  1    1  1  1  2  0    1.22
         P05  5  6  5  4  2    1  1  1  0  1    1.26
         P16  4  5  3  2  4    1  1  1  0  0    1.41
         P42  1  1  0  0  1    3  1  1  1  2    1.78
         P35  1  1  3  2  4    1  0  0  3  1    2.24
         P28  1  2  3  0  0    4  4  1  2  1    2.88
         P38  3  2  1  0  0    3  2  1  1  3    3.01
         P58  0  0  0  0  1    0  0  0  0  0      NA
         P59  0  0  0  0  0    0  0  0  0  1      NA

După ce o vedem astfel pe schimburi, D14 nu ne mai pare deloc, promiţătoare; defectul major constă în faptul că avem prea multe cazuri de profesori care au o singură oră pe zi într-unul dintre cele două schimburi. Distribuţia de pe prima linie (pentru P20) de exemplu – era una „perfectă” (câte 4 ore în fiecare zi), numai că acum vedem că deşi rămâne „perfectă” pe fiecare schimb în parte, nu corespunde deloc ideii de perfecţiune obişnuite la profesor: acesta va prefera ca în loc să aibă câte o singură oră în fiecare zi din schimbul unu, să aibă aceste 5 ore în numai două zile (dacă nu se poate cumva, într-o singură zi, ceea ce desigur, se poate: le punem să zicem în prima zi şi mutăm cele 3 ore din al doilea schimb din prima zi, în alte zile – cu îndoiala justificată că „înghesuind” astfel orele unuia, se vor afecta mai degrabă negativ, distribuţiile altora).

Ideea de distribuţie omogenă pe care am vizat-o până acum (peste tot în [1]) poate să ţină numai dacă ar fi vorba de un singur schimb (iar profesorii care au mai puţin de 10 ore pe săptămână trebuie să aibă distribuţii ne-omogene).

Acum, în loc să vedem dacă nu cumva printre cele 1455 de distribuţii rezultate în [1] am putea găsi vreuna care să fie „acceptabilă” când am separa-o pe schimburi – preferăm să recunoaştem că suntem pe un drum oarecum greşit. Condiţia (ideală) de omogenitate trebuie păstrată numai pentru profesorii care au orele într-un acelaşi schimb (şi în număr rezonabil, să zicem pe puţin 10 ore pe săptămână); pentru profesorii cu ore în ambele schimburi (iar aceştia formează majoritatea!) – avem de gândit sau de experimentat (adăugând în "distribute_by_days.R" din [1]) alte condiţii de generare a distribuţiei orelor pe zilele de lucru.

vezi Cărţile mele (de programare)

docerpro | Prev | Next