AI - Algoritmi di ricerca popolari

La ricerca è la tecnica universale di risoluzione dei problemi nell'IA. Ci sono alcuni giochi per giocatore singolo come giochi di tessere, sudoku, cruciverba, ecc. Gli algoritmi di ricerca ti aiutano a cercare una posizione particolare in tali giochi.

Problemi di individuazione del percorso di un singolo agente

I giochi come 3X3 a otto tessere, 4X4 a quindici tessere e 5X5 a ventiquattro tessere sono sfide per la ricerca del percorso da parte di un singolo agente. Sono costituiti da una matrice di tessere con una tessera vuota. Il giocatore è tenuto a disporre le tessere facendo scorrere una tessera verticalmente o orizzontalmente in uno spazio vuoto con l'obiettivo di raggiungere un obiettivo.

Gli altri esempi di problemi di individuazione del percorso di un singolo agente sono il problema del venditore ambulante, il cubo di Rubik e la dimostrazione di teoremi.

Terminologia di ricerca

  • Problem Space- È l'ambiente in cui avviene la ricerca. (Un insieme di stati e un insieme di operatori per modificare questi stati)

  • Problem Instance - È lo stato iniziale + lo stato dell'obiettivo.

  • Problem Space Graph- Rappresenta lo stato del problema. Gli stati sono mostrati dai nodi e gli operatori sono mostrati dai bordi.

  • Depth of a problem - Lunghezza di un percorso più breve o sequenza più breve di operatori dallo stato iniziale allo stato obiettivo.

  • Space Complexity - Il numero massimo di nodi archiviati in memoria.

  • Time Complexity - Il numero massimo di nodi che vengono creati.

  • Admissibility - Una proprietà di un algoritmo per trovare sempre una soluzione ottimale.

  • Branching Factor - Il numero medio di nodi figlio nel grafico dello spazio problema.

  • Depth - Lunghezza del percorso più breve dallo stato iniziale allo stato obiettivo.

Strategie di ricerca di forza bruta

Sono molto semplici, poiché non richiedono alcuna conoscenza specifica del dominio. Funzionano bene con un numero limitato di stati possibili.

Requisiti -

  • Descrizione dello stato
  • Un insieme di operatori validi
  • Stato iniziale
  • Descrizione dello stato dell'obiettivo

Ricerca in ampiezza

Inizia dal nodo radice, esplora prima i nodi vicini e si sposta verso i vicini di livello successivo. Genera un albero alla volta finché non viene trovata la soluzione. Può essere implementato utilizzando la struttura dati della coda FIFO. Questo metodo fornisce il percorso più breve alla soluzione.

Se branching factor(numero medio di nodi figli per un dato nodo) = be profondità = d, quindi numero di nodi a livello d = b d .

Il numero totale di nodi creati nel caso peggiore è b + b 2 + b 3 +… + b d .

Disadvantage- Poiché ogni livello di nodi viene salvato per crearne uno successivo, consuma molto spazio di memoria. Lo spazio richiesto per memorizzare i nodi è esponenziale.

La sua complessità dipende dal numero di nodi. Può controllare i nodi duplicati.

Ricerca in profondità

È implementato in ricorsione con la struttura dati dello stack LIFO. Crea lo stesso insieme di nodi del metodo Breadth-First, solo nell'ordine diverso.

Poiché i nodi sul percorso singolo vengono archiviati in ogni iterazione dalla radice al nodo foglia, lo spazio richiesto per archiviare i nodi è lineare. Con il fattore di ramificazione b e la profondità come m , lo spazio di archiviazione è bm.

Disadvantage- Questo algoritmo potrebbe non terminare e continuare all'infinito su un percorso. La soluzione a questo problema è scegliere una profondità di taglio. Se il cut-off ideale è d , e se il cut-off scelto è minore di d , allora questo algoritmo potrebbe fallire. Se il valore limite scelto è maggiore di d , il tempo di esecuzione aumenta.

La sua complessità dipende dal numero di percorsi. Non può controllare i nodi duplicati.

Ricerca bidirezionale

Cerca in avanti dallo stato iniziale e all'indietro dallo stato obiettivo fino a quando entrambi si incontrano per identificare uno stato comune.

Il percorso dallo stato iniziale viene concatenato con il percorso inverso dallo stato obiettivo. Ogni ricerca viene eseguita solo fino alla metà del percorso totale.

Ricerca uniforme dei costi

L'ordinamento viene effettuato aumentando il costo del percorso verso un nodo. Espande sempre il nodo meno costoso. È identico alla ricerca Breadth First se ogni transizione ha lo stesso costo.

Esplora percorsi in ordine crescente di costo.

Disadvantage- Possono esserci più percorsi lunghi con il costo ≤ C *. La ricerca a costo uniforme deve esplorarli tutti.

Approfondimento iterativo Ricerca approfondita

Esegue la ricerca in profondità fino al livello 1, ricomincia, esegue una ricerca completa in profondità fino al livello 2 e continua in questo modo finché non viene trovata la soluzione.

Non crea mai un nodo finché non vengono generati tutti i nodi inferiori. Salva solo una pila di nodi. L'algoritmo termina quando trova una soluzione alla profondità d . Il numero di nodi creati alla profondità d è b d e alla profondità d-1 è b d-1.

Confronto di varie complessità di algoritmi

Vediamo le prestazioni degli algoritmi in base a vari criteri:

Criterio Larghezza prima Prima la profondità Bidirezionale Costo uniforme Approfondimento interattivo
Tempo b d b m b d / 2 b d b d
Spazio b d b m b d / 2 b d b d
Ottimalità No
Completezza No

Strategie di ricerca informate (euristiche)

Per risolvere problemi di grandi dimensioni con un numero elevato di stati possibili, è necessario aggiungere conoscenze specifiche del problema per aumentare l'efficienza degli algoritmi di ricerca.

Funzioni di valutazione euristica

Calcolano il costo del percorso ottimale tra due stati. Una funzione euristica per i giochi con tessere scorrevoli viene calcolata contando il numero di mosse che ciascuna tessera fa dal suo stato obiettivo e aggiungendo questo numero di mosse per tutte le tessere.

Ricerca euristica pura

Espande i nodi nell'ordine dei loro valori euristici. Crea due elenchi, un elenco chiuso per i nodi già espansi e un elenco aperto per i nodi creati ma non espansi.

In ogni iterazione, un nodo con un valore euristico minimo viene espanso, tutti i suoi nodi figli vengono creati e inseriti nell'elenco chiuso. Quindi, la funzione euristica viene applicata ai nodi figlio e questi vengono inseriti nell'elenco aperto in base al loro valore euristico. I percorsi più brevi vengono salvati e quelli più lunghi vengono eliminati.

Una ricerca

È la forma più nota di ricerca Best First. Evita di espandere i percorsi che sono già costosi, ma espande prima i percorsi più promettenti.

f (n) = g (n) + h (n), dove

  • g (n) il costo (finora) per raggiungere il nodo
  • h (n) costo stimato per arrivare dal nodo all'obiettivo
  • f (n) costo totale stimato del percorso fino all'obiettivo. Viene implementato utilizzando la coda di priorità aumentando f (n).

Greedy Best First Search

Espande il nodo che si stima sia più vicino all'obiettivo. Espande i nodi in base a f (n) = h (n). Viene implementato utilizzando la coda di priorità.

Disadvantage- Può rimanere bloccato in loop. Non è ottimale.

Algoritmi di ricerca locale

Partono da una soluzione potenziale e poi passano a una soluzione vicina. Possono restituire una soluzione valida anche se viene interrotta in qualsiasi momento prima della fine.

Ricerca in salita

È un algoritmo iterativo che inizia con una soluzione arbitraria a un problema e tenta di trovare una soluzione migliore modificando in modo incrementale un singolo elemento della soluzione. Se la modifica produce una soluzione migliore, una modifica incrementale viene considerata come una nuova soluzione. Questo processo viene ripetuto fino a quando non ci sono ulteriori miglioramenti.

funzione Hill-Climbing (problema), restituisce uno stato che è un massimo locale.

inputs: problem, a problem
local variables: current, a node
                 neighbor, a node
current <-Make_Node(Initial-State[problem])
loop
   do neighbor <- a highest_valued successor of current
      if Value[neighbor] ≤ Value[current] then
      return State[current]
      current <- neighbor				  
	
end

Disadvantage - Questo algoritmo non è né completo né ottimale.

Ricerca travi locali

In questo algoritmo, contiene k numero di stati in un dato momento. All'inizio, questi stati vengono generati in modo casuale. I successori di questi k stati vengono calcolati con l'aiuto della funzione obiettivo. Se uno di questi successori è il valore massimo della funzione obiettivo, l'algoritmo si ferma.

In caso contrario, gli stati (k stati iniziali ek numero di successori degli stati = 2k) vengono inseriti in un pool. Il pool viene quindi ordinato numericamente. I k stati più alti vengono selezionati come nuovi stati iniziali. Questo processo continua fino a quando non viene raggiunto un valore massimo.

funzione BeamSearch ( problema, k ), restituisce uno stato di soluzione.

start with k randomly generated states
loop
   generate all successors of all k states
   if any of the states = solution, then return the state
   else select the k best successors
end

Ricottura simulata

La ricottura è il processo di riscaldamento e raffreddamento di un metallo per cambiare la sua struttura interna per modificarne le proprietà fisiche. Quando il metallo si raffredda, la sua nuova struttura viene catturata e il metallo conserva le sue proprietà appena ottenute. Nel processo di ricottura simulata, la temperatura viene mantenuta variabile.

Inizialmente impostiamo la temperatura alta e poi lasciamo che si "raffreddi" lentamente mentre l'algoritmo procede. Quando la temperatura è alta, l'algoritmo può accettare soluzioni peggiori con alta frequenza.

Inizio

  • Inizializza k = 0; L = numero intero di variabili;
  • Da i → j, cerca la differenza di prestazioni Δ.
  • Se Δ <= 0 allora accetta altrimenti se exp (-Δ / T (k))> casuale (0,1) allora accetta;
  • Ripetere i passaggi 1 e 2 per i passaggi L (k).
  • k = k + 1;

Ripetere i passaggi da 1 a 4 finché i criteri non vengono soddisfatti.

Fine

Problema del commesso viaggiatore

In questo algoritmo, l'obiettivo è trovare un tour a basso costo che inizi da una città, visiti tutte le città lungo il percorso esattamente una volta e termini nella stessa città di partenza.

Start
   Find out all (n -1)! Possible solutions, where n is the total number of cities.
   Determine the minimum cost by finding out the cost of each of these (n -1)! solutions.
   Finally, keep the one with the minimum cost.
end