language agnostic - Algorytm tworzenia harmonogramu szkolnego

Translate

Zastanawiałem się, czy są znane rozwiązania algorytmu tworzenia planu lekcji. Zasadniczo chodzi o optymalizację „rozproszenia godzin” (zarówno w przypadku nauczycieli, jak i klas) dla danych stowarzyszeń klasa-przedmiot-nauczyciel. Można założyć, że na wejściu mamy skojarzone ze sobą zestawy klas, przedmiotów lekcji i nauczycieli, a plan zajęć powinien mieścić się między 8:00 a 16:00.

Myślę, że nie ma chyba dokładnego algorytmu do tego, ale może ktoś zna dobre przybliżenie lub wskazówki jak to zrobić.

This question and all comments follow the "Attribution Required."

Wszystkie odpowiedzi

mjv
Translate

Ten problem jestNP-Complete!
Krótko mówiąc, należy zbadać wszystkie możliwe kombinacje, aby znaleźć listę akceptowalnych rozwiązań. Ze względu na różne okoliczności, w jakich problem pojawia się w różnych szkołach (na przykład: czy istnieją ograniczenia dotyczące sal lekcyjnych ?, czy niektóre klasy są czasami podzielone na podgrupy ?, czy jest to tygodniowy harmonogram? itp.) nie ma dobrze znanej klasy problemów, która odpowiada wszystkim problemom związanym z planowaniem. MożeProblem z plecakiemma wiele elementów podobieństwa do tych problemów w ogóle.

Potwierdzeniem, że jest to zarówno trudny problem, jak i ten, dla którego ludzie nieustannie szukają rozwiązania, jest sprawdzenie tego (długiego)lista (głównie komercyjnych) narzędzi do planowania

Ze względu na dużą liczbę zmiennych, których największym źródłem są zazwyczaj pragnienia nauczyciela; -) ...niepraktyczne jest rozważenie wyliczenia wszystkich możliwych kombinacji. Zamiast tego musimy wybrać podejście, które odwiedza podzbiór przestrzeni problemów / rozwiązań.
-Algorytmy genetyczne, cytowany w innej odpowiedzi to (lub IMHO,wydaje się) dobrze przygotowany do przeprowadzania tego rodzaju wyszukiwania częściowo sterowanego (problemem jest znalezienie dobrej funkcji oceny kandydatów do zatrzymania dla następnego pokolenia)
-Przepisywanie wykresówpodejścia są również przydatne w przypadku tego typu problemów optymalizacji kombinatorycznej.

Zamiast skupiać się na konkretnych wdrożeniach programu automatycznego generatora harmonogramów, chciałbym zasugerowaćkilka strategii, które można zastosować,na poziomie definicji problemu.
Ogólne uzasadnienie jest takie, że w większości rzeczywistych problemów związanych z harmonogramowaniem konieczne będą pewne kompromisy, a nie wszystkie ograniczenia, wyrażone i domniemane: zostaną w pełni spełnione. Dlatego pomagamy sobie:

  • Zdefiniowanie i uszeregowanie wszystkich znanych ograniczeń
  • Zmniejszenie przestrzeni problemowej poprzez ręczne dostarczenie zestawu plikówdodatkowyograniczenia.
    Może się to wydawać sprzeczne z intuicją, ale na przykład poprzez dostarczenie początkowego, częściowo wypełnionego harmonogramu (powiedzmy około 30% przedziałów czasowych) w sposób, który w pełni spełnia wszystkie ograniczenia, i uznając ten częściowy harmonogram za niezmienny, znacznie zmniejszamy czas / przestrzeń potrzebna do stworzenia potencjalnych rozwiązań.
    Innym sposobem, w jaki pomagają dodatkowe ograniczenia, jest na przykład „sztuczne” dodanie ograniczenia, które uniemożliwia nauczanie niektórych przedmiotów w niektóre dni tygodnia (jeśli jest to harmonogram tygodniowy…); tego typu ograniczenia skutkują redukcją przestrzeni problemów / rozwiązań, zazwyczaj bez wykluczania znacznej liczby dobrych kandydatów.
  • Zapewnienie szybkiego obliczenia niektórych ograniczeń problemu. Jest to często związane z wyborem modelu danych używanego do przedstawienia problemu; chodzi o to, aby móc szybko wybrać (lub usunąć) niektóre opcje.
  • Przedefiniowanie problemu i umożliwienie kilkukrotnego przełamania niektórych ograniczeń (zazwyczaj w kierunku końcowych węzłów grafu). Chodzi o to, aby usunąćtrochęograniczeń dotyczących zapełnienia kilku ostatnich miejsc w harmonogramie lub zatrzymania programu automatycznego generatora harmonogramów przed ukończeniem całego harmonogramu, zamiast tego dostarcza nam listę kilkunastu wiarygodnych kandydatów. Jak wskazano, człowiek jest często w lepszej pozycji do rozwiązania łamigłówki, prawdopodobnie łamiąc kilka ograniczeń, używając informacji, które zwykle nie są udostępniane automatycznej logice (np. Reguła „Żadnej matematyki po południu” może być czasami złamana na zajęcia z „zaawansowanej matematyki i fizyki” lub „Lepiej jest złamać jedno z wymagań pana Jonesa niż jedno z pani Smith… ;-))

Podczas korygowania tej odpowiedzi zdaję sobie sprawę, że jest ona dość nieśmiała, aby udzielić konkretnej odpowiedzi, ale jest ona jednak pełna praktycznych sugestii. Mam nadzieję, że to pomoże, mimo wszystko, co jest „trudnym problemem”.

Źródło
Translate

To bałagan. królewski bałagan. Aby dodać do odpowiedzi, już bardzo kompletnych, chcę zwrócić uwagę na moje rodzinne doświadczenia. Moja mama była nauczycielką i brała udział w tym procesie.

Okazuje się, że posiadanie komputera do tego jest nie tylko trudne do zakodowania jako takiego, ale jest również trudne, ponieważ istnieją warunki, które są trudne do określenia w gotowym programie komputerowym. Przykłady:

  • nauczyciel uczy zarówno w Twojej szkole, jak iw innym instytucie. Oczywiście, jeśli zakończy tam lekcję o 10.30, nie będzie mógł rozpocząć w Twoim lokalu o 10.30, ponieważ potrzebuje trochę czasu, aby dojeżdżać między instytutami.
  • dwóch nauczycieli jest żonaty. Ogólnie uważa się, że dobrą praktyką jest nie mieć dwóch nauczycieli będących w związku małżeńskim w tej samej klasie. Dlatego ci dwaj nauczyciele muszą mieć dwie różne klasy
  • dwoje nauczycieli jest małżeństwem, a ich dziecko uczęszcza do tej samej szkoły. Ponownie, musisz uniemożliwić dwóm nauczycielom nauczanie w konkretnej klasie, w której przebywa ich dziecko.
  • szkoła ma oddzielne pomieszczenia, tak jak jednego dnia klasa jest w jednym instytucie, a drugiego w innym.
  • szkoła ma wspólne laboratoria, ale laboratoria te są dostępne tylko w określone dni powszednie (ze względów bezpieczeństwa, na przykład, gdy wymagany jest dodatkowy personel).
  • niektórzy nauczyciele wolą dzień wolny: niektórzy wolą poniedziałek, niektórzy w piątek, niektórzy w środę. Niektórzy wolą przyjść wcześnie rano, inni wolą przyjść później.
  • nie powinieneś mieć sytuacji, w których masz lekcję, powiedzmy, historię na pierwszą godzinę, potem trzy godziny matematyki, a potem kolejną godzinę historii. Nie ma to sensu ani dla uczniów, ani dla nauczyciela.
  • powinieneś równomiernie rozłożyć argumenty. Nie ma sensu, aby pierwsze dni tygodnia były tylko matematyką, a reszta tygodnia tylko literaturą.
  • powinieneś dać niektórym nauczycielom dwie kolejne godziny na wykonanie testów ewaluacyjnych.

Jak widać, problem nie jest NP-kompletny, to jest NP-szalony.

Robią więc to, że mają duży stół z małymi plastikowymi wstawkami i przesuwają wkładki dookoła, aż uzyskają satysfakcjonujący wynik. Nigdy nie zaczynają od zera: zwykle rozpoczynają od harmonogramu z poprzedniego roku i wprowadzają poprawki.

Źródło
Translate

PlikMiędzynarodowy Konkurs Rozkładu Jazdy 2007miał ścieżkę planowania lekcji i ścieżkę planowania egzaminów. W konkursie wzięło udział wielu badaczy. Wypróbowano wiele heurystyk i metaheurystyki, ale ostatecznie metaheurystyki wyszukiwania lokalnego (takie jak wyszukiwanie Tabu i symulowane wyżarzanie) wyraźnie pokonały inne algorytmy (takie jak algorytmy genetyczne).

Spójrz na 2 frameworki open source używane przez niektórych finalistów:

Źródło
SF.
Translate

Jednym z moich zajęć na pół semestru było generowanie tabel szkolnych z wykorzystaniem algorytmów genetycznych.

Cały stół to jeden „organizm”. Pojawiły się pewne zmiany i zastrzeżenia w podejściu do ogólnych algorytmów genetycznych:

  • Ustalono zasady dla „nielegalnych stołów”: dwie klasy w tej samej klasie, jeden nauczyciel uczący dwie grupy w tym samym czasie itd. Mutacje te natychmiast uznano za zabójcze i natychmiast wykiełkował nowy „organizm” w miejsce „zmarłego”. Pierwsza została wygenerowana przez serię przypadkowych prób uzyskania legalnej (choć bezsensownej). Śmiertelna mutacja nie została wliczona do liczby mutacji w iteracji.

  • Mutacje „wymiany” były znacznie częstsze niż mutacje „modyfikowania”. Zmiany zachodziły tylko między częściami genu, które miały sens - bez zastępowania nauczyciela klasą.

  • Małe premie zostały przyznane za połączenie pewnych 2 godzin razem, za przydzielenie tej samej ogólnej sali po kolei dla tej samej grupy, za utrzymanie godzin pracy nauczyciela i ciągłego obciążenia klas. Umiarkowane premie były przyznawane za zapewnienie odpowiednich sal lekcyjnych dla danego przedmiotu, przestrzeganie godzin zajęć w terminie (rano lub po południu) i tym podobne. Duże bonusy to przypisanie właściwej liczby zadanych przedmiotów, nakład pracy nauczyciela itp.

  • Nauczyciele mogą tworzyć harmonogramy obciążenia „wtedy chcę pracować”, „w porządku wtedy pracować”, „nie lubi wtedy pracować”, „wtedy nie mogę pracować”, z przypisanymi odpowiednimi wagami. Pełne 24 godziny były legalnymi godzinami pracy, z wyjątkiem pory nocnej była bardzo niepożądana.

  • Funkcja wagi ... o tak. Funkcja wagi była ogromnym, potwornym iloczynem (jak w przypadku mnożenia) wag przypisanych do wybranych cech i właściwości. Było niezwykle strome, jedna właściwość z łatwością mogła ją zmienić o rząd wielkości w górę lub w dół - a w jednym organizmie istniały setki lub tysiące właściwości. Spowodowało to absolutnie OGROMNE liczby, ponieważ wagi, a co za tym idzie, konieczność użycia biblioteki bignum (gmp) do wykonywania obliczeń. W przypadku małego testu obejmującego około 10 grup, 10 nauczycieli i 10 sal lekcyjnych, początkowy zestaw zaczynał się od noty 10 ^ -200 czegoś, a kończył 10 ^ + 300 czymś. Był całkowicie nieefektywny, gdy był bardziej płaski. Również wartości znacznie wzrosły wraz z większymi „szkołami”.

  • Jeśli chodzi o czas obliczeń, różnica między małą populacją (100) w długim okresie a dużą populacją (ponad 10 tys.) Przez mniej pokoleń była niewielka. Obliczenia w tym samym czasie dały mniej więcej taką samą jakość.

  • Obliczenia (na niektórych procesorach 1GHz) zajęłyby około 1 godziny, aby ustabilizować się w pobliżu 10 ^ + 300, generując harmonogramy, które wyglądały całkiem nieźle, dla wspomnianego przypadku testowego 10x10x10.

  • Problem można łatwo sparaliżować, udostępniając narzędzie sieciowe, które umożliwiłoby wymianę najlepszych próbek między komputerami, na których wykonywane są obliczenia.

Wynikający z tego program nigdy nie ujrzał światła dziennego na zewnątrz, dając mi dobrą ocenę z semestru. Wyglądało to obiecująco, ale nigdy nie miałem wystarczającej motywacji, aby dodać GUI i udostępnić go ogółowi społeczeństwa.

Źródło
Translate

Ten problem jest trudniejszy niż się wydaje.

Jak wspominali inni, jest to problem NP-zupełny, ale przeanalizujmy, co to oznacza.

Zasadniczo oznacza to, że musisz spojrzeć na wszystkie możliwe kombinacje.

Ale „spójrz na” niewiele mówi ci, co musisz zrobić.

Generowanie wszystkich możliwych kombinacji jest łatwe. Może generować ogromną ilość danych, ale nie powinieneś mieć większych problemów ze zrozumieniem koncepcji tej części problemu.

Drugi problem polega na ocenie, czy dana możliwa kombinacja jest dobra, zła lub lepsza od poprzedniego „dobrego” rozwiązania.

W tym celu potrzebujesz czegoś więcej niż tylko „czy to możliwe rozwiązanie”.

Na przykład, czy ten sam nauczyciel pracuje bezpośrednio 5 dni w tygodniu przez X tygodni? Nawet jeśli jest to praktyczne rozwiązanie, może nie być lepszym rozwiązaniem niż zmiana dwóch osób, tak aby każdy nauczyciel pracował po jednym tygodniu. Och, nie pomyślałeś o tym? Pamiętaj, że to ludzie, z którymi masz do czynienia, a nie tylko problem z alokacją zasobów.

Nawet jeśli jeden nauczyciel mógłby pracować w pełnym wymiarze godzin przez 16 tygodni bez przerwy, może to być nieoptymalne rozwiązanie w porównaniu z rozwiązaniem, w którym próbujesz zmieniać nauczycieli na przemian, a tego rodzaju równoważenie jest bardzo trudne do wbudowania w oprogramowanie.

Podsumowując, stworzenie dobrego rozwiązania tego problemu będzie wiele warte dla wielu, wielu ludzi. Dlatego nie jest łatwo rozwiązać i rozwiązać problem. Przygotuj się na wyznaczenie celów, które nie są w 100% i nazwanie ich „wystarczająco dobrymi”.

Źródło
Translate

UPDATE: z komentarzy ... też powinna mieć heurystykę!

Poszedłbym z Prologiem ... potem użył Rubiego lub Perla lub czegoś podobnego, aby uporządkować twoje rozwiązanie do ładniejszej formy.

teaches(Jill,math).
teaches(Joe,history).

involves(MA101,math).
involves(SS104,history).

myHeuristic(D,A,B) :- [test_case]->D='<';D='>'.
createSchedule :- findall(Class,involves(Class,Subject),Classes),
                  predsort(myHeuristic,Classes,ClassesNew),
                  createSchedule(ClassesNew,[]).
createSchedule(Classes,Scheduled) :- [the actual recursive algorithm].

Jestem (nadal) w trakcie robienia czegoś podobnego do tego problemu, ale używam tej samej ścieżki, o której wspomniałem. Prolog (jako język funkcjonalny) naprawdę ułatwia rozwiązywanie problemów NP-Hard.

Źródło
Translate

Do takiego planowania często stosuje się algorytmy genetyczne.

Znalezionyten przykład (Tworzenie planu zajęć za pomocą algorytmu genetycznego)co całkiem dobrze pasuje do twoich wymagań.

Źródło
Translate

Oto kilka linków, które znalazłem:

Plan lekcji- Wymienia niektóre związane z tym problemy

Hybrydowy algorytm genetyczny do planowania zajęć w szkole

Narzędzia i narzędzia planowania

Źródło
Translate

Mój algorytm planowania, zaimplementowany w FET (bezpłatne oprogramowanie do rozkładania jazdy,http://lalescu.ro/liviu/fet/, pomyślna aplikacja):

Algorytm jest heurystyczny. Nazwałem to „zamianą rekurencyjną”.

Dane wejściowe: zbiór działań A_1 ... A_n i ograniczeń.

Wynik: zestaw czasów TA_1 ... TA_n (przedział czasowy każdej czynności. Pomieszczenia są tutaj wykluczone dla uproszczenia). Algorytm musi umieścić każdą czynność w przedziale czasowym, przestrzegając ograniczeń. Każdy TA_i zawiera się w przedziale od 0 (T_1) do max_time_slots-1 (T_m).

Ograniczenia:

C1) Podstawowe: lista par zajęć, które nie mogą być jednoczesne (na przykład A_1 i A_2, ponieważ mają tego samego nauczyciela lub tych samych uczniów);

C2) Wiele innych ograniczeń (wykluczonych tutaj dla uproszczenia).

Algorytm planowania (który nazwałem „rekurencyjną wymianą”):

  1. Sortuj czynności, najpierw najtrudniejsze. Nie jest to krok krytyczny, ale przyspiesza algorytm może 10 razy lub więcej.
  2. Spróbuj umieścić każdą czynność (A_i) w dozwolonym przedziale czasowym, postępując zgodnie z powyższą kolejnością, pojedynczo. Wyszukaj dostępną szczelinę (T_j) dla A_i, w której można umieścić tę czynność z zachowaniem ograniczeń. Jeśli dostępnych jest więcej miejsc, wybierz losowy. Jeśli żadna nie jest dostępna, wykonaj wymianę rekurencyjną:

    a. Dla każdego przedziału czasowego T_j zastanów się, co się stanie, jeśli wstawisz A_i do T_j. Pojawi się lista innych zajęć, które nie zgadzają się z tym posunięciem (na przykład działanie A_k znajduje się na tym samym polu T_j i ma tego samego nauczyciela lub tych samych uczniów co A_i). Prowadź listę kolidujących działań dla każdego przedziału czasowego T_j.

    b. Wybierz boks (T_j) z najniższą liczbą kolidujących działań. Powiedzmy, że lista działań w tym slocie zawiera 3 aktywności: A_p, A_q, A_r.

    c. Umieść A_i w T_j i spraw, aby A_p, A_q, A_r były nieprzydzielone.

    d. Rekurencyjnie spróbuj umieścić A_p, A_q, A_r (jeśli poziom rekurencji nie jest zbyt duży, powiedzmy 14, i jeśli całkowita liczba rekurencyjnych wywołań liczonych od kroku 2) na A_i rozpoczęta nie jest zbyt duża, powiedzmy 2 * n), jak w kroku 2).

    e. Jeśli pomyślnie umieścisz A_p, A_q, A_r, wróć z sukcesem, w przeciwnym razie wypróbuj inne przedziały czasowe (przejdź do kroku 2 b) i wybierz następny najlepszy przedział czasowy).

    f. Jeśli wszystkie (lub rozsądna liczba) przedziałów czasowych zostały bezskutecznie wypróbowane, wróć bez powodzenia.

    g. Jeśli jesteśmy na poziomie 0 i nie udało nam się umieścić A_i, umieść go tak, jak w krokach 2 b) i 2 c), ale bez rekursji. Mamy teraz 3 - 1 = 2 więcej działań do umieszczenia. Przejdź do kroku 2) (tutaj zastosowano kilka metod unikania jazdy na rowerze).

Źródło
Translate

Zaprojektowałem komercyjne algorytmy do planowania zajęć i egzaminów. W pierwszym przypadku użyłem programowania liczb całkowitych; po drugie heurystyka oparta na maksymalizacji funkcji celu poprzez wybór zamiany slotów, bardzo podobna do pierwotnego procesu ręcznego, który został wyewoluowany. Główną cechą akceptacji takich rozwiązań jest zdolność do reprezentowania wszystkich ograniczeń świata rzeczywistego; a ludzcy planiści nie mogli znaleźć sposobów na ulepszenie rozwiązania. Ostatecznie część algorytmiczna była dość prosta i łatwa do wdrożenia w porównaniu z przygotowaniem baz danych, interfejsem użytkownika, możliwością raportowania statystyk, takich jak wykorzystanie pokoju, edukacja użytkowników i tak dalej.

Źródło
Translate

Ten artykuł dość dobrze opisuje problem z planem lekcji i podejście do algorytmu: „Rozwój SYLLABUS - interaktywnego, opartego na ograniczeniach harmonogramu dla szkół i uczelni.„[PDF]

Autor informuje mnie, że oprogramowanie SYLLABUS jest nadal używane / rozwijane tutaj:http://www.scientia.com/uk/

Źródło
Translate

Pracuję na powszechnie używanym silniku planowania, który robi dokładnie to. Tak, jest to NP-Complete; Najlepsze podejścia mają na celu przybliżenie optymalnego rozwiązania. I oczywiście istnieje wiele różnych sposobów, aby powiedzieć, które z nich jest „najlepsze” - czy ważniejsze jest, aby nauczyciele byli zadowoleni ze swoich harmonogramów, czy na przykład uczniowie uczestniczyli we wszystkich swoich zajęciach?

Absolutnie najważniejsze pytanie, które musisz rozwiązać na początku, brzmico sprawia, że jeden sposób planowania tego systemu jest lepszy od innego? To znaczy, jeśli mam harmonogram z panią Jones, która uczy matematyki w wieku 8 lat, a panem Smithem w wieku 9 lat, czy to jest lepsze, czy gorsze niż w przypadku, gdy oboje uczą matematyki w wieku 10 lat? Czy jest lepsze czy gorsze niż ten, w którym pani Jones uczy w wieku 8 lat, a pan Jones uczy w wieku 2 lat? Czemu?

Główną radą, jaką tutaj dałbym, jest podzielenie problemu tak bardzo, jak to tylko możliwe - może oczywiście po kursie, może nauczyciel po nauczycielu, może pokój po pokoju - i najpierw popracuj nad rozwiązaniem problemu podrzędnego. Tam powinieneś skończyć z wieloma rozwiązaniami do wyboru i wybrać jedno z najbardziej optymalnych. Następnie pracuj nad tym, aby „wcześniejsze” podproblemy uwzględniały potrzeby późniejszych podproblemów w punktacji ich potencjalnych rozwiązań. Następnie może popracuj nad tym, jak wydostać się z sytuacji wymalowanych w róg (zakładając, że nie możesz ich przewidzieć we wcześniejszych podproblemach), kiedy dojdziesz do stanu „brak ważnych rozwiązań”.

Przebieg optymalizacji wyszukiwania lokalnego jest często używany do „wypolerowania” odpowiedzi końcowej w celu uzyskania lepszych wyników.

Zauważ, że zazwyczaj mamy do czynienia z systemami o bardzo ograniczonych zasobach w planowaniu lekcji. Szkoły nie trwają przez cały rok, gdy przez 75% dnia jest dużo pustych pokoi lub nauczyciele siedzą w salonach. Podejścia, które działają najlepiej w środowiskach bogatych w rozwiązania, niekoniecznie mają zastosowanie w planowaniu zajęć w szkole.

Źródło
Translate

Ogólnie, programowanie z ograniczeniami jest dobrym podejściem do tego typu problemów związanych z planowaniem. Wyszukiwanie słów „programowanie z ograniczeniami” i planowanie lub „planowanie oparte na ograniczeniach” zarówno w przypadku przepełnienia stosu, jak i w Google wygeneruje dobre odniesienia. Nie jest to niemożliwe - po prostu trochę trudno o tym pomyśleć, korzystając z tradycyjnych metod optymalizacji, takich jak optymalizacja liniowa lub całkowita. Jednym z wyników byłoby - czy istnieje harmonogram, który spełnia wszystkie wymagania? To samo w sobie jest oczywiście pomocne.

Powodzenia !

Źródło
Translate

Możesz to zrobić za pomocą algorytmów genetycznych, tak. Ale nie powinieneś :). Może to być zbyt wolne, a dostrajanie parametrów może być zbyt czasochłonne itp.

Istnieją udane inne podejścia. Wszystko zaimplementowane w projektach open source:

  • Constraint based approach
    • Wdrożone wUniTime(raczej nie dla szkół)
    • Możesz także pójść dalej i użyć programowania typu Integer. Pomyślnie zrobiono oUniwersytet w Udinea także na Uniwersytecie Bayreuth (byłem tam zaangażowany) przy użyciu komercyjnego oprogramowania (ILOG CPLEX)
    • Podejście oparte na regułach z heurystyskiem - zobaczPlaner ślinek
  • Różne heurystyki -FETimój własny

Zobacz tutajlista programów do planowania

Źródło
Translate

Myślę, że powinieneś użyć algorytmu genetycznego, ponieważ:

Spójrz także na:podobne pytanieiinny

Źródło
Modesty Lee
Translate

Nie wiem, kto zgodzi się z tym kodem, ale opracowałem ten kod przy pomocy własnego algorytmu i pracuje dla mnie w języku ruby, mam nadzieję, że pomoże to tym, którzy szukają go w następującym kodzie: periodflag, dayflag subjectflag i teacherflag to hash z odpowiednim identyfikatorem i wartością flagi, która jest wartością logiczną. Jakikolwiek problem, skontaktuj się ze mną ....... (-_-)

periodflag.each do | k2, v2 |

            if(TimetableDefinition.find(k2).period.to_i != 0)
                subjectflag.each do |k3,v3|
                    if (v3 == 0)
                        if(getflag_period(periodflag,k2))
                            @teachers=EmployeesSubject.where(subject_name: @subjects.find(k3).name, division_id: division.id).pluck(:employee_id)
                            @teacherlists=Employee.find(@teachers)
                            teacherflag=Hash[teacher_flag(@teacherlists,teacherflag,flag).to_a.shuffle] 
                            teacherflag.each do |k4,v4|
                                if(v4 == 0)
                                    if(getflag_subject(subjectflag,k3))
                                        subjectperiod=TimetableAssign.where("timetable_definition_id = ? AND subject_id = ?",k2,k3)
                                        if subjectperiod.blank?
                                            issubjectpresent=TimetableAssign.where("section_id = ? AND subject_id = ?",section.id,k3)
                                            if issubjectpresent.blank?
                                                isteacherpresent=TimetableAssign.where("section_id = ? AND employee_id = ?",section.id,k4)
                                                if isteacherpresent.blank?
                                                    @finaltt=TimetableAssign.new
                                                    @[email protected]_struct.id
                                                    @finaltt.employee_id=k4
                                                    @finaltt.section_id=section.id
                                                    @finaltt.standard_id=standard.id
                                                    @finaltt.division_id=division.id
                                                    @finaltt.subject_id=k3
                                                    @finaltt.timetable_definition_id=k2
                                                    @finaltt.timetable_day_id=k1
                                                    set_school_id(@finaltt,current_user)
                                                    if(@finaltt.save)

                                                        setflag_sub(subjectflag,k3,1)
                                                        setflag_period(periodflag,k2,1)
                                                        setflag_teacher(teacherflag,k4,1)
                                                    end
                                                end
                                            else
                                                @subjectdetail=TimetableAssign.find_by_section_id_and_subject_id(@section.id,k3)
                                                @finaltt=TimetableAssign.new
                                                @[email protected]_struct_id
                                                @[email protected]_id
                                                @finaltt.section_id=section.id
                                                @finaltt.standard_id=standard.id
                                                @finaltt.division_id=division.id
                                                @[email protected]_id
                                                @finaltt.timetable_definition_id=k2
                                                @finaltt.timetable_day_id=k1
                                                set_school_id(@finaltt,current_user)
                                                if(@finaltt.save)

                                                    setflag_sub(subjectflag,k3,1)
                                                    setflag_period(periodflag,k2,1)
                                                    setflag_teacher(teacherflag,k4,1)
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
Źródło