Variantide lbivaatus Ahto Truu ahto truuut ee Kombinatoorikalesanne
Variantide läbivaatus Ahto Truu ahto. truu@ut. ee
Kombinatoorikaülesanne Objektide kombineerimise võimaluste n loetlemine n loendamine n summeerimine n minimaalse/maksimaalse leidmine
Näide: bitiülesanne n genereerida n kui kõik N-bitised jadad palju neid kokku on? – 2 N n kas järjekord on oluline? – isegi kui pole, peame mingi valima – näiteks 000, 001, . . . , 111
Iteratsioonimeetod Algoritm n loome esimese variandi n kuni on variant: – kasutame/loendame variandi v – leiame järgmise variandi
Tagurdusmeetod (1) Algoritm OTSI(v) n kui v on täielik variant: – kasutame/loendame variandi v n muidu: – leiame täiendusvariantide hulga W – iga w W jaoks: • OTSI(v + w)
Tagurdusmeetod (2) Globaalne v Algoritm OTSI n kui v on täielik variant: – kasutame/loendame variandi v n muidu: – leiame täiendusvariantide hulga W – iga w W jaoks: • v : = v + w • OTSI • v : = v – w
Näide: lipuülesanne n Nx. N malelaud n paigutada sellele N lippu n ükski ei tohi olla ühegi teise tule all n lipp tulistab: – piki rida vasakule ja paremale – piki veergu üles ja alla – piki diagonaale 4 suunas
Lipud: tagurdusmeetod n Jooksev variant: – juba paigutatud lippude loetelu n Täiendamisvõimaluste hulk: – malelaua väljade loetelu n Variandi täiendamine: – uuele lipule koha valimine
Otsingupuu
Otsingupuu suurus Parameetrid n puu sügavus n n puu hargnevus m – igal sammul m-elemendiline W – igal tipul m alluvat Puu suurus ja töömaht n kokku puus mn lehte n tehtav töö Ω(mn)
Hoiatav näide: male Keskmiselt 38 käiku seisus n Hea arvuti: n – vaatleb sekundis 1 000 seisu – vaatab sekundiga 4 käiku ette n Väga hea arvuti: – vaatleb sekundis 100 000 seisu – vaatab sekundiga 5 käiku ette n Superarvuti: – vaatleb sekundis 10 000 000 seisu – vaatab sekundiga 6 käiku ette
Hoiatav näide: lipud n Naiivne lahendus: – N lippu puu sügavus N – Nx. N ruutu igal sammul ~N 2 varianti – jäme hinnang (N 2)N n 3 x 3 laud: 729 n 5 x 5 laud: 9765625 n 7 x 7 laud: 678223072849
Olekuruumi ahendamine n Vältida sama seisu korduvat vaatlemist – algseis S, käigud A, B; S’ = S+A+B – algseis S, käigud C, D; S’’ = S+C+D – kui S’ = S’’, siis on raiskamine Lihtsamatel juhtudel saab kordusi vältida n Keerulisematel juhtudel tuleb neid ära tunda n
Lipud: ahendamine n Veergude vaatlemine vasakult paremale: – N lippu puu sügavus N – N rida i. sammul N varianti – jäme hinnang NN 3 x 3 laud: 27 (27 x vähem) n 5 x 5 laud: 3125 (3125 x vähem) n 7 x 7 laud: 823543 (823543 x vähem) n
Puu pügamine n Tunda halb seis ära võimalikult vara – jätta see kohe kõrvale – väldime terve alampuu töötlemist n Liigne agarus on ohtlik – võime kaotada otsitava lahenduse
Lipud: pügamine n Ainult vabad ruudud jooksvas veerus: – N lippu puu sügavus N – N rida i. sammul ~(N-i) varianti – jäme hinnang N! 3 x 3 laud: 6 n 5 x 5 laud: 120 n 7 x 7 laud: 5040 n (4, 5 x vähem) (26 x vähem) (163 x vähem)
Lipud: optimeerimine (1) Eelmiste lippudega võrdlemine: n vabaduse kontroll O(N) n lipu lisamine/eemaldamine O(1) Ruutude olekute märkimine: n vabaduse kontroll O(1) n lipu lisamine/eemaldamine O(N)
Lipud: optimeerimine (2) Veergude/ridade/diagonaalide olekud – veerud: ilmutamata kujul – read: rida[r] – tõusvad diagonaalid: diag 1[r–v] – langevad diagonaalid: diag 2[r+v] n vabaduse kontroll O(1) n lisamine/eemaldamine O(1) n kokkuhoid N-kordne
Mängud: minimaks Käik: oma käik + vastase vastus n oma käikudest parim (max) n vastase vastustest halvim (min) Tugeva (optimaalselt mängiva) vastase korral parim strateegia
Mängud: kasulikke nippe n Puu läbimine laiuti – Ajapiiri arvestamine – Seisu staatiline hinnang – Iteratiivne süvendamine – Heuristiline otsing n Mõtlemine “vastase ajast”
Lisalugemist n Kiled, näited, konspekt – http: //www. ut. ee/~at/eio/ n Mänguprogrammeerimine – http: //www. gamedev. net/ n Mänguteooria – http: //www. gametheory. net/
- Slides: 21