Obecnie pracuję nad stroną internetową, która pozwoli studentom z mojej uczelni automatycznie generować ważne harmonogramy w oparciu o kursy, które chcą wziąć.Efektywne planowanie kursów uniwersyteckich
Zanim przystąpiłem do pracy nad samą stroną, postanowiłem poruszyć kwestię efektywnego planowania kursów.
Kilka wyjaśnień:
Każdy kurs na naszej uczelni (i zakładam na każdym innym uniwersytetu) składa się z jednej lub więcej części. Na przykład: Rachunek I ma obecnie 4 sekcje. Oznacza to, że w zależności od ilości sekcji i tego, czy kurs ma laboratorium, ma to znaczący wpływ na proces planowania.
Kursy na naszej uczelni są reprezentowane za pomocą kombinacji skrótu do przedmiotu i kodu kursu. W przypadku rachunku różniczkowego I: MATH 1110.
CRN to kod unikalny dla sekcji.
Uczelnia, na której się uczę, nie jest mieszana, co oznacza, że mężczyźni i kobiety studiują w (prawie) oddzielnych kampusach. Chodzi mi o to, że kampus dzieli się na dwie części.
Dices baz danych i dyktafonów mają na celu zmniejszenie liczby wywołań datetime.datetime.strptime(), co było prawdziwym wąskim gardłem.
Moja pierwsza próba polegała na tym, że algorytm zapętlał w sposób ciągły, aż znaleziono 30 harmonogramów. Harmonogramy zostały utworzone przez losowe wybieranie sekcji z jednego z wprowadzonych kursów, a następnie próby umieszczenia sekcji z pozostałych pól w celu utworzenia prawidłowego harmonogramu. Jeśli nie wszystkie kursy pasują do harmonogramu, np. Wystąpiły konflikty, harmonogram został złomowany, a pętla kontynuowana.
Oczywiście, powyższe rozwiązanie jest wadliwe. Algorytm trwał zbyt długo i polegał zbytnio na losowości.
Drugi algorytm działa dokładnie przeciwnie niż stary. Po pierwsze generuje kolekcję wszystkich możliwych kombinacji harmonogramów za pomocą itertools.product(). Następnie przechodzi przez harmonogramy, wykreślając wszelkie nieważne. Aby zapewnić różne sekcje, kombinacje zestawów są przetasowane (random.shuffle()) przed sprawdzeniem poprawności. Ponownie, w grę wchodzi nieco losowości.
Po odrobinie optymalizacji udało mi się uruchomić program planujący w czasie poniżej 1 sekundy dla przeciętnego harmonogramu składającego się z 5 kursów. To świetnie, ale problem zaczyna się po dodaniu kolejnych kursów.
Aby dać wyobrażenie, kiedy dostarczyć pewien zestaw wejść, ilość możliwych kombinacji jest tak duża, że itertools.product() nie kończy w rozsądnym czasie i zjada 1GB RAM w tym procesie.
Oczywiście, jeśli mam zamiar zrobić to usługa, potrzebuję szybszego i bardziej wydajnego algorytmu. Dwa, które pojawiły się w Internecie i na IRC: dynamiczne programowanie i algorytmy genetyczne.
Programowanie dynamiczne nie może być zastosowane do tego problemu, ponieważ, jeśli dobrze rozumiem tę koncepcję, polega ona na rozbiciu problemu na mniejsze części, rozwiązaniu tych elementów indywidualnie, a następnie doprowadzeniu rozwiązań tych elementów do siebie w celu stworzenia kompletnego rozwiązania . O ile widzę, nie ma tu zastosowania.
Jeśli chodzi o algorytmy genetyczne, nie rozumiem ich zbyt wiele i nie mogę nawet pojąć, jak je zastosować w takiej sytuacji. Rozumiem również, że GA może być bardziej wydajne w przypadku bardzo dużej przestrzeni problemowej, a to nie jest duże.
Jakie mam alternatywy? Czy istnieje dość zrozumiałe podejście, które mogę podjąć, aby rozwiązać ten problem? Czy powinienem po prostu trzymać się tego, co mam i mam nadzieję, że niewiele osób zdecyduje się na 8 kursów w następnym semestrze?
Nie jestem świetnym pisarzem, więc przepraszam za wszelkie niejasności w pytaniu. Proszę poprosić o wyjaśnienia, a dołożę wszelkich starań, aby pomóc.
Oto kod w całości.
http://bpaste.net/show/ZY36uvAgcb1ujjUGKA1d/
Uwaga: Przepraszam za korzystanie mylący tag (harmonogramu).
O co właściwie pytasz? Wydaje się to bardzo niejasne i otwarte. FYI, problemy z planowaniem są generalnie NP. Przeprowadzono wiele badań dotyczących tego problemu, czy wypróbowałeś google i szukasz publikacji? Na przykład: http://www.aloul.net/Papers/faloul_sch_gcc07.pdf –
Wygląda dokładnie tak, jak problem z plecakiem. Masz pulę zajęć i ustalony czas przydziału, musisz wypełnić plecak tak, aby żadna z obecnych klas w worku nie nakładała się i nie wypełniała tak dużo czasu, jak to tylko możliwe. Co jeśli problem zostanie rozwiązany z tą myślą, wówczas GA może być zastosowane do efektywnego (czasem) znalezienia optymalnego, w ramach błędów, harmonogramów kursu. – sean
To jest problem z ograniczeniami. –