1 / 31

Uždavinys “ Egzaminas ”

Uždavinys “ Egzaminas ”. Aut.: Linas Petrauskas. Kiekvienoje auditorijos eil ėje sėdi po vienodą skaičių studentų. Bet tuoj prasidės egzaminas. Studentai turi susėsti taip, kad kiekvienas sėdėtų priešais kito studento nugarą, o tarp vienoje eilėje sėdinčių būtų bent K laisvų vietų.

joella
Télécharger la présentation

Uždavinys “ Egzaminas ”

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Uždavinys “Egzaminas” Aut.: Linas Petrauskas

  2. Kiekvienoje auditorijos eilėje sėdi po vienodą skaičių studentų. Bet tuoj prasidės egzaminas. Studentai turi susėsti taip, kad kiekvienas sėdėtų priešais kito studento nugarą, o tarp vienoje eilėje sėdinčių būtų bent K laisvų vietų.

  3. Kaip studentai turi persėsti, kad būtų tenkinami šie reikalavimai, o savo vietą tektų pakeisti kuo mažiau studentų? * Studentai negali prasilenkti ar pereiti į kitą eilę, * Auditorijos matmenys iki 200x100.

  4. Pavyzdys, kai K = 1. (Savo vietą teks pakeisti mažiausiai 8 studentams.)

  5. Pavyzdys, kai K = 2. (Savo vietą teks pakeisti mažiausiai 9 studentams. Šiuo atveju yra vienintelis būdas studentams susėsti.)

  6. Iš anksto galime pasakyti, kurie studentai turės sėdėti toje pačioje (vertikalioje) eilėje:

  7. Nesunkiai galime ir suskaičiuoti, kiek kiekvienam studentų “frontui” “kainuotų” pasislinkti iki kiekvienos galimos pozicijos (nepaisant kitų “frontų”) – ši kaina lygi toje pozicijoje nesėdinčių to “fronto” studentų skaičiui. (Nesijaudinkit – tai paprastoji dalis ;)

  8. Tai čia aišku... Bet kaip spręsti uždavinį? Godi idėja...

  9. ...nebūtinai pateikia optimalų sprendinį. 8 studentai pakeičia vietą. 7 studentai pakeičia vietą.

  10. * Teisingą atsakymą gautume išbandę visus variantus; * Perrinkimas užtrunka daug laiko. * Naudosime DINAMINĮ PROGRAMAVIMĄ.

  11. Pastebėkime, kad jei žinotume, kur turi susėsti paskutinis studentų “frontas”, liktų išspręsti labai panašų, tik mažesnį uždavinį.

  12. * Kita vertus, jei mokėtume spręsti mažesnį uždavinį, tai padėtų išspręsti didesnįjį. * Pradėsime nuo paties mažiausio uždavinio. * Paeiliui spręsime vis didesnį uždavinį, kol pagaliau rasime viso uždavinio sprendimą.

  13. Pavyzdys, K = 1

  14. Paprasčiausias uždavinys – yra tik pirmasis “frontas” studentų ir tik viena vertikali eilė.

  15. Sprendimas elementarus – visus susodinti į pirmą eilę. Tokio sprendimo “kaina” = 3.

  16. Didesnis uždavinys – tai vienas studentų “frontas” ir dvi vertikalios eilės. Geriausio sprendimo “kaina” = 2.

  17. Kai studentų frontų yra vienas, o eilės trys, vis tiek optimalu pirmąjį frontą sodinti antroje eilėje. Priešingu atveju būtų gaunama didesnė kaina. Geriausio sprendimo “kaina” = 2.

  18. Pažymėkime f[i, j] – i-ojo fronto pasodinimo į j-ąją eilę kainą.(Lentelė viršuje.) Pažymėkime D[i, j] – optimalią pirmųjų i frontų susodinimo į pirmąsias j eilių kainą.

  19. Mus dominantis atsakymas yra D[n, s], kur n yra frontų skaičius, o s – auditorijos eilių (vertikalių) skaičius. Jau išmokome optimaliai susodinti pirmojo fronto studentus bet kokiame kiekyje eilių: D[1, 1] := f[1, 1]; for i := 2 to s do D[1, i] := min(D[1, i-1], f[1, i]);

  20. Pereikime prie didesnio uždavinio – nagrinėkime pirmuosius du studentų frontus. Jiems prireiks mažiausiai 3 vertikalių eilių. (K = 1)

  21. Toks uždavinys taip pat turi tik vieną sprendinį: Geriausia pirmųjų 2 frontų susodinimo kaina pirmose 3 eilėse: D[2, 3] = D[1, 1] + f[2, 3] = 3 + 4 = 7

  22. Kaip susodinti pirmuosius 2 frontus susodinti pirmosiose 4 vertikaliose eilėse. D[2, 4] = ? Renkamės iš 2 variantų: D[2, 4] = D[2, 3] = 7 ? D[2, 4] = D[1, 2] + f[2, 4] = 4 ? Renkamės pigesnį variantą, t. y. antrąjį. D[2, 4] = D[1, 2] + f[2, 4] = 2 + 2 = 4

  23. Pagal tą pačią taisyklę renkamės ir toliau. D[2, 5] = D[2, 4], t. y. penkiose pirmosiose eilėse pirmuosius du frontus studentų optimalu susodinti taip pat kaip ir keturiose.

  24. Pirmiesiems trims frontams studentų reikia mažiausiai 5 vertikalių eilių. (K = 1) Tokio susodinimo kaina: D[3, 5] = D[2, 3] + f[3, 5] = 9

  25. Sodindami 3 frontus pirmosiose 6 eilėse renkamės iš 2 variantų: D[3, 6] = D[3, 5] = 9 ? D[3, 6] = D[2, 4] + f[3, 6] = 8? Renkamės pigesnį variantą, taigi, antrąjį. D[3, 6] = D[2, 4] + f[3, 6] = 4 + 4 = 8

  26. Pagal tą patį algoritmą tęsiame ir randame uždavinio sprendimą: Optimali susėdimo kaina D[3, 7] = 8

  27. Apibrendrinus: D[1, 1] := f[1, 1]; for j := 2 to s do D[1, j] := min(D[1, j-1], f[1, j]); for i := 2 to n do begin p := (i – 1) * (K + 1) + 1; D[i, p] := D[i - 1, p – k - 1] + f[i, p]; for j := p + 1 to s do D[i, j] := min(D[i, j – 1], D[i – 1, j – k – 1] + f[i, j]); end;

  28. Lentelė f: Lentelė D:

  29. Reikalingą studentų susodinimą randame grįždami nuo paskutiniojo langelio iki pirmosios eilutės. Lentelė D:

  30. (pabaiga)

More Related