Scopul acestui laborator este învăţarea unor tehnici de rezolvare a problemelor de căutare în spaţiul stărilor.
Aspectele urmărite sunt:
Fie un sistem dinamic care se poate afla într-un număr finit de stări. Definim un graf orientat în care nodurile sunt stări, iar arcele reprezintă posibilitatea de a evolua direct dintr-o stare în alta. Graful conține un set de stări iniţiale şi un set de stări finale (scopuri). Problema descrisă de sistem va fi rezolvată prin parcurgerea spaţiului stărilor până când este găsită o cale de la o stare iniţială la o stare finală, în cazul în care problema admite soluţie. Căutarea este un mecanism general, recomandat atunci când o metodă directă de rezolvare a problemei nu este cunoscută.
Exemple de strategii de căutare în spaţiul stărilor:
În această situaţie nu este posibil să definim un template care descrie forma soluţiei problemei. Vom defini o căutare mai generală, după modelul următor:
solve(Solution):- initial_state(State), search([State], Solution).
search(+StăriVizitate,-Soluţie)
definește mecanismul general de căutare astfel:
initial_state/1
)next_state/2
)final_state/1
)search([CurrentState|Other], Solution):- final_state(CurrentState), !, reverse([CurrentState|Other], Solution). search([CurrentState|Other], Solution):- next_state(CurrentState, NextState), \+ member(NextState, Other), search([NextState,CurrentState|Other], Solution).
Căutarea în lăţime este adecvată situaţiilor în care se doreşte drumul minim între o stare iniţială şi o stare finală. La o căutare în lăţime, expandarea stărilor “vechi” are prioritate în faţa expandării stărilor “noi”.
do_bfs(Solution):- initial_node(StartNode), bfs([(StartNode,nil)], [], Discovered), extract_path(Discovered, Solution).
bfs(+CoadaStărilorNevizitate,+StăriVizitate,-Soluţie)
va defini mecanismul general de căutare în lăţime astfel:
A* este un algoritm de căutare informată de tipul best-first search, care caută calea de cost minim (distanță, cost, etc.) către scop. Dintre toate stările căutate, o alege pe cea care pare să conducă cel mai repede la soluție. A* selectează o cale care minimizează f(n) = g(n)+ h(n)
, unde n
este nodul curent din cale, g(n)
este costul de la nodul de start până la nodul n
și h(n)
este o euristică ce estimează cel mai mic cost de la nodul n
la nodul final.
astar_search(Start, End, Grid, Path) :- manhattan(Start, End, H), astar(End, [H:Start], [Start:("None", 0)], Grid, Discovered), get_path(Start, End, Discovered, [End], Path).
astar(+End, +Frontier, +Discovered, +Grid, -Result)
va defini mecanismul general de căutare A*, astfel: