Keresési algoritmusok, optimalizáció Az eddig tanultakból a mostani részben gyakran használt (emiatt szükséges az ismeretük) programozási ismeretek: függvények létrehozása, meghívása (ld. 3. óra anyagában) mátrixok indexelésének ismerete (ld. 1. óra anyagában) feltétel- és ciklusszervezés (ld. 1. óra anyagában) rand(), floor() függvény Hibakeresés a saját kódunkban: Break-point: az Editor ablakban ha el van mentve a kódunk, akkor a bal oldalon a nem üres sorok mellett vonalak jelennek meg. Ezekre a vonalakra rákattintva un. break-pointokat tudunk létrehozni. Ezeket pirosas körrel jelöli. (eltüntetni ismételt rákattintással lehet) Amikor futtatjuk a kódunkat, és odaér a megfelelő sorhoz, akkor mielőtt még azt a sort lefuttatná, megáll a futás. Ezt a command window-ban K>>-val jelöli. A felső menü ekkor átlép a debug módhoz, ahol lehet továbbengedni a program futását (F5) (a következő break-pointig), vagy akár egyetlen sort is léphetünk (F10) (a függvényekből nem lép ki egy sor továbbléptetésével). Amikor áll a program, akkor a command windowba parancsokat írhatunk be (vigyázat! meg is lehet változtatni a változók értékét), vagy a Workspace ablakban (ld. 1. óra) meg tudjuk nézni, hogy milyen változóink vannak milyen értékekkel. Ciklusok működése: 1. ea anyagában részletesen szerepel. Szöveg kiírása Hogyan írjuk ki a változók értékét szépen a command windowba? Pl: kiirando = strcat('a(z) ', num2str(pozicio(2)), '. oszlop legkisebb eleme a(z) ', num2str(pozicio(1)), '. sorban található. Értéke: ', num2str(a(pozicio(1), pozicio(2))), '.'); disp(kiirando) Először létrehozzuk a szöveget (egy szöveg típusú változóba), amit ki szeretnénk írni. Ezután a disp(változónév) paranccsal kiiratjuk. Bővebben ld. strcat és disp függvények helpje. Keresési algoritmusok, optimalizáció Irodalom: http://project.mit.bme.hu/mi_almanach/ Az előadáson hallott eljárások közül fogunk néhányat kipróbálni. Egy probléma megoldását a gép nem látja, valahogyan meg kell neki mondani egy algoritmust, hogy mi alapján próbálgassa ki a különböző lehetségesnek tűnő megoldásokat; és azt is, hogy milyen megoldást tekintünk jónak. Nem informált (vak) keresés: Nem tudja a gép, hogy a próbálgatásokban közelebb áll e a megoldáshoz. Vaktában végigpróbál mindent, amíg ki nem jön a megoldás. 1
Kétféle útvonalon járhat el a próbálgatásban: Mélységi keresés Szélességi keresés Informált keresés: Van olyan lépés, ami nem vezethet megoldáshoz. Ezt a gép egy feltétel vizsgálatával le tudja ellenőrizni. Az egyes lépések kiválasztása során fontos, hogy a célfüggvény minimuma (vagy más problémára maximuma) felé menjünk, viszont eközben sose akadjon meg a program egy lokális minimumon. Optimalizációs algoritmusok Szimulált lehűtés (simulated annealing) módszer: A célfüggvény minimumát keresi úgy, hogy véletlenszerűen változtat a paramétereken (vagy egy lépést véletlenszerűen kiválaszt). Ha a változtatással közelebb jutunk a megoldáshoz, akkor elfogadjuk a változtatást, viszont valamekkora valószínűséggel elfogadja a rossz irányba menő állapotot is. Lépésenként a rossz irányba menő állapotot egyre kisebb valószínűséggel fogadja el (un. hőmérséklet csökkentése). 2
Feladatok 1. Legyen A = [4 6 3 9 12; 54 6 7 12 87; 23 95 32 65 1; 43 23 65 4 8; 9 38 75 91 10]. Keressük meg ennek a mátrixnak a legkisebb elemét. A program írja ki a minimum értékét és azt, hogy hányadik sorban és oszlopban található. A min függvény használata nélkül! Ugyanennek a mátrixnak soronként is keressétek meg a minimumát, és írassátok ki, hogy hányadik sor legkisebb eleme hányadik oszlopban található. Az előző feladatrészt oszlopokra is oldjátok meg! 2. 8 királynő probléma. Hogyan lehet letenni egy sakktáblára 8 királynőt, hogy egyik se üsse a másikat? (sem átlósan sem függőlegesen-vízszintesen nem lehetnek egy vonalban). a. Oldjátok meg a feladatot próbálgatással. b. Oldjátok meg a feladatot az SA módszerrel. 3
2.a feladat folyamatábrája: 4
2.b feladat folyamatábrája: 5