Zastanawiam się, jak ustawić przykład niektórych podstawowych procedur dopasowywania w R. Istnieje wiele przykładów w różnych językach programowania, ale nie znalazłem jeszcze dobrego przykładu dla R.Dopasowywanie algorytmów w R (dopasowanie bierne, węgierski algorytm)
Powiedzmy, że chcemy, aby dopasować studentów do projektów i uważam 3 alternatywne podejścia, które natknąłem się podczas googlowania na ten temat:
1) dwustronny pokrowiec pasujący: pytam każdego ucznia, aby wymienić 3 projekty do pracy na (bez określania jakiegokolwiek rankingu preferencji spośród tych 3).
ID T.1 T.2 T.3 T.4 T.5 T.6 T.7
1 1 1 1 0 0 0 0
2 0 0 0 0 1 1 1
3 0 1 1 1 0 0 0
4 0 0 0 1 1 1 0
5 1 0 1 0 1 0 0
6 0 1 0 0 0 1 1
7 0 1 1 0 1 0 0
-
d.1 <- structure(list(Student.ID = 1:7, Project.1 = c(1L, 0L, 0L, 0L,
1L, 0L, 0L), Project.2 = c(1L, 0L, 1L, 0L, 0L, 1L, 1L), Project.3 = c(1L,
0L, 1L, 0L, 1L, 0L, 1L), Project.4 = c(0L, 0L, 1L, 1L, 0L, 0L,
0L), Project.5 = c(0L, 1L, 0L, 1L, 1L, 0L, 1L), Project.6 = c(0L,
1L, 0L, 1L, 0L, 1L, 0L), Project.7 = c(0L, 1L, 0L, 0L, 0L, 1L,
0L)), .Names = c("Student.ID", "Project.1", "Project.2", "Project.3",
"Project.4", "Project.5", "Project.6", "Project.7"), class = "data.frame", row.names = c(NA,
-7L))
2) algorytm węgierski: Pytam każdy napis student 3 projekty do pracy z podaniem preferencji ranking wśród tych 3. O ile dobrze zrozumiałem rozumowanie kiedy nałożeniem algorytm w tym przypadku byłby mniej więcej taki: im wyższa ranga, tym niższe "koszty" dla ucznia.
ID T.1 T.2 T.3 T.4 T.5 T.6 T.7
1 3 2 1 na na na na
2 na na na na 1 2 3
3 na 1 3 2 na na na
4 na na na 1 2 3 na
5 2 na 3 na 1 na na
6 na 3 na na na 2 1
7 na 1 2 na 3 na na
-
d.2 <- structure(list(Student.ID = 1:7, Project.1 = structure(c(2L, 3L,
3L, 3L, 1L, 3L, 3L), .Label = c("2", "3", "na"), class = "factor"),
Project.2 = structure(c(2L, 4L, 1L, 4L, 4L, 3L, 1L), .Label = c("1",
"2", "3", "na"), class = "factor"), Project.3 = structure(c(1L,
4L, 3L, 4L, 3L, 4L, 2L), .Label = c("1", "2", "3", "na"), class = "factor"),
Project.4 = structure(c(3L, 3L, 2L, 1L, 3L, 3L, 3L), .Label = c("1",
"2", "na"), class = "factor"), Project.5 = structure(c(4L,
1L, 4L, 2L, 1L, 4L, 3L), .Label = c("1", "2", "3", "na"), class = "factor"),
Project.6 = structure(c(3L, 1L, 3L, 2L, 3L, 1L, 3L), .Label = c("2",
"3", "na"), class = "factor"), Project.7 = structure(c(3L,
2L, 3L, 3L, 3L, 1L, 3L), .Label = c("1", "3", "na"), class = "factor")), .Names = c("Student.ID",
"Project.1", "Project.2", "Project.3", "Project.4", "Project.5",
"Project.6", "Project.7"), class = "data.frame", row.names = c(NA,
-7L))
3) ??? podejście: Powinno to być prawie związane z (2). Uważam jednak, że jest to prawdopodobnie lepsze/bardziej sprawiedliwe podejście (przynajmniej w kontekście przykładu). Studenci nie mogą wybierać projektów, nawet nie wiedzą o projektach, ale ocenili swoje kwalifikacje (1 "nie istnieje" na 10 "poziomie zawodowym") w odniesieniu do określonego zestawu umiejętności. Ponadto, wykładowca ocenił wymagany zestaw umiejętności dla każdego projektu. Oprócz (2), pierwszym krokiem byłoby obliczenie macierzy podobieństwa, a następnie uruchomienie procedury optymalizacji z góry.
PS: Programming Skills
SK: Statistical Knowledge
IE: Industry Experience
ID PS SK IE
1 10 9 8
2 1 2 10
3 10 2 5
4 2 5 3
5 10 2 10
6 1 10 1
7 5 5 5
-
d.3a <- structure(list(Student.ID = 1:7, Programming.Skills = c(10L, 1L,
10L, 2L, 10L, 1L, 5L), Statistical.knowlegde = c(9L, 2L, 2L,
5L, 2L, 10L, 5L), Industry.Expertise = c(8L, 10L, 5L, 3L, 10L,
1L, 5L)), .Names = c("Student.ID", "Programming.Skills", "Statistical.knowlegde",
"Industry.Expertise"), class = "data.frame", row.names = c(NA,
-7L))
-
T: Topic ID
PS: Programming Skills
SK: Statistical Knowledge
IE: Industry Experience
T PS SK IE
1 10 5 1
2 1 1 5
3 10 10 10
4 2 8 3
5 4 3 2
6 1 1 1
7 5 7 2
-
d.3b <- structure(list(Project.ID = 1:7, Programming.Skills = c(10L,
1L, 10L, 2L, 4L, 1L, 5L), Statistical.Knowlegde = c(5L, 1L, 10L,
8L, 3L, 1L, 7L), Industry.Expertise = c(1L, 5L, 10L, 3L, 2L,
1L, 2L)), .Names = c("Project.ID", "Programming.Skills", "Statistical.Knowlegde",
"Industry.Expertise"), class = "data.frame", row.names = c(NA,
-7L))
Będę wdzięczny za każdą pomoc w realizacji tych 3 podejścia w R. dziękuję.
UPDATE: następujące pytania wydają się być związane, ale nie pokazują, jak go rozwiązać w R: https://math.stackexchange.com/questions/132829/group-membership-assignment-by-preferences-optimization-problem https://superuser.com/questions/467577/using-optimization-to-assign-by-preference
Język R został zaprojektowany z myślą o przetwarzaniu wektorów statystycznych. Nie spodziewałbym się, że będzie idealny dla tego rodzaju rzeczy lub dla wielu innych. Z tego powodu szybkie wyszukiwanie google da Ci dużo informacji o wywoływaniu innych języków z R. Bardzo prosty sposób to wywołanie R innych programów przez system(), jak to opisano na przykład w http://darrenjw.wordpress.com/ 2010/12/30/calling-c-code-from-r/- chociaż dla celów tej metody nie ma znaczenia, co napisano w drugim programie, więc C może być prawie wszystkim. – mcdowella
Ponieważ wydaje się, że są to bardzo podstawowe techniki, zastanawiałem się, czy R nie zapewnia również tej funkcjonalności przez np. pakiet 'optmatch' lub pakiet' wskazówka' (to znaczy 'solve_LSAP()'). – majom
Możesz rozwiązać te problemy za pomocą metody solve_LSAP(), aby uzyskać odpowiednie ograniczenia i funkcje kosztów. Możesz nawet spojrzeć na optymalizację pakietu. – jackStinger