PROBLEM SOLVING INTELLIGENZA ARTIFICIALE A.A. 2014/2015 FRANCESCO RUSSO – ALBERTO SAGLIMBENI
PROBLEMA Bisogna trovare il percorso che va dal punto iniziale (Arad) fino al punto finale (Bucharest). Non tutti gli algoritmi possono essere applicati semplicemente senza appoggiarsi a variabili o vincoli aggiuntivi. Tratteremo la ricerca in profondità e al Leap Frogging applicati al nostro problema.
MAPPA CITTA’
DISTANZE AEREE
RICERCA IN PROFONDITA’ SIANO : OPEN= LISTA NODI APERTI CLOSED=LISTA NODI CHIUSI N_MAX= MASSIMO LIMITE DI PROFONDITA’ STATO INIZIALE: OPEN={ARAD} N=0 PSEUDOCODICE : If(empty(OPEN)) return false; If(n==n_max) return false; Node temp=Pop(OPEN); If(is_goal(temp)) return true; If(is_deadend(temp)) return false; Push_back(CLOSED,temp); ArrayList temp_list= successori(temp); Foreach(Node t in temp_list) { if(closed.contains(t)) return false; if(open.contains(t)) return false; } Francesco Russo Alberto Saglimbeni
RICERCA IN PROFONDITA’ Open.Add_List(temp_list); //Fine pseudocodice IsDeadend restituisce true se il nodo è terminale Empty restituisce true se la lista è vuota E’ necessario porre un limite di profondità dell’albero, poiché usiamo uno stack implicito e quindi in certi casi potremmo provocare uno stack overflow Possiamo supporre n=5, guardando la mappa a nostra disposizione Francesco Russo Alberto Saglimbeni
RICERCA IN PROFONDITA’ 1)OPEN={} temp=ARAD CLOSED={ARAD} non è un goal, né un deadend espandiamo Arad temp_list={Zerind,Sibiu,Timisoara} OPEN={ZERIND,SIBIU,TIMISOARA} Francesco Russo Alberto Saglimbeni
RICERCA IN PROFONDITA’ 2)OPEN={SIBIU,TIMISOARA} temp=ZERIND CLOSED={ARAD,ZERIND} no goal, no deaded, n true temp_list={Oradea} OPEN={ORADEA,SIBIU,TIMISOARA} Francesco Russo Alberto Saglimbeni
RICERCA IN PROFONDITA’ 3)OPEN= {SIBIU,TIMISOARA} temp=ORADEA CLOSED={ARAD,ZERIND,ORADEA} no goal, no deadend, n true temp_list : problema, Sibiu è già in open, quindi usciamo con fallimento Francesco Russo Alberto Saglimbeni
RICERCA IN PROFONDITA’ 4)OPEN = {TIMISOARA} temp=SIBIU CLOSED={ARAD,ZERIND,ORADEA,SIBIU} no goal, no deadend, n true temp_list={Fagaras,Rimnicu Vilcea} OPEN= {FAGARAS, RIMINCU VILCEA, TIMISOARA} Francesco Russo Alberto Saglimbeni
RICERCA IN PROFONDITA’ 5)OPEN={RIMNICU VILCEA,TIMISOARA} temp=FAGARAS CLOSED={ARAD,ZERIND,ORADEA,SIBIU, FAGARAS} no goal, no deadend, n true temp_list={Bucharest} OPEN={BUCHAREST, RIMNICU VILCEA, TIMISOARA} Francesco Russo Alberto Saglimbeni
RICERCA IN PROFONDITA’ OPEN= {RIMNICU VILCEA, TIMISOARA} temp=BUCHAREST Is goal true, uscire con successo Francesco Russo Alberto Saglimbeni
RICERCA IN PROFONDITA’ Scegliendo n=4 e Timisoara come primo nodo di espansione, l’algoritmo non avrebbe trovato nessuna soluzione poiché la profondità dell’albero avrebbe superato i limiti imposti. Ciò porta a riflettere su come scegliere un criterio adatto per la selezione dei nodi, oltre al fatto che essendo n un «limite» per l’algoritmo, si rischia di non trovare nessuna soluzione, sebbene ce ne siano varie. Francesco Russo Alberto Saglimbeni
LEAP FROGGING Consideriamo come criteri di eliminazione dei figli generati da un nodo : -Ripetizioni in closed -Distanza dal goal aumentata rispetto all’ultimo -Nodo in closed Francesco Russo Alberto Saglimbeni
LEAP FROGGING Utilizziamo a tale scopo la mappa delle distanze fornita. L’inserimento nella lista open può essere decrescente(in funzione della distanza) Notazione : Città(distanza) Pseudocodice: If(empty(open)) return false; Node temp=pop(open); Closed.push_back(temp); Francesco Russo Alberto Saglimbeni
LEAP FROGGING ArrayList figli_temp=genera_figli(temp); If(figli_temp.empty()) { cerca_subversive();Return false; } Foreach(Node n in figli_temp){ if(not_valid(n))figli_temp.remove(n); If(n.is_goal) return true; } open.insord(figli_temp); //Decrescente Francesco Russo Alberto Saglimbeni
LEAP FROGGING 1)Open={Arad(366)} ->Closed={Arad(366)} Figli_temp= {Zerind(374),Timisoara(329),Sibiu(253)} Zerind non è valido poiché aumenta la distanza Open= {Timisoara(329) ),Sibiu(253)} Francesco Russo Alberto Saglimbeni
LEAP FROGGING 2)Open={Sibiu(253)} Closed={Arad(366),Timisoara(329) } figli_temp=Lugoj(244) Aggiungiamo Lugoj Open={Lugoj(244),Sibiu(253)} Francesco Russo Alberto Saglimbeni
LEAP FROGGING 3)Open={Sibiu(253)} Closed={Arad(366),Timisoara(329), Lugoj(244) } Figli_temp=Mehadia(241) Open={Mehadia(241),Sibiu(253)} Francesco Russo Alberto Saglimbeni
LEAP FROGGING 4)Open={Sibiu(253)} Closed={Arad(366),Timisoara(329),Lugoj(344), Mehadia(241) }; Figli_temp=Dobreta(242); Dobreta non è valido perché stiamo aumentando la distanza. Adesso dobbiamo cancellare da closed tutti i figli fino a tornare ad un fratello del nodo subversive valido. Francesco Russo Alberto Saglimbeni
LEAP FROGGING 5)Open={Sibiu(253)} Closed={Arad(366)} E si continua con Sibiu Francesco Russo Alberto Saglimbeni
LEAP FROGGING 6)Open={} Closed={Arad(366),Sibiu(253)} Figli_temp={Fagaras(176),R.V.(193)} Open={R.V.(193), Fagaras(176)} Francesco Russo Alberto Saglimbeni
LEAP FROGGING 7)Open={Fagaras(176)} Closed={Arad(366),Sibiu(253),R.V.(193) } Figli_temp= {Craiova(138),Pitesti(100) } Open={Craiova(138),Pitesti(100), Fagaras(176)} Francesco Russo Alberto Saglimbeni
LEAP FROGGING 8)Open= {Pitesti(100),Fagaras(176)} Closed={Arad(366),Sibiu(253),R.V.(193), Craiova(138) } Figli_temp={Pitesti(100),Dobreta(242)} Dobreta si elimina dato che aumenta la distanza Pitesti è già in open, non facciamo nulla Francesco Russo Alberto Saglimbeni
LEAP FROGGING 9)Open={Fagaras} Closed={Arad(366),Sibiu(253),R.V.(193), Craiova(138), Pitesti(100) } Figli_temp= {BUCHAREST(0)} E’ il nodo goal, si ripercorre il percorso fino al padre. Francesco Russo Alberto Saglimbeni