Η διαδικασία που ακολουθήθηκε για τις αναθέσεις των εργασιών περιγράφεται παρακάτω.
Η συνάρτηση random_assignment παίρνει ως inputs: (1) τον αριθμό \(n\) των εργασιών που είναι διαθέσιμες, ένα dataframe choices με στήλες: lastname, choice1, choice2, choice3 και ένα διάνυσμα τυχαίων αριθμών randnum διάστασης ίσης με τον αριθμό γραμμών του choices. Προσθέτει το διάνυσμα στο choices και διατάσσει το αυξημένο dataframe σε αύξουσα σειρά ως προς την τελευταία στήλη. Έτσι έχει γίνει μια τυχαία αναδιάταξη των γραμμών σύμφωνα με το δοθέν διάνυσμα τυχαίων αριθμών.
Στη συνέχεια εκτελείται η ανάθεση των εργασιών ξεκινώντας από την πρώτη γραμμή του dataframe. Σε κάθε γραμμή δίνεται η πρώτη διαθέσιμη επιλογή της, αν υπάρχει κάποια, διαφορετικά δεν γίνεται ανάθεση. Μετά την ανάθεση αφαιρείται από το σύνολο των διαθέσιμων εργασιών η εργασία που ανατέθηκε. Η στήλη assigned γίνεται TRUE/FALSE ανάλογα με το αν έχει γίνει ανάθεση ή όχι.
Στο τέλος της διαδικασίας, κάθε γραμμή με assigned==FALSE παίρνει μια τυχαία εργασία από το σύνολο των εργασιών που έχουν παραμείνει διαθέσιμες και έχουν αριθμό μικρότερο του 31 (οι εργασίες 31-35 μπορούν να ανατεθούν μόνο αν τις ζητήσει κάποιος).
random_assignment <- function(n, choices, randnum)
{
available_papers <- 1:n
k=nrow(choices)
assigned <- rep(FALSE, k)
paperno <- rep(0,k)
work_df <- data.frame(choices, randnum, assigned, paperno)
sorted_df <- work_df[order(work_df$randnum),]
for (i in 1:k)
{
assigned_paper <- 0
if (sorted_df[i, ]$C1 %in% available_papers)
{
assigned_paper <- sorted_df[i, ]$C1
sorted_df[i, ]$assigned <- TRUE
} else
if (sorted_df[i, ]$C2 %in% available_papers)
{
assigned_paper <- sorted_df[i, ]$C2
sorted_df[i, ]$assigned <- TRUE
} else
if (sorted_df[i, ]$C3 %in% available_papers)
{
assigned_paper <- sorted_df[i, ]$C3
sorted_df[i, ]$assigned <- TRUE
}
if (assigned_paper >0 )
{
sorted_df[i,]$paperno <- assigned_paper
available_papers <- available_papers[available_papers != assigned_paper]
}
}
# leftovers
for (i in 1:k)
{
if (sorted_df[i,]$assigned == FALSE)
{
assigned_paper <- sample(available_papers, 1)
while (assigned_paper >= 31)
assigned_paper <- sample(available_papers, 1)
sorted_df[i,]$paperno <- assigned_paper
available_papers <- available_papers[available_papers != assigned_paper]
}
}
return(list(assignments=sorted_df, remaining=available_papers))
}
Το διάνυσμα randnum δημιουργήθηκε εξωτερικά και είναι το
rnum0 <- c(0.30351423, 0.99111022, 0.55731616, 0.14313792, 0.74121738, 0.55665854, 0.05132239, 0.55700194, 0.83844665, 0.26934258, 0.53115389, 0.63744534, 0.02184199, 0.75483902, 0.42434752, 0.90034263, 0.83694991, 0.50637552, 0.05732000, 0.17616906, 0.57478159, 0.15927341, 0.48330967)
print(rnum0)
## [1] 0.30351423 0.99111022 0.55731616 0.14313792 0.74121738 0.55665854
## [7] 0.05132239 0.55700194 0.83844665 0.26934258 0.53115389 0.63744534
## [13] 0.02184199 0.75483902 0.42434752 0.90034263 0.83694991 0.50637552
## [19] 0.05732000 0.17616906 0.57478159 0.15927341 0.48330967
Εκτελούμε τη συνάρτηση random_assignment με αυτό το διάνυσμα τυχαίων αριθμών και παίρνουμε τον πίνακα των αναθέσεων και τις εργασίες που δεν έχουν ανατεθεί.
choices <- read.csv(file="anatheseis.csv", sep=',', header = T)
n <- 35
results <- random_assignment(n, choices, rnum0)
print(results$assignments)
## LNAME C1 C2 C3 randnum assigned paperno
## 13 ΔΗΜΗΤΡΟΥΛΟΠΟΥΛΟΣ 24 20 3 0.02184199 TRUE 24
## 7 ΜΠΙΤΙΝΗΣ 2 22 13 0.05132239 TRUE 2
## 19 ΚΑΡΓΙΟΥ 23 30 24 0.05732000 TRUE 23
## 4 ΝΙΚΟΛΙΤΣΑ 30 26 11 0.14313792 TRUE 30
## 22 HOXHA 11 19 18 0.15927341 TRUE 11
## 20 ΜΙΧΑΛΟΠΟΥΛΟΣ 13 16 24 0.17616906 TRUE 13
## 10 ΣΟΥΚΟΥΒΕΛΟΣ 25 26 11 0.26934258 TRUE 25
## 1 ΚΑΚΑΒΕΛΟΥ 24 23 9 0.30351423 TRUE 9
## 15 ΒΟΥΓΙΟΥΚΑ 1 2 3 0.42434752 TRUE 1
## 23 ΣΚΡΕΚΑ 32 23 8 0.48330967 TRUE 32
## 18 ΑΝΑΓΝΩΣΤΟΥ 3 4 6 0.50637552 TRUE 3
## 11 POMOHACI 11 26 30 0.53115389 TRUE 26
## 6 ΧΑΡΑΛΑΜΠΟΥΣ 25 26 5 0.55665854 TRUE 5
## 8 ΤΣΙΑΡΑ 20 30 26 0.55700194 TRUE 20
## 3 ΑΘΑΝΑΣΑΚΟΠΟΥΛΟΣ 23 10 34 0.55731616 TRUE 10
## 21 ΓΕΛΑΣΤΟΥ 3 33 29 0.57478159 TRUE 33
## 12 ΚΑΛΑΤΖΗΣ 34 35 32 0.63744534 TRUE 34
## 5 ΚΑΠΕΡΝΕΚΑ 8 20 25 0.74121738 TRUE 8
## 14 ΠΑΛΑΜΠΟΥΪΚΗΣ 29 35 28 0.75483902 TRUE 29
## 17 ΚΑΜΙΤΣΗ 26 25 2 0.83694991 FALSE 19
## 9 ΚΡΟΚΟΥ 25 4 23 0.83844665 TRUE 4
## 16 ΠΑΝΑΓΟΠΟΥΛΟΥ 8 20 14 0.90034263 TRUE 14
## 2 ΓΙΑΝΝΗΣ 8 15 10 0.99111022 TRUE 15
print(results$remaining)
## [1] 6 7 12 16 17 18 21 22 27 28 31 35
O τελικός πίνακας των αναθέσεων σε αλφαβητική σειρά είναι
final_table <- results$assignments[order(results$assignments[,1]), c(1,7)]
print(final_table)
## LNAME paperno
## 22 HOXHA 11
## 11 POMOHACI 26
## 3 ΑΘΑΝΑΣΑΚΟΠΟΥΛΟΣ 10
## 18 ΑΝΑΓΝΩΣΤΟΥ 3
## 15 ΒΟΥΓΙΟΥΚΑ 1
## 21 ΓΕΛΑΣΤΟΥ 33
## 2 ΓΙΑΝΝΗΣ 15
## 13 ΔΗΜΗΤΡΟΥΛΟΠΟΥΛΟΣ 24
## 1 ΚΑΚΑΒΕΛΟΥ 9
## 12 ΚΑΛΑΤΖΗΣ 34
## 17 ΚΑΜΙΤΣΗ 19
## 5 ΚΑΠΕΡΝΕΚΑ 8
## 19 ΚΑΡΓΙΟΥ 23
## 9 ΚΡΟΚΟΥ 4
## 20 ΜΙΧΑΛΟΠΟΥΛΟΣ 13
## 7 ΜΠΙΤΙΝΗΣ 2
## 4 ΝΙΚΟΛΙΤΣΑ 30
## 14 ΠΑΛΑΜΠΟΥΪΚΗΣ 29
## 16 ΠΑΝΑΓΟΠΟΥΛΟΥ 14
## 23 ΣΚΡΕΚΑ 32
## 10 ΣΟΥΚΟΥΒΕΛΟΣ 25
## 8 ΤΣΙΑΡΑ 20
## 6 ΧΑΡΑΛΑΜΠΟΥΣ 5
write.csv(final_table, file="final.csv")