Vytautas Perlibakas. Mokyklos pamokų tvarkaraščio optimizavimo uždavinys. Kaunas, 2000.

TURINYS

1. Užduotis *
2. Užduoties analizė *
    2.1 Apribojimai *
    2.2 Duomenų struktūra *
3. Tvarkaraščio perstatymo ir įvertinimo algoritmas *
4. Tvarkaraščio tikrinimas ir klaidų taisymas *
5. Programos įdiegimas *
6. Vartotojo vadovas *
    7.1 Pradinių duomenų įvedimas *
    7.2 Rezultatų išsaugojimas *
7. Literatūra *
Priedai *
    P1. Demonstracinio tvarkaraščio taisymas ir optimizavimas *

1. Užduotis

    Optimizuoti mokyklos vienos savaitės tvarkaraštį minimizuojant mokytojo langų skaičių per dieną. Patikrinti pradinį tvarkaraštį, automatiškai ištaisyti klaidas nurodant jų buvimo vietą.

2. Užduoties analizė

    Mokyklos tvarkaraščio sudarymas - tai gerai žinomas bendresnės tvarkaraščio problemos pavyzdys. Optimizuojant mokyklos tvarkaraštį siekiama sumažinti mokytojo laukimo valandų (langų) skaičių, įvertinant tvarkaraščiui nurodomus apribojimus.

2.1 Apribojimai

    Sudarant ir optimizuojant mokyklos tvarkaraštį reikia atsižvelgti į tam tikrus apribojimus, t.y. pamokos tvarkaraštyje išdėstomos pagal tam tikras taisykles:
        1. Mokiniai negali turėti langų
        2. Vienu metu mokytojas gali vesti tik vieną pamoką
        3. Vienu metu mokinys gali dalyvauti tik vienoje pamokoje
        4. Kai kurios pamokos gali būti sudvejintos (pvz.: dvi lietuvių kalbos pamokos iš eilės)
        5. Klasės gali būti skaidomos į dalis (rusų/anglų/vokiečių kalbos)
        6. Pamokų skaičius per dieną yra ribotas
    Optimizavimas pradedamas nuo jau sudaryto mokyklos tvarkaraščio.

2.2 Duomenų struktūra

    Mokomasi 5 dienas per savaitę (pirmadienis, antradienis, trečiadienis, ketvirtadienis, penktadienis). Kiekvieną dieną gali būti ne daugiau kaip 7 pamokos.
    Mokyklos savaitės tvarkaraštis saugomas masyve Mokytojai[M][3+5*7], M - mokytojų skaičius.
    Čia Mokytojai[i] - informacija apie i-ąjį mokytoją (i=1..M) :
        Mokytojai[i][1] - mokytojo pavardė
        Mokytojai[i][2] - mokytojo dėstomo dalyko pavadinimas
        Mokytojai[i][3] - mokytojo kabineto koduotas simbolis:
            "0" - jeigu mokytojo dėstomam dalykui nereikalingas specialus kabinetas.
            "R" - šio dalyko pamokos gali eiti viena paskui kitą. Pvz.: klasė gali turėti 2 lietuvių kalbos, darbų ar kūno kultūros pamokas iš eilės.
            "D" - pamokos per kurias klasė skaidoma į dvi dalis, t.y. klasė turi dvi pamokas tuo pat metu. Pvz.: kūno kultūra. Taip pažymėtos turi būti abi pamokos.
            "B" - galimos viena paskui kitą einančios pamokos, paskirstytos keliems mokytojams (atitinka "D" + "R"). Pvz.: darbų pamoka gali vykti pas skirtingus mokytojus ir po 2 pamokas iš eilės. Abu dalykai turi būti pažymėti "B" raide.
        Mokytojai [i][j], j=4..38 - i-ojo mokytojo pamokų tvarkaraštis savaitei, kuriame pažymėta savaites diena, pamokos numeris ir klasė, kuriai ši pamoka vedama.
        Savaitės dienų žymėjimas: P-pirmadienis, A-antradienis, T-trečiadienis, K-ketvirtadienis, N-penktadienis.
        Kiekvieną dieną gali būti ne daugiau kaip 7 pamokos (1,2,3,4,5,6,7), kurios priklausomai nuo savaitės dienos žymimos: P1, P2, P3, P4, P5, P6, P7, A1, ..., A7, T1, ..., T7, K1, ..., K7, N1, ..., N7.
        Likusi žymėjimo dalis laikoma klasės pavadinimu.
        Mokytojo langai žymimi simboliu "X".
        Jei mokytojas pasirinktą savaitės dieną neturi pirmų ar paskutinių pamokų, tokios pamokos langais nelaikomos ir žymimos simboliu "Q".
        Pavyzdžiui, žymėjimas "P19c" reiškia:
            "P" - pirmadienis
            "1" - pirma pamoka, "P1" - pirmadienį pirma pamoka
            "9c" - pamoka vedama 9c klasei

3. Tvarkaraščio perstatymo ir įvertinimo algoritmas

    1. Nuskaityti duomenis į masyvą Mokytojai[M][38] ir perkopijuoti juos į masyvą Mokytojai0
    2. Suskaičiuoti mokytojų langų skaičių eval0 pradiniame tvarkaraštyje
    3. Nustatyti pradinį iteracijos numerį it = 0
    4. Nustatyti esamą iteraciją it = it + 1, it < K
    5. Jei it = K, nustoti skaičiuoti ir spausdinti esamą tvarkaraštį
    6. Nustatyti pradinį mokytojų skaitliuką kel = 0
    7. Jeigu kel >M-1, eiti į (4) punktą
    8. Sugeneruoti atsitiktinį skaičių x iš intervalo [0,1]
    9. Jei x < pt.x[0], eiti į (13) punktą
    10. Rasti mokytojo langą
    11. Rasti patogią pamoką
    12. Patikrinti ar toks sukeitimas galimas ir jei taip, tai eiti į (14) punktą
    13. Priskirti kel = kel + 1 ir eiti į (7) punktą
    14. Sukeisti langą ir patogią pamoką vietomis
    15. Suskaičiuoti mokytojų langus eval
    16. Palyginti eval ir eval0
    17. Jei eval < eval0, sukeisti esamą tvarkaraštį su pradiniu ir eiti į (7) punktą

4. Tvarkaraščio tikrinimas ir klaidų taisymas

    Tikrinimas atliekamas atsižvelgiant į tvarkaraščiui keliamus apribojimus, nurodomus naudojant duomenų struktūros aprašyme pateiktus žymėjimus. Apie surastas bei ištaisytas klaidas pranešama vartotojui, nurodant klasę ir, jei įmanoma, koordinates pamokos, kurią tikrinant surasta klaida.
    Tikrinamos bei taisomos tokios klaidos:
        1. Klasė turi iš eilės 2 ar daugiau pamokų.
        2. Klasė turi 2 ar daugiau pamokų tuo pačiu metu.
        3. Klasė turi langą, t.y pažeistas pamokų nuoseklumas.
        Pastaba: punktai 1-2 klaidomis nelaikomi, jei toks išsidėstymas buvo leidžiamas nurodant ribojimus naudojant duomenų struktūros aprašyme pateiktus žymėjimus.
    Pateiksime klaidų taisymo algoritmų aprašymus.
        1. Klasė turi iš eilės 2 ar daugiau pamokų.
            1.1 Tikrinama kiekvienam mokytojui, ar nėra kelių pamokų iš eilės tai pačiai klasei.
            1.2 Aptikus 2 pamokas iš eilės bandoma sukeisti vieną iš tų pamokų su:
                1.2.1 To mokytojo langu “X” arba patogia pamoka “Q”.
                Atsižvelgiama į tai, ar perkėlus neatsiras naujų klaidų.
                1.2.2 Kitos klasės pamoka.
                Atsižvelgiama į tai, ar perkėlus neatsiras klaidų abiem klasėms.
            1.3 Išvedamas pranešimas apie klaidą bei taisymo rezultatą.
        2. Klasė turi 2 ar daugiau pamokų tuo pačiu metu.
            2.1 Tikrinama kiekvienai savaitės tvarkaraščio pamokai, ar nėra klasei kelių pamokų tuo pačiu metu.
            2.2 Aptikus kelias pamokas tuo pačiu metu bandoma sukeisti vieną iš tų pamokų su:
                2.2.1 To pačio mokytojo langu “X” arba patogia pamoka “Q”.
                Atsižvelgiama į tai, ar perkėlus neatsiras naujų klaidų.
                2.2.2 Kitos klasės pamoka.
                Atsižvelgiama į tai, ar perkėlus neatsiras klaidų abiem klasėms.
            2.3 Išvedamas pranešimas apie klaidą bei taisymo rezultatą.
        3. Klasė turi langą, t.y pažeistas pamokų nuoseklumas.
            Panaudotos papildomos duomenų struktūros: masyvas KlPam[], kuriame saugomi indeksai stulpelių, iš kurių patogu nukelti nagrinėjamos klasės pamoką, norint užpildyti klasės langą; bei kl[], kuriame surašytos visos tvarkaraščio klasės. Algoritmas atrodo taip :
            3.1 Kiekvienai klasei iš kl[] masyvo tikrinama, ar yra langų.
            3.2 Aptikus langą, į masyvą KlPam[] surašomi perkėlimui patogių stulpelių indeksai.
            3.3 Kiekvienam tų indeksų bandoma atlikti pamokų keitimą, atsižvelgiant ar perkėlus neatsiras naujų klaidų.
                3.3.1 Bandoma perkelti pamokas į laisvas vietas (“Q” arba “X”).
                3.3.2 Jei nepavyksta, keliama į kitos klasės pamokos vietą, atlikus atitinkamus tikrinimus.
            3.4 Sėkmingo taisymo atveju ieškoma kito einamos klasės lango. Radus langą, pereinama į 3.2 punktą, priešingu atveju pereinama į 3.1 punktą. Apie taisymo rezultatą pranešama vartotojui.
            3.5 Patikrinus kiekvieną klasę, tikrinimas bei taisymas baigiamas.

5. Programos įdiegimas

    Tvarkaraščio optimizavimo programinė įranga yra paketo GMJ1 (Global Minimizer for Java) dalis. Programa gali būti paleidžiama kaip Java programa arba kaip Java apletas. Norint vykdyti Java programą, reikalinga "Java 2 Runtime Environment" ar kita aplinka, leidžianti vykdyti Java programas ir turinti Java virtualią mašiną ir Java API klases. Norint vykdyti Java apletus, reikalinga apletų peržiūrėjimo programa (pvz., "AppletViewer") arba Java apletus palaikanti naršyklė (pvz., "Microsoft Internet Explorer 4.x" arba "Netscape Navigator 4.x"). Norint kad apletai naudotų ne naršyklės Java aplinką, o "Java 2 Runtime Environment", reikia įdiegti "Java Plug-in".
    Programa įdiegiama išarchyvuojant failą tvarka.zip į norimą katalogą. Paleidžiamieji failai yra "gmj.bat" ir "gmj.htm". Norint įdiegti programą serveryje, taip pat reikia sukonfigūruoti cgi skriptus. Detalus įdiegimo ir konfigūravimo aprašymas bei pradinių duomenų failų pavyzdžiai pateikiami archyve kartu su programine įranga.

6. Vartotojo vadovas

    Programa paleidžiama vykdant failą "gmj.bat" arba "gmj.htm". Pasirodžius GMJ programos langui atlikite tokius veiksmus:
        1. Pasirinkite optimizavimo metodą ir nurodykite jo parametrus, pvz., "Method->Select method and properties:Mig1".
        2. Pasirinkite vykdymui užduotį "Task->Select task and properties:Tvarka". Atsidariusiame tvarkaraščio įvedimo lange "SheduleLoader" įveskite norimą optimizuoti tvarkaraštį ir paspauskite "OK". GMJ lange esančiuose laukeliuose galima nurodyti iteracijų skaičių K bei tikimybės minimalią, maksimalią ir pradinę reikšmę.
        3. Optimizavimas pradedamas paspaudus "Operation->Run". Optimizavimą galima bet kada sustabdyti, paspaudus mygtuką "Stop" arba padaryti pauzę skaičiavimuose paspaudus mygtuką "Pause".
        Skaičiavimams pasibaigus pateikiami tokie rezultatai: iteracijų, per kurias metodas sukonvergavo į minimumą, skaičius, gauta minimali optimizuojamos funkcijos F(x) reikšmė ir gautos atitinkamų taisyklių parinkimo optimizavimo metu proporcijos.
        Optimizuotas tvarkaraštis peržiūrimas pasirinkus "Run analysis: TvarkaAnalyser".

6.1 Pradinių duomenų įvedimas

    Pradinių duomenų įvedimui naudojamas langas "SheduleLoader", atsirandantis pasirinkus "Select task and properties: Tvarka". Kadangi programa gali būti paleidžiama kaip Java programa (angl. application) arba kaip Java apletas (angl. applet), naudojami skirtingi pradinių duomenų įvedimo būdai dėl nepasirašytiems apletams taikomų saugumo apribojimų.
    Leidžiant programą kaip application, paprasčiausia pradinį tvarkaraštį įvesti pasirinkus "Open file" ir nurodžius tekstinį failą, kuriame yra kitais tekstiniais redaktoriais suvestas tvarkaraštis.
    Leidžiant programą iš naršyklės kaip applet, paprasčiausia naudoti "karštu" klavišų kombinacijas, skirtas duomenų apsikeitimui per apsikeitimo buferį:
        1. Microsoft Windows sistemoje: "Ctrl+C" ir "Ctrl+V" arba "Ctrl+Insert" ir "Shift+Insert"
        2. UNIX sistemoje: "Ctrl+C" ir "Shift+Insert"
        3. Kitose sistemose: minėtų klavišų atitikmenys toje sistemoje
    Kitas būdas - nusiųsti tvarkaraštį į serverį naudojant mygtuką "Upload shedule to server", ir nusiuntus užkrauti jį į redagavimo laukelį paspaudus mygtuką "Load uploaded shedule from server".

    Realizuota ir daugiau pradinio tvarkaraščio užkrovimo būdų:

    1. Mygtukas "Load shedule from URL".
        Paspaudus mygtuką "Load shedule from URL", užkraunamas tvarkaraščio failas, kurio adresas įvestas redagavimo laukelyje. Pvz.: http://www.soften.ktu.lt/~vartotojas/tvarkarastis/mokytojai.txt
        Veikimas: (+)application, (+-)applet
        Jei leidžiam kaip applet, galima užkrauti failus tik iš to serverio, kuriame yra apletas, o iš kitų serverių neužkrauna dėl saugumo apribojimų apletų komunikavimui.

    2. Mygtukai "Paste shedule from clipboard" ir "Copy shedule to clipboard".
        Paspaudus mygtuką "Paste shedule from clipboard" į redagavimo laukelį įkeliama informacija (tvarkaraštis), esanti sistemos apsikeitimo buferyje. Į buferį tą informaciją turėtų patalpinti kita programa, kurioje buvo suvedamas tvarkaraštis (pvz.: Word'e, pažymėjus tekstą ir paspaudus Ctrl+C arba meniu komanda Edit->Copy).
        Paspaudus mygtuką "Copy shedule to clipboard" redagavimo laukelyje esanti informacija patalpinama į sistemos apsikeitimo buferį. Tada kitoje programoje, pvz. Word'e galima įsikelti patalpintą informaciją paspaudus Ctrl+V arba meniu komanda Edit->Paste.
        Veikimas: (+)application, (+-)applet
        Applet neveikia, nes untrusted apletas negali prieiti prie sistemos buferio dėl saugumo apribojimų. Todėl norint apsikeisti per buferi reikės pažymėti tekstą ir naudoti klavišų kombinacijas "Ctrl+C", "Ctrl+V" ar jų atitikmenis informacijos įkėlimui į buferį ir paėmimui iš jo.

    3. Klavišų kombinacijos Ctrl+V, Ctrl+C ar jų atitikmenys.
        Kokiu nors būdu pažymime tekstą programoje, kurioje yra įvestas tvarkaraštis, ir patalpiname jį į sistemos apsikeitimo buferį (clipboard). Pvz. Word'e, Notepad'e galim žymėti klavišo Shift ir rodyklių pagalba, o į buferį patalpinti paspaudus klavišus Ctrl+C. Aktyvizuojame tvarkaraščio įvedimo lange esantį tvarkaraščio įvedimo laukelį ir spaudžiame Ctrl+V, kad patalpinti į laukelį informaciją, esančią apsikeitimo buferyje. Skirtingose sistemose klavišai gali būti ir kitokie (nebūtinai Ctrl+C ir Ctrl+V). Microsoft Windows sistemoje į buferį tekstiniame redaktoriuje reikia kopijuoti su "Ctrl+C", o į "SheduleLoader" iš buferio įkelti su "Ctrl+V" (arba "Ctrl+Insert" ir "Shift+Insert"). UNIX sistemoje į buferį kopijuoti grafiniame redaktoriuje reikia su "Ctrl+C", o į "SheduleLoader" iš buferio įkelti su "Shift+Insert". Kitose sistemose reikia naudoti minėtų klavišų atitikmenis toje sistemoje.
        Veikimas: (+)application, (+)applet

    4. Tvarkaraščio įvedimas.
        Jei tvarkaraščio kompiuteryje dar neturite, galite jį suvesti klaviatūros pagalba tvarkaraščio įvedimo lange esančiame tvarkaraščio įvedimo laukelyje.
        Veikimas: (+)application, (+)applet

    5. Mygtukai "Upload shedule to server", "Load uploaded shedule from server".
        Mygtuko "Upload shedule to server" paspaudimas atidaro langą tvarkaraščio failo perdavimui iš vietinio disko į serverį, kad iš serverio jį galėtų pasiimti optimizavimo programa. Tiesiai iš vietinio disko optimizavimo programa, leidžiama kaip applet, skaityti informacijos negali dėl saugumo apribojimų. Naudojami cgi skriptai failo nusiuntimui į serverį. Nusiųstas tvarkaraštis įrašomas serveryje į failą, iš kurio tvarkaraštis paimamas ir pavaizduojamas tvarkaraščio įvedimo laukelyje paspaudus mygtuką "Load uploaded shedule from server".
        Veikimas: (-)application, (+)applet

    6. Mygtukas "Open file".
        Paspaudus mygtuką "Open file", atsidaro failo pasirinkimo iš vietinio disko dialogas, kuriame pasirinktas failas nuskaitomas ir pavaizduojamas tvarkaraščio įvedimo laukelyje.
        Veikimas: (+)application, (-)applet

    7. Mygtukas "Load demo shedule".
        Paspaudus mygtuką "Load demo shedule", užkraunamas demonstracinis tvarkaraštis.
        Veikimas: (+)application, (+)applet

    Įvedus pradinį tvarkaraštį, spaudžiamas mygtukas "OK" ir šis tvarkaraštis perduodamas optimizavimo programai.

    Išsamesnį tvarkaraščio įvedimo būdų ir kitų lange esančių mygtukų aprašymą galima rasti "SheduleLoader" lange paspaudus mygtuką "Help".

6.2 Rezultatų išsaugojimas

    Rezultatų peržiūrai ir išsaugojimui naudojamas langas "TvarkaAnalyser", atsirandantis pasirinkus "Run analysis: TvarkaAnalyser". Kadangi programa gali būti paleidžiama kaip Java programa arba kaip Java apletas, naudojami skirtingi rezultatų išsaugojimo būdai dėl nepasirašytiems apletams taikomų saugumo apribojimų.

    Realizuoti tokie tvarkaraščio išsaugojimo būdai:

    1. Mygtukas "Save shedule to server and view".
        Tvarkaraštis išsaugomas į failą serveryje, o po to išsaugotas failas užkraunamas interneto naršyklės lange. Turėdami tvarkaraštį naršyklėje, galime jį išsaugoti į failą pasirinkdami naršyklės meniu "File->Save As". Galime naršyklės lange matomą tvarkaraštį pasižymėti, nukopijuoti į apsikeitimo buferį ir įkelti į kitą programą. (Edit->Copy, Edit->Paste, Ctrl+C, Ctrl+V ar jų atitikmenys).
        Veikimas: (-)application (+)applet

    2. Mygtukas "Copy shedule to clipboard".
        Paspaudus mygtuką "Copy shedule to clipboard" redagavimo laukelyje esanti informacija patalpinama į sistemos apsikeitimo buferį. Tada kitoje programoje, pvz. Word'e galite įsikelti patalpintą informaciją paspaudę Ctrl+V arba meniu komanda Edit->Paste.
        Veikimas: (+)application, (+-)applet
        Applet neveikia, nes untrusted apletas negali prieiti prie sistemos buferio dėl saugumo apribojimų. Todėl norint apsikeisti per buferį reikės pažymėti tekstą ir naudoti klavišų kombinacijas "Ctrl+C", "Ctrl+V" ar jų atitikmenis informacijos įkėlimui į buferį ir paėmimui iš jo.

    3. Klavišų kombinacijos Ctrl+V, Ctrl+C ar jų atitikmenys.
        Pažymime tekstą tvarkaraščio išvedimo lange norimu būdu, pavyzdžiui, tai galima padaryti laikant nuspaustą Shift klavišą ir žymint rodyklių pagalba. Į sistemos apsikeitimo buferį pažymėtas tekstas patalpinamas paspaudus klavišus Ctrl+C. Aktyvizuojame kitos programos, į kurią norime įkelti tvarkaraštį, langą ir spaudžiame Ctrl+V arba pasirenkame iš meniu "Edit->Paste" ar kitą atitinkamą klavišų kombinaciją. Skirtingose sistemose klavišai gali būti ir kitokie (nebūtinai Ctrl+C ir Ctrl+V).
        Veikimas: (+)application (+)applet

    4. Mygtukas "Save shedule to file".
        Mygtuko "Save shedule to file" paspaudimas atidaro tvarkaraščio failo išsaugojimo dialogą, kuriame įvedamas failo pavadinimas, kokiu norime išsaugoti tvarkaraštį vietiniame diske.
        Veikimas: (+)application (-)applet

    Išsamesnį tvarkaraščio išsaugojimo būdų ir kitų lange esančių mygtukų aprašymą galima rasti "TvarkaAnalyser" lange paspaudus mygtuką "Help".

7. Literatūra

[1] D.Švirmickienė ir A.Zakšauskaitė. Mokyklos pamokų tvarkaraščio uždavinys. Techninė ataskaita, Vytauto Didžiojo Universitetas, Informatikos fakultetas, Lietuva, Kaunas, 1998.
[2] T.Danikauskas, S.Drąsutis. Mokyklos tvarkaraščio uždavinys. 1998.
[3] A.Sidorov. Mokyklos tvarkaraščio uždavinys. Kaunas, 1999.
[4] V.Marcinkevičius, D.Švirmickienė, A.Zakšauskaitė. Mokyklos pamokų tvarkaraščio optimizavimo uždavinys. Kaunas, 1999.
[5] J.Mockus, W.Eddy, A.Mockus, L.Mockus, and G.Reklaitis. Bayesian Heuristic Approach to Discrete and Global Optimization. Kluwer Academic Publishers, Dordrecht-London-Boston, 1997.
[6] M.Grybauskas. Global Minimizer for Java (GMJ) Version 1.1. Developer's and Power User's Guide. Kaunas, 1997.

Priedai

P1. Demonstracinio tvarkaraščio taisymas ir optimizavimas

Pradinis demonstracinis tvarkaraštis (langų skaičius 9):

O.Dailidaviciene lietuviu_k D P112d P26b P39d P46c Q Q Q A16c A212d A312d A46b A59d A610c Q T16b T26c T39d X T510c T612d Q K19d K29d K310c K46b K56c Q Q N16c N212d N36b X N510c N610c Q
V.Vilkiene lietuviu_k D P112b P212b P312a P412c P55b Q Q A19c A25b A312a A412b A512c A612c Q T19c X T312c T412b T55b Q Q K112a K212a K35b K412b X K69c Q N19c N29c N312a N45b X N612c Q
N.Kazokeviciene lietuviu_k D P15c P26a X P48c P56d P68b Q A18c A28b A35c A46d X A66a Q T16a T26d X T48b T55c T68c Q K15c K26a K38b K46d K58c Q Q N15c N26a N38c N48b N56d Q Q
J.Kaminskiene choreografija 0 Q Q P35d X P55a Q Q Q Q Q Q A55c A65b Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
Z.Kublickas ekonomika 0 Q Q Q Q Q Q Q Q Q Q Q Q Q A711a Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q

Pranešimai apie klaidas ir jų ištaisymą:
    5b klasė turi langą 10 stulpelyje. Ištaisyta sėkmingai
    5c klasė turi langą 11 stulpelyje. Ištaisyta sėkmingai

Komentarai pranešimams:

    1. "5b klasė turi langą 10 stulpelyje"
        V.Vilkiene 9 stulpelyje turi pamoką A25b, J.Kaminskiene 13 stulpelyje turi pamoką A65b, vadinasi 5b klasė turi langą 10,11,12 stulpelyje (pamokos A3,A4,A5).
        Langas panaikinamas perkėlus J.Kaminskienes pamoką 5b klasei iš A6 į A3, t.y. iš A65b į A35b.

    2. "5c klasė turi langą 11 stulpelyje"
        N.Kazokeviciene 10 stulpelyje turi pamoką A35c, J.Kaminskiene 12 stulpelyje turi pamoką A55c, vadinasi 5c klasė turi langą 11 stulpelyje (pamoka A4).
        Langas panaikinamas perkėlus J.Kaminskienes pamoką 5c klasei iš A5 į A4, t.y. iš A55c į A45c.

Ištaisytas tvarkaraštis (langų skaičius 9):

O.Dailidaviciene lietuviu_k D P112d P26b P39d P46c Q Q Q A16c A212d A312d A46b A59d A610c Q T16b T26c T39d X T510c T612d Q K19d K29d K310c K46b K56c Q Q N16c N212d N36b X N510c N610c Q
V.Vilkiene lietuviu_k D P112b P212b P312a P412c P55b Q Q A19c A25b A312a A412b A512c A612c Q T19c X T312c T412b T55b Q Q K112a K212a K35b K412b X K69c Q N19c N29c N312a N45b X N612c Q
N.Kazokeviciene lietuviu_k D P15c P26a X P48c P56d P68b Q A18c A28b A35c A46d X A66a Q T16a T26d X T48b T55c T68c Q K15c K26a K38b K46d K58c Q Q N15c N26a N38c N48b N56d Q Q
J.Kaminskiene choreografija 0 Q Q P35d X P55a Q Q Q Q A35b A45c Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
Z.Kublickas ekonomika 0 Q Q Q Q Q Q Q Q Q Q Q Q Q A711a Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q

Optimizuotas tvarkaraštis (langų skaičius 0)

Nr. Mokytojas Dalykas Klase 1P1 1P2 1P3 1P4 1P5 1P6 1P7 2P1 2P2 2P3 2P4 2P5 2P6 2P7 3P1 3P2 3P3 3P4 3P5 3P6 3P7 4P1 4P2 4P3 4P4 4P5 4P6 4P7 5P1 5P2 5P3 5P4 5P5 5P6 5P7
1 O.Dailidaviciene lietuviu_k D P112d P26b P39d P46c Q Q Q A16c A212d A312d A46b A59d A610c Q Q T26c T39d T46b T510c Q Q K19d K29d K310c K46b K56c Q Q N16c N212d N36b N412d N510c N610c Q
2 V.Vilkiene lietuviu_k D P112b P212b P312a P412c P55b Q Q Q Q A312a A412b A512c A612c Q Q T29c T312c T412b T55b Q Q K112a K212a K35b K412b K55b K69c Q N19c N29c N312a N45b N59c N612c Q
3 N.Kazokeviciene lietuviu_k D P15c P26a P38b P48c P56d P68b Q Q Q A35c A46d A58c A66a Q T16a T26d T35c T48b T55c T68c Q Q K26a K38b K46d K58c Q Q N15c N26a N38c N48b N56d Q Q
4 J.Kaminskiene choreografija 0 Q Q P35d P45b P55a Q Q Q Q Q A45c Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q
5 Z.Kublickas ekonomika 0 Q Q Q Q Q Q Q Q Q Q Q Q Q A711a Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q

Komentarai langų skaičiaus sumažinimui:

    1. O.Dailidaviciene: T16b perkelta į T46b naikinant langą T4
    2. O.Dailidaviciene: T612d perkelta į N412d naikinant langą N4
    3. V.Vilkiene: A19c perkelta į N59c naikinant langą N5
    4. V.Vilkiene: A25b perkelta į K55b naikinant langą K5
    5. V.Vilkiene: T19c perkelta į T29c naikinant langą T2
    6. N.Kazokeviciene: A18c perkelta į A58c naikinant langą A5
    7. N.Kazokeviciene: A28b perkelta į P38b naikinant langą P3
    8. N.Kazokeviciene: K15c perkelta į T35c naikinant langą T3
    9. J.Kaminskiene: A35b perkelta į P45b naikinant langą P4