Η διαδικασία που ακολουθήθηκε για τις αναθέσεις των εργασιών περιγράφεται παρακάτω.

Η συνάρτηση 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")