Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

Il backtracking attraverso il problema delle N-Regine - Descrizione del problema, Il ruolo del backtracking

informatica



Il backtracking attraverso il problema delle N-Regine


Descrizione del problema

Il problema delle N-regine consiste nel disporre n regine su di una scacchiera nxn senza che esse si minaccino a vicenda. Le regine hanno le stesse proprietà dell'omonimo pezzo degli scacchi, cioè in una mossa possono spostarsi di un numero arbitrario di caselle in verticale, orizzontale e diagonale. Il problema dunqu 515c23f e è quello di posizionare le regine su caselle "sicure", cioè non minacciate da altre regine; intendiamo quindi per sicura una casella che non può essere raggiunta da un pezzo in una sola mossa. n indica il numero di regine (ed anche di caselle per lato della scacchiera) che devono essere posizionate sulla scacchiera. La soluzione del problema fornisce una (o più) disposizione di tutte le n regine su caselle sicure, in modo che la configurazione ottenuta risulti essere sicura, ossia nessuna regina può essere minacciata. Il problema deve essere risolto per
n >= 4, poiché scegliendo n compreso tra 0 e 3 il problema risulta essere banalmente insolubile.



L'applet NQueens

Seguendo il seguente link si può eseguire Nqueens Applet che risolve il problema delle N-Regine: sono disponibili due modalità di esecuzione che consentono meglio di apprezzare il comportamento del programma con particolare riferimento al processo di backtracking. Sono presenti inoltre una descrizione dell'interfaccia dell'applet ed i link ai codici sorgenti Java e Prolog.

Il ruolo del backtracking

L'applet consente di mostrare con immediatezza l'attività di backtracking del sistema Prolog nel posizionamento delle regine sulla scacchiera. Supponiamo
n (numero di regine) = 4. Come si può vedere dall'esecuzione dell'applet in modalità step-by-step le prime 2 regine possono essere collocate su posizioni sicure:


Figura 1


Nella configurazione corrente tuttavia non può essere posizionata la terza regina. Tramite il meccanismo del backtracking si cerca allora una nuova configurazione sicura per la seconda regina.


Figura 2


A questo punto anche la terza e la quarta regina possono essere inserite sulla scacchiera in posizioni non minacciate da altri pezzi. In realtà l'Applet non mostra tutti i passaggi intermedi del backtracking del sistema Prolog, ma visualizza solo le configurazioni stabili, quelle cioè in cui le regine poste sulla scacchiera sono su caselle sicure. Tramite il comando "Altre Soluzioni" si possono ricercare, se esistono, nuove soluzioni al problema. Si consideri ora il meccanismo di backtracking a livello del programma sorgente Prolog che risolve il problema delle N-regine. (Per fini didattici si supponga un'istanza semplificata del problema in cui N = 5).

nqueens(5, Position):-
    construct_solution(5, Position),
    find_solution(Position, [1,2,3,4,5]).

construct_solution(0, [ ]).
construct_solution(N, [ _ | Tail]):-  M  is  N  -  1,  M  >=  0,
              construct_solution(M, Tail).

find_solution([ ], _ ).
find_solution([Y | Others], List):-
    find_solution(Others, List),
    member(Y, List),
    noattack(Y, Others, 1).

noattack( _, [ ], _ ).
noattack(Y, [Y1 | Others], Xdist):-
    Y  =\=  Y1,
    Y1 - Y  =\=  Xdist,
    Y - Y1  =\=  Xdist,
    Dist1 is Xdist + 1,
    noattack(Y, Others, Dist1).

La soluzione finale è rappresentata da una lista di 5 elementi che indicano rispettivamente le 5 colonne in cui devono essere poste le regine, assumendo ovviamente che ciascun pezzo debba essere posto su una riga differente. Si supponga dunque di aver posizionato le prime due regine come indicato nella figura 1. Al momento dell'esecuzione dell'interrogazione find_solution(...) si ha che Others = [3,1] e List = [1,2,3,4,5].
L'esecuzione del subgoal member(Y, List) produce la sostituzione Y = 1, tuttavia è facile da verificare che per tale sostituzione l'esecuzione del termine noattack(1,[3,1],1) fallisce. Attraverso il processo di backtracking si tenta allora a risoddisfare member(Y, List): per nessun altro valore di Y però il termine noattack è unificabile. Per questo è necessario ricollocare la seconda regina; provando infatti a risoddisfare il termine member(Y, List) si ottiene l'unica altra alternativa possibile Y = 4 come indicato dalla figura 2. Procedendo in maniera simile è possibile collocare gli altri pezzi mancanti sulla scacchiera.




Privacy




Articolo informazione


Hits: 1684
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024