GeeksforGeeks

Prerequisiti :

  • Ricorsione
  • Complessità di Analisi

Backtracking è un algoritmo-tecnica per la risoluzione di problemi in modo ricorsivo, cercando di costruire una soluzione in modo incrementale, un pezzo alla volta, la rimozione di quelle soluzioni che non soddisfano i vincoli del problema in qualsiasi punto del tempo (il tempo, qui, si riferisce al tempo trascorso fino a raggiungere qualsiasi livello di ricerca di albero).

Secondo la definizione wiki,

Il backtracking può essere definito come una tecnica algoritmica generale che considera la ricerca di ogni possibile combinazione per risolvere un problema computazionale.

Ci sono tre tipi di problemi nel backtracking–

  1. Problema decisionale – In questo, cerchiamo una soluzione fattibile.
  2. Problema di ottimizzazione-In questo, cerchiamo la soluzione migliore.
  3. Problema di enumerazione-In questo, troviamo tutte le soluzioni fattibili.

Come determinare se un problema può essere risolto utilizzando il Backtracking?

Generalmente, ogni problema di soddisfazione dei vincoli che ha vincoli chiari e ben definiti su qualsiasi soluzione oggettiva, che costruisce in modo incrementale il candidato alla soluzione e abbandona un candidato (“backtracks”) non appena determina che il candidato non può essere completato in una soluzione valida, può essere risolto con il Backtracking. Tuttavia, la maggior parte dei problemi discussi può essere risolta utilizzando altri algoritmi noti come la programmazione dinamica o algoritmi avidi in complessità temporale logaritmica, lineare, lineare-logaritmica in ordine di dimensione dell’input e, quindi, eclissare l’algoritmo di backtracking sotto ogni aspetto (poiché gli algoritmi di backtracking sono generalmente esponenziali sia nel tempo che nello spazio). Tuttavia, rimangono ancora alcuni problemi, che hanno solo algoritmi di backtracking per risolverli fino ad ora.

Considera una situazione in cui hai tre scatole di fronte a te e solo una di esse ha una moneta d’oro ma non sai quale. Quindi, per ottenere la moneta, dovrai aprire tutte le scatole una per una. Per prima cosa controllerai la prima casella, se non contiene la moneta, dovrai chiuderla e controllare la seconda casella e così via fino a trovare la moneta. Questo è ciò che è il backtracking, cioè risolvere tutti i sotto-problemi uno per uno per raggiungere la migliore soluzione possibile.

Considera l’esempio seguente per comprendere l’approccio di Backtracking in modo più formale,

Data un’istanza di qualsiasi problema computazionale P e data D corrispondente all’istanza, tutti i vincoli che devono essere soddisfatti per risolvere il problema sono rappresentati da C . Un algoritmo di backtracking funzionerà quindi come segue:

L’algoritmo inizia a costruire una soluzione, iniziando con un set di soluzioni vuoto S . S = {}

  1. Aggiungi a  S la prima mossa che è ancora rimasta (Tutte le mosse possibili vengono aggiunte a S una per una). Questo ora crea un nuovo sotto-albero  s nell’albero di ricerca dell’algoritmo.
  2. Controlla se  S + s soddisfa ciascuno dei vincoli in  C .
    • Se Sì, allora il sottoalbero s è “idoneo” per aggiungere altri “figli”.
    • Altrimenti, l’intero sottoalbero s è inutile, quindi torna al passaggio 1 usando l’argomento S .
  3. In caso di” ammissibilità ” del sottoalbero appena formato s , si torna al passaggio 1, utilizzando l’argomento S+s .
  4. Se il controllo per S+s restituisce che si tratta di una soluzione per l’intero dato D . Uscita e terminare il programma.
    In caso contrario, restituire che nessuna soluzione è possibile con la corrente  s e quindi scartarla.

Differenza tra Ricorsione e Backtracking:

Nella ricorsione, la funzione si chiama fino a raggiungere un caso base. Nel backtracking, usiamo la ricorsione per esplorare tutte le possibilità fino a ottenere il miglior risultato per il problema.

Pseudo codice per il backtracking :

1. Soluzione di backtracking ricorsiva.

void findSolutions(n, other params) : if (found a solution) : solutionsFound = solutionsFound + 1; displaySolution(); if (solutionsFound >= solutionTarget) : System.exit(0); return for (val = first to last) : if (isValid(val, n)) : applyValue(val, n); findSolutions(n+1, other params); removeValue(val, n);

2. Trovare se esiste o meno una soluzione

boolean findSolutions(n, other params) : if (found a solution) : displaySolution(); return true; for (val = first to last) : if (isValid(val, n)) : applyValue(val, n); if (findSolutions(n+1, other params)) return true; removeValue(val, n); return false;

Proviamo a risolvere un problema di Backtracking standard, il problema N-Queen.
La N Regina è il problema di posizionare N regine di scacchi su una scacchiera N×N in modo che non ci siano due regine che si attaccano a vicenda. Ad esempio, di seguito è una soluzione per 4 problema Regina.

L’output previsto è una matrice binaria che ha 1s per i blocchi in cui sono posizionate le regine. Ad esempio, di seguito è riportata la matrice di output per la precedente soluzione 4 queen.

{ 0, 1, 0, 0}{ 0, 0, 0, 1}{ 1, 0, 0, 0}{ 0, 0, 1, 0}

Algoritmo di backtracking: L’idea è di posizionare le regine una per una in colonne diverse, partendo dalla colonna più a sinistra. Quando mettiamo una regina in una colonna, controlliamo gli scontri con le regine già piazzate. Nella colonna corrente, se troviamo una riga per la quale non c’è scontro, contrassegniamo questa riga e colonna come parte della soluzione. Se non troviamo una tale fila a causa di scontri, facciamo marcia indietro e torniamo falsi.

1) Start in the leftmost column2) If all queens are placed return true3) Try all rows in the current column. Do following for every tried row. a) If the queen can be placed safely in this row then mark this as part of the solution and recursively check if placing queen here leads to a solution. b) If placing the queen in leads to a solution then return true. c) If placing queen doesn't lead to a solution then unmark this (Backtrack) and go to step (a) to try other rows.3) If all rows have been tried and nothing worked, return false to trigger backtracking.

È possibile fare riferimento all’articolo su Backtracking | Set 3 (Problema N Queen) per l’implementazione completa dell’approccio sopra descritto.
Più Backtracking Problemi:

  • Backtracking | Set 1 (Il Cavaliere tour problema)
  • Backtracking | Set 2 (topo in un Labirinto)
  • Backtracking | Set di 4 (Subset Sum)
  • Backtracking | 5 (m Colorare Problema)
  • –> Clicca Qui per Ulteriori
Tag Articolo :
Pratica Tag :

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.