feladat: kiralyno a sakk tablan ugy hogy egyik sem uti a masikat. Van ilyen felallas es ha van akkor hany?
Brute force: osszes felallast kiprobaljuk, ez esetet kell leellenorizni
Heurisztika 1: Minden oszlopba csak egy kiralnyot rakhatunk, igy mar csak esetet kell leellenorizni.
Heurisztika 2: Minden soronkent is csak egy kiralynot rakhatunk, igy mar csak lehetoseg van.
Backtracking: Addig rakjuk a kiralnyoket ameddig el nem rontjuk, ha elrontjuk akkor visszalepunk.
feladat: Ki lehet-e szinezni a grafot szinnel, azaz
-re lehet-e a pirosak halmaza? Ha ugy, hogy akkor nem lehet a pirosak halmaza.
Meg eldontendo, hogy a maradek csucsok, azaz kiszinezheto-e szinnel.
Tehat igy osszesen -szer kell futtatni egy -szinezhetoseget, mert az elso lepesben minden -re futtatni kell.
feladat: Mennyi az szama a grafnak, azaz mekkora a maximalis fuggetlen csucshalmaza.
Ha akkor konnyen szamithato idoben
Egy ilyen grafnak minden komponense a kovetkezo lehet - izolalt csucs, ut vagy kor.
All.: Ha egy komponensnek csucsa van, akkor a kovetkezo ket eset van:
- ut
- kor
Keressuk az maximalis fuggetlen csucshalmazt.
MFTL(G):
I := {}
DO_MFTL(G, I)
DO_MFTL(G, I):
IF Delta(G) <= 2 THEN
// BFS-el megkeressuk a komponenseket es minden komponensnek a felet vesszuk (a fenti allitas miatt)
Szelessegi G -> I'
RETURN (I U I')
ELSE
// van olyan x, amire d(x) > 2
// x benne van a max ftl csucshalmazban (ekkor x szomszedai is kivesszuk)
x := legalabb 3-ad foku csucs
I_1 := DO_MFTL(G - x - N(x), I + x) // note, a set is passed by value
// x nincs benne a max ftl csucshalmazban
I_2 := DO_MFTL(G - x, I)
IF |I_1| + 1 > |I_2| THEN
I = I U I_1
ELSE
I = I U I_2
RETURN I
Legyen a rekurziv hivasok szama, igy a vegso futasi ido lesz mert minden rekurziv hivasban lepest csinalunk.
All.: , mert egy ilyen rekurziv algoritmus nem roszabb mint egy exponencialis futasi ido.
Tehat a vegso futasi ido
feladat: Mennyi a szama a grafnak, azaz a legkisebb lefogo csucshalmaz merete.
Tetel (Gallai):
INPUT: graf,
OUTPUT: Letezik-e csucsu lefogo csucshalmaz -ben
// Vertex Cover
VC(G, k):
DO_VC(G, k)
// Vertex Cover helper function
DO_VC(G, k):
IF k < 0 THEN RETURN False // lehetetlen feladat
IF |E(G)| = 0 THEN RETURN {} // 0 elt le tudunk fogni barhogyan
IF k = 0 THEN RETURN False // lehetetlen feladat
// minden elnek pontosan az egyik vege egy lefogo csucs
uv in E
T_1 := DO_VC(G - u, k - 1) // az el egyik vege van benne
IF T_1 != False THEN RETURN (T_1 U {u}) // ha megoldhato a feladat u-val akkor keszen vagyunk
T_2 := DO_VC(G - v, k - 1) // az el masik vege van benne
IF T_2 != False THEN RETURN (T_2 U {v}) // ha megoldhato a feladat v-vel akkor keszen vagyunk
RETURN False // sem u-val, sem v-vel nem megoldhato a reszfeladat, tehat a lehetetlen
futasi ido:
// Vertex Cover 2
VC2(G, k):
DO_VC2(G, k)
// Vertex Cover 2 helper function
DO_VC2(G, k):
IF k < 0 THEN RETURN False // lehetetlen feladat
IF |E(G)| = 0 THEN RETURN {} // trivialis feladat
IF k = 0 THEN RETURN False // lehetetlen feladat
v := G-nek egy max foku csucsa
IF d(v) <= 2 THEN
T := legkisebb lefogo spec esetben
IF |T| <= k THEN
RETURN T
ELSE
RETURN False
// v egy lefogo csucs
T_1 := DO_VC2(G - v, k - 1)
IF T_1 != False THEN RETURN (T_1 U {v})
// v nem egy lefogo csucs, igy az osszes elet a szomszedai fogjak le
T_2 := DO_VC2(G - v - N(v), k - d(v))
IF T_2 != False THEN RETURN (T_2 U N(v))
RETURN False
Legyen a rekurziv hivasok szama. Ekkor
Tehat a vegso futasi ido
Meta heurisztikak
- Simulated annealing
- Tabu search
- Flood fill
- Go with the winners
- Genetic algorithms