Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Restrictii

Informatica


Restrictii

CUPRINS



Capitolul 4

Prezentarea problemei

Definirea problemei satisfacerii restrictiilor

Instante ale problemei satisfacerii restrictiilor

Satisfacerea restrictiilor ca problemă de căutare în spatiul stărilor

Cadrul logic al problemei satisfacerii restrictiilor

Reprezentarea problemei ca demonstrare a teoremelor în calculul cu predicate

Reprezentarea problemei ca demonstrare a teoremelor în calculul propozitional

Reprezentarea problemei în limbajele logice

Utilizarea satisfacerii restrictiilor în interpretarea desenelor

Problema etichetării desenelor

Determinarea restrictiilor de etichetare a desenelor

Metode de rezolvare a problemei satisfacerii restrictiilor

Metoda de bază: backtracking

Îmbunătătirea performantelor algoritmilor de satisfacere a restrictiilor

Utilizarea euristicilor generale în rezolvarea problemei satisfacerii restrictiilor

Tehnici de modificare a spatiului de căutare

Propagarea restrictiilor

Propagarea locală a restrictiilor

Satisfacerea restrictiilor fără backtracking

Tehnici prospective de îmbunătătire a performantelor căutării

Algoritmul de backtracking cu predictie completă

Algoritmul de backtracking cu predictie partială

Algoritmul de backtracking cu verificare predictivă

Solutii de implementare

Tehnici retrospective de îmbunătătire a performantelor căutării

Algoritmul de backtracking cu salt

Algoritmul de backtracking cu marcare

Algoritmul de backtracking cu multime conflictuală

Problema satisfacerii partiale a restrictiilor

Determinarea solutiei utilizînd algoritmul "branch and bound"

Determinarea solutiei utilizînd algoritmul de backtracking cu salt

Solutii de implementare

Exercitii si probleme

Rezolvări

Capitolul 6

Formalizarea rationamentului despre actiuni

Sistemul General Problem Solver

Planificare liniară în sistemul STRIPS

Functionarea sistemului STRIPS

Solutii de implementare

Planificare neliniară în sistemul TWEAK

Reprezentarea planului

Sinteza planului

Structura de control

Modelul formal al planificării

Exercitii si probleme

Rezolvări

Capitolul 7

Metode de învătare

Reguli de inferentă utilizate în învătare

Clasificarea tipurilor de învătare

Învătarea bazată pe explicatii

Tipuri de învătare bazată pe explicatii

Învătare prin operationalizare

Învătare utilizînd macrooperatorii

Învătarea prin generalizare explicată

Generalizarea bazată pe explicatii

Achizitia schemelor explicative

Învătarea euristicilor de control

Exercitii si probleme

Rezolvări

Capitolul 4

restrictiilor Problema satisfacerii

Multe probleme de inteligentă artificială pot fi formulate ca probleme de satisfacere a restrictiilor. Utilizarea unor algoritmi de căutare sistematică cu revenire, numiti algoritmi de backtracking, reprezintă o abordare ineficientă a acestor probleme întrucît acesti algoritmi conduc la o complexitate temporală exponentială. Plecînd de la schema de căutare cu revenire în spatiul stărilor, s-au propus două modalităti de bază pentru îmbunătătirea performantelor căutării: modificarea spatiului solutiilor pentru simplificarea căutării, si utilizarea unor euristici pentru ghidarea procesului de căutare.

Una dintre primele aplicatii ale problemei satisfacerii restrictiilor a fost întelegerea desenelor [Clowes,1971;Montanari,1974;Waltz,1975]. Algoritmul propus de Waltz pentru identificarea laturilor mutual restrictionate ale diagramei unei figuri tridimensionale are performante timp surprinzător de bune. Aceasta a dus la dezvoltarea unor algoritmi eficienti pentru cazuri particulare ale problemei, de către Mackworth si Freuder [1985], si a unor algoritmi care, desi complex computationali, cresc performantele rezolvării [Mackworth,1977;Haralick, Eliot,1980;Dechter,1989].

Prezentarea problemei

Problema satisfacerii restrictiilor se poate formula, în cazul cel mai general, astfel: fiind date o multime de variabile, un domeniu de valori potentiale pentru fiecare variabilă si o multime de restrictii care specifică combinatiile de valori acceptabile ale variabilelor, se cere să se găsească o atribuire de valori pentru fiecare variabilă astfel încît aceste valori să satisfacă toate restrictiile. Această atribuire de valori reprezintă solutia problemei.

Dacă domeniile de valori ale variabilelor sînt finite, atunci problema enuntată devine problema satisfacerii restrictiilor finite. Domeniile de valori ale variabilelor pot fi însă si infinite, iar restrictiile, în loc să fie specificate ca multimi de valori acceptabile, pot fi specificate sub forma unor multimi de intervale acceptabile [Hyvonen,1992]. În prezentarea ce urmează, toate consideratiile se vor face pentru cazul finit al problemei satisfacerii restrictiilor.

4.1.1 Definirea problemei satisfacerii restrictiilor

Fie o multime de variabile cu valori într-o multime de domenii finite si o multime de restrictii, fiecare indicînd valorile mutual compatibile pentru un subset de variabile. Astfel indică valorile compatibile ale variabilelor . Problema satisfacerii restrictiilor cere să se găsească o atribuire de valori variabilelor, cu , astfel încît toate restrictiile să fie satisfăcute. Fiecare astfel de atribuire diferită reprezintă o solutie a problemei. În strînsă legatură cu definitia formală a problemei satisfacerii restrictiilor se află, după cum se va vedea în continuare, notiunile de grad al problemei si aritate a problemei satisfacerii restrictiilor.

Definitie. Gradul unei variabile este cardinalitatea domeniului ei de valori, aritatea unei restrictii este numărul de variabile specificate de restrictie, gradul problemei este gradul maxim al variabilelor problemei, iar aritatea problemei este aritatea maximă a restrictiilor ei.

Exemplu. Fie o problemă de satisfacere a restrictiilor pentru care multimea de variabile este , domeniile de valori ale variabilelor au cardinalitatea , , si multimea de restrictii este cu , , . În acest caz gradul variabilelor este , , , aritatea restrictiilor este , ,, gradul problemei este 5 si aritatea problemei este 3.

Observatie. Există o relatie directă între gradul si aritatea unei probleme. Ori de cîte ori o problemă este reformulată cu o aritate mai mică, gradul ei creste.

4.1.2 Instante ale problemei satisfacerii restrictiilor

Problema satisfacerii restrictiilor, formulată în sectiunea anterioară, prezintă mai multe instante care se deosebesc prin următoarele cerinte: se cere găsirea unei solutii sau a tuturor solutiilor problemei; se cere cea mai bună solutie; se cere să se determine numărul de solutii; interesează dacă există o solutie sau o solutie partială a problemei.

O solutie partială a problemei satisfacerii restrictiilor reprezintă găsirea unei atribuiri de valori variabilelor pentru a satisface o submultime de restrictii ale problemei. În cadrul acestei instante, cunoscută sub numele de problema satisfacerii partiale a restrictiilor, apar două valori interesante:

Rsuf, numărul minim de restrictii ce trebuie satisfăcut, si

Rnec, numărul de restrictii după care se poate considera că s-a găsit o solutie acceptabilă si nu se mai continuă căutarea.

Ideea de bază a problemei satisfacerii partiale a restrictiilor este relaxarea conditiilor impuse pentru a permite si alte atribuiri de valori variabilelor. Problema satisfacerii partiale a restrictiilor apare în următoarele cazuri:

problema propusă spre rezolvare este suprarestrictionată si nu admite solutii

problema este prea dificilă pentru a fi rezolvată integral si se doreste găsirea unei solutii "suficient de bune"

se caută cea mai bună solutie care poate fi obtinută, în termenii unor resurse limitate.

Problema satisfacerii totale a restrictiilor, a cărei definitie a fost prezentată în sectiunea anterioară, este un caz particular al celei partiale pentru care , unde R este numărul total de restrictii.

Revenind la instantele problemei satisfacerii restrictiilor, în general, aflarea numărului sau existentei solutiilor necesită generarea unei solutii, iar găsirea celei mai bune solutii se reduce la găsirea unei solutii sau a tuturor solutiilor utilizînd un criteriu de optim.

Instante ale problemei satisfacerii restrictiilor apar în multe domenii ale inteligentei artificiale, cum ar fi etichetarea si interpretarea imaginilor, izomorfismul grafurilor, colorarea grafurilor si realizabilitatea booleană. Analiza circuitelor electrice si proiectarea sistemelor de revizuire a încrederii de tipul sistemelor de mentinere a consistentei datelor (Capitolul 5) conduc, de asemenea, la instante ale problemei satisfacerii restrictiilor.

Cele mai multe studii ale algoritmilor de rezolvare au fost făcute pentru problema satisfacerii restrictiilor de aritate doi, restrictii numite si restrictii binare. Majoritatea problemelor de satisfacere a restrictiilor, cazul finit, pot fi reformulate ca probleme cu restrictii binare. În acest caz problema poate fi reprezentată printr-un graf orientat si etichetat, numit graf de restrictii. În acest graf fiecare nod reprezintă o variabilă, iar fiecare arc orientat specifică o restrictie binară Rij între variabila Xi, asociată nodului i, si variabila Xj, asociată nodului j. În plus oricare ar fi Xi si Xj variabile ale problemei. Între două noduri neconectate în graf există restrictia universală, aceea care implică acceptarea tuturor combinatiilor de valori posibile între cele două variabile.

Exemplu. Se presupune existenta unui robot constient de restrictiile modei, robot ce trebuie să se îmbrace într-o dimineată. Robotul are la dispozitie o garderobă minimală formată din: pantofi (escarpeni si pantofi de tenis), cămăsi (verde si albă) si pantaloni (bleu, gri si jeans). Robotului i s-au specificat următoarele reguli ale modei:

1. Pantofii de tenis se pot purta numai cu jeans.

2. Escarpenii se pot purta numai cu pantalonii gri si cu cămasa albă.

3. Cămasa albă se poate îmbrăca fie cu jeans, fie cu pantalonii bleu.

4. Cămasa verde se poate îmbrăca numai cu pantalonii gri.

Se poate îmbrăca robotul si cum?

Graful de restrictii pentru problema de mai sus este prezentat în Figura 4.1.

Figura 4.1 Problema îmbrăcării robotului

Problema robotului este o problemă de satisfacere a restrictiilor binare, în care există trei variabile: Pantofi, Pantaloni, Cămăsi, cu domeniile de valori DPf, DPt, respectiv DC. Aritatea problemei este evident 2 (restrictii binare), iar gradul problemei este 3. Această instantă a problemei satisfacerii restrictiilor cere să se determine dacă există solutie si care este această solutie, în cazul în care ea există. Cititorul este îndemnat să încerce găsirea unei solutii pe cale informală.

4.1.3 Satisfacerea restrictiilor ca problemă de căutare în spatiul stărilor

Problema satisfacerii restrictiilor este, în cazul general, o problemă grea, deci NP-completă, exponentială în raport cu numărul de variabile ale problemei. Această problemă poate fi privită si ca o problemă de căutare în spatiul multimilor de restrictii. Starea initială a procesului de căutare contine restrictiile identificate în descrierea initială a problemei. Starea finală este o stare care a fost restrictionată "suficient" pentru a rezolva problema.

Fiind o problemă de căutare, rezolvarea problemei satisfacerii restrictiilor poate fi făcută aplicînd una din tehnicile de căutare a solutiei în spatiul stărilor [Nilsson,1980;Barr,1982; Pearl,1984]. Cea mai utilizată strategie de rezolvare a problemei satisfacerii restrictiilor este strategia de backtracking, varianta simplificată a căutării neinformate în adîncime. Această strategie este preferată datorită economiei de spatiu pe care o realizează în comparatie cu strategia de căutare în adîncime sau pe nivel.

Deoarece problema satisfacerii restrictiilor este o problemă NP-completă, este evident că nu s-a găsit încă un algoritm eficient de rezolvare pentru cazul general. Studiile efectuate au dus însă la următoarele rezultate:

(a) Identificarea unor subclase de probleme de satisfacere a restrictiilor care pot fi rezolvate în timp polinomial. Considerarea caracteristicilor particulare ale problemei poate duce la eliminarea completă a procesului de căutare în rezolvarea problemei, asa cum se va arăta în Sectiunile 4.3 si 4.5.

(b) Îmbunătătirea timpului de executie, chiar dacă complexitatea temporală rămîne în continuare exponentială. Procesul de căutare cu revenire poate deveni mai eficient dacă se utilizează variante îmbunătătite ale algoritmului de backtracking, variante ce vor fi prezentate în Sectiunile 4.6 si 4.7.

În realitate problema satisfacerii restrictiilor prezintă o caracteristică suplimentară fată de problemele generale de căutare. Propagarea restrictiilor de la o variabilă la alta poate reduce semnificativ spatiul de căutare. În plus, în functie de caracteristicile fiecărei probleme, multimea de restrictii poate fi extinsă cu restrictii suplimentare. Se consideră exemplul următoarei criptograme în care se cere să se asocieze consistent cifre literelor, astfel încît relatia matematică între numerele rezultate să fie îndeplinită. Multimea initială de restrictii este definită astfel: fiecare cifră corespunde unei singure litere si suma cifrelor trebuie să satisfacă relatia. Această multime initială de restrictii poate fi extinsă prin includerea restrictiilor inferate din regulile aritmeticii. De exemplu, din criptograma specificată

se poate deduce că si sau , deoarece , unde T reprezintă transportul de la cifra curentă la cifra mai semnificativă. În continuare dacă atunci , deci si cum transportul T este 0 sau 1 se deduce restrictia sau . Continuînd propagarea restrictiilor în acest mod, multimea initială de restrictii este semnificativ extinsă, deci spatiul de căutare este redus. După ce toate restrictiile au fost propagate, se intră într-un proces de căutare pentru găsirea unei solutii.

Asa cum se observă si din exemplul precedent, găsirea unei solutii pentru o problemă de satisfacere a restrictiilor constă, în general, dintr-un ciclu format din doi pasi de bază:

1. propagarea restrictiilor în scopul reducerii numărului posibil de valori ale variabilelor

2. dacă nu s-a găsit solutia se execută un proces de căutare a valorilor pentru variabilelor care nu au încă atribuite valori unice.

În cazul unei anumite clase de probleme, i.e. cazul (a) de mai sus, executia pasului întîi este suficientă pentru a găsi solutia, deci căutarea nu mai este necesară. Acesta este, de exemplu, cazul problemei etichetării consistente a desenelor utilizînd algoritmul de "filtrare" al lui Waltz. Deoarece etichetarea consistentă a desenelor a fost una din primele probleme de satisfacere a restrictiilor, problemele de tipul (a) se mai numesc si probleme de etichetare consistentă.

4.2 Cadrul logic al problemei satisfacerii restrictiilor

Este important de remarcat posibilitatea de abordare a problemei satisfacerii restrictiilor din perspectiva logicii simbolice, utilizînd proprietătile si algoritmii specifici acesteia. Pentru o prezentare mai detaliată a acestei perspective se poate consulta Mackworth [1992]. Consideratiile ce urmează se referă la cazul finit al problemei satisfacerii restrictiilor.

Fie următoarea problemă, cunoscută sub numele de problema steagului canadian. Se propune desenul prezentat în Figura 4.2 pentru steagul canadian si se cere să se coloreze acest steag numai cu două culori, rosu si alb, astfel încît fiecare regiune să fie colorată diferit fată de regiunile învecinate iar frunza de artar să fie rosie.

Figura 4.2 Problema steagului canadian

Problema este foarte simplă, solutia este evidentă, dar va servi, în continuare, ca suport al prezentării ideilor.

4.2.1 Reprezentarea problemei ca demonstrare a teoremelor în calculul cu predicate

1-Rezolvarea problemei satisfacerii restrictiilor poate fi formulată ca o demonstrare de teoreme, în formă restrinsă, în calculul cu predicate de ordinul I. Astfel, axiomele sînt reprezentate de multimea restrictiilor , unde cij sînt constante din domeniile de valori ale variabilelor problemei, elementele multimii Restrictii fiind deci atomi de bază. Concluzia, numită în continuare Scop, este

unde este notatia folosită pentru:

......

.

În aceste conditii, problema satisfacerii restrictilor este decidabilă. Acest lucru se poate demonstra prin construirea unei proceduri de decizie. Universul Herbrand al setului de clauze este . Deoarece nu există simboluri functionale, universul Herbrand al setului de clauze este finit.

Algoritm: Decidabilitatea problemei satisfacerii restrictiilor

1.

2. pentru fiecare execută

2.1 dacă

atunci

3. întoarce rezultat

sfîrsit.

În algoritmul de mai sus, Hn este multimea constantă de nivel n din universul Herbrand, iar implicatia este adevărată dacă si numai dacă toti atomii din apartin multimii de restrictii. Acest algoritm se termină întotdeauna si întoarce valoarea adevărat dacă si numai dacă multimea restrictiilor implică concluzia Scop si fals în caz contrar. Numărul de predicate evaluate de acest algoritm este , unde reprezintă numărul de atomi din .

Pentru problema steagului canadian multimea restrictiilor, utilizînd notatiile: a si r pentru culorile alb si rosu; Stg, Dr, Ctr si Frunza pentru regiunile din stînga, dreapta, centru si respectiv frunza steagului si Neeg pentru neegalitatea a două elemente, este

,

iar scopul este

.

Universul Herbrand al multimii de clauze este , multimea constantă de nivel patru a universului Herbrand fiind . Aplicînd algoritmul de decizie, răspunsul pentru acest caz este adevărat cu instanta .

Pentru a alege reprezentarea logică cea mai potrivită asociată unei probleme, trebuie ales sistemul cu cele mai simple capacităti descriptive capabil să reprezinte problema. Asa cum se observă în Figura 4.3, problema satisfacerii restrictiilor cazul finit poate fi reprezentată logic utilizînd logica propozitiilor, deci un sistem logic mai simplu decît cel al calculului cu predicate de ordinul I.

Figura 4.3 Relatia între anumite sisteme logice si sisteme de rezolvare a problemelor

4.2.2 Reprezentarea problemei ca demonstrare a teoremelor în calculul propozitional

Algoritmul de decizie prezentat în sectiunea anterioară poate fi interpretat ca implementarea unei demonstrări de teoreme în calculul propozitional. Dacă Scop este o teoremă, atunci este o formulă inconsistentă. Problema satisfacerii restrictiilor are o solutie dacă si numai dacă multimea este falsă în orice interpretare peste universul Herbrand.

Deoarece nu există cuantificatori universali în Scop, rezultă că nu există cuantificatori existentiali în ~Scop, deci nu există functii Skolemn, ceea ce face ca universul Herbrand să fie finit. Acest rezultat permite înlocuirea clauzei Scop cu multimea instantelor sale de bază. Pentru cazul problemei steagului canadian multimea instantelor de bază ale clauzei Scop este

....,

...,

.

Se obtine o multime de clauze formată dintr-o submultime de clauze pozitive care rezultă din multimea de restrictii, si o submultime de clauze negative care rezultă din concluzie. Se observă că setul de clauze este o multime de clauze Horn si este nerealizabil dacă si numai dacă problema satisfacerii restrictiilor are solutie. Deoarece setul de clauze este Horn, problema are complexitatea timp proportională cu dimensiunea formulei, dar fiind clauze negative în formulă, complexitatea timp este exponentială în raport cu numărul de variabile, n. Acest rezultat este în concordantă cu afirmatia făcută la începutul capitolului conform căreia problema satisfacerii restrictiilor este o problemă NP-completă.

Pentru demonstrarea teoremei Scop prin respingere rezolutivă se poate aplica strategia rezolutiei unitare, care este completă pentru clauze Horn în calculul propozitional. Asa cum s-a arătat în Capitolul 3, problema este decidabilă.

4.2.3 Reprezentarea problemei în limbajele logice

Cel mai răspîndit limbaj de programare logică este limbajul Prolog [Clocksin,Mellish,1981]. Problema satisfacerii restrictiilor poate fi reprezentată sub forma unui program Prolog, odată ce s-a arătat modul în care ea poate fi exprimată ca formalism logic. În cazul problemei steagului canadian, reprezentarea Prolog a problemei este următoarea:

stg(r). ctr(r). neeg(a,r).

stg(a). ctr(a). neeg(r,a).

dr(r). frunza(r).

dr(a).

?- stg(X), dr(Y), ctr(Z), frunza(U), neeg(X, Y), neeg(Y, Z), neeg(Y, U).

Solutia scopului Prolog indicat este

X = r, Y = r, U = r, Z = a

si reprezintă solutia problemei steagului canadian.

Pentru probleme complexe, o astfel de rezolvare, care utilizează numai strategia de backtracking a limbajului Prolog, poate fi foarte ineficientă. De aceea s-au dezvoltat diverse limbaje logice de satisfacere a restrictiilor, numite limbaje de programare logică restrictivă. Pornind de la modelul Prolog, ideea de bază a acestor limbaje este utilizarea satisfacerii restrictiilor în locul unificării, ca operatie de bază a limbajului, realizarea consistentei locale prin propagarea restrictiilor si utilizarea strategiei de control "branch and bound", pe lîngă algoritmul de backtracking pentru problemele de optimizare. Exemple de astfel de limbaje sînt CHIP [Dincbas,s.a.,1990], CLP(R), cc(FD) [Hentenryck,1992] si altele.

4.3 Utilizarea satisfacerii restrictiilor în interpretarea desenelor

În sfera inteligentei artificiale intră si robotica, ramură a inteligentei artificiale care se ocupă de interfatarea rationamentului abstract cu lumea reală prin intermediul unor dispozitive de tip senzor si a unor motoare. În general un robot receptionează stimuli de la o serie de dispozitive (microfoane, camere video, sonare, etc.) si produce miscări ale componentelor sale sau sunete.

Vizualizarea cu ajutorul calculatorului este un subdomeniu al roboticii care se ocupă de interpretarea informatiei vizuale. În general, un modul de vizualizare are două componente: o componentă de nivel scăzut, ce determină în imaginea primită de la o cameră video linii, suprafete si texturi, si o componentă de nivel înalt, care va construi din elementele recunoscute de prima un model tridimensional al obiectelor prezente în imagine. În sectiunile următoare vor fi prezentate elemente ale componentei de nivel înalt a vizualizării.

4.3.1 Problema etichetării desenelor

Problema etichetării desenelor poate fi enuntată în următorul mod: avînd ca elemente de intrare lista liniilor (muchiilor) si a vîrfurilor unor obiecte tridimensionale, determinate prin preprocesarea unei imagini, se cere să se identifice obiectele din imagine. De exemplu, fiind date cele nouă linii ale desenului din Figura 4.4, care este modalitatea prin care ele sînt interpretate ca reprezentînd un obiect tridimensional, i.e. un paralelipiped si nu un hexagon cu trei linii în interior.

Figura 4.4 Desen - imagine reprezentată prin linii si vîrfuri

Se pune problema întelegerii unui desen format din linii ce reprezintă obiecte cu fete plane. Aceasta revine la a determina care sînt liniile extreme ce separă obiectele, deci a determina ce obiecte si ce contururi de obiecte se găsesc în imagine. Aparent, numărul de combinatii posibile poate fi enorm, dar, în realitate acest număr se reduce datorită restrictiilor naturale existente în lumea obiectelor fizice. Aceste restrictii naturale pot fi utilizate pentru a limita interpretările posibile ale unui desen format din linii [Clowes,1971;Montanari,1974;Waltz,1975].

Waltz [1975] a propus un algoritm pentru etichetarea consistentă a desenelor formate din linii. Acesta este un algoritm de satisfacere a restrictiilor în care partea de căutare este eliminată. Algoritmul produce o etichetare consistentă a desenului numai pe baza restrictiilor naturale existente într-un astfel de desen.

Desi algoritmul lui Waltz poate fi extins pentru a acoperi si alte tipuri de obiecte, în discutia următoare se vor considera numai desene ce reprezintă poliedre (obiecte tridimensionale solide ale căror suprafete sînt plane si mărginite de linii drepte) avînd numai vîrfuri triedre, adică vîrfuri în care se întîlnesc exact trei plane. De exemplu, în Figura 4.5, obiectele (a) si (b) sînt obiecte triedrale, în timp ce obiectele (c) si (d) nu sînt triedrale, vîrfurile vizibile în care se întîlnesc mai mult de trei plane fiind marcate cu litera A.

Figura 4.5 Tipuri de poliedre

O linie a unui desen ce respectă conditiile impuse mai sus poate fi linie convexă, linie concavă sau linie extremă. O linie convexă separă două fete vizibile ale unui poliedru avînd proprietatea că o linie care le uneste rămîne în interiorul poliedrului. O linie concavă separă două fete a două poliedre avînd proprietatea că o linie între cele două fete ar trece prin spatiul extern obiectelor. O linie extremă exprimă aceeasi situatie fizică ca si linia convexă, dar în acest caz desenul este orientat astfel încît numai una din cele două fete ale poliedrului este vizibilă, deci o astfel de linie marchează frontiera dintre poliedru si fondul pe care acesta se află.

Pentru figuri mai complicate, trebuie considerate si alte tipuri de linii, de exemplu cele de demarcatie între fete distincte dar coplanare sau linii ce despart umbrele obiectelor de obiecte. Algoritmul lui Waltz poate fi usor extins pentru a lucra cu mai multe tipuri de linii, dar în continuare prezentarea va trata numai cazul desenelor în care apar cele trei tipuri de linii descrise anterior: convexe, concave si extreme.

Se consideră următoarea conventie de etichetare a liniilor: + pentru linii convexe, pentru linii concave si sau pentru linii extreme. Directia de plasare a săgetii, sau , pe liniile extreme depinde de pozitia fetei obiectului si a fondului fată de linie. Dacă fata este la dreapta liniei si în jos atunci săgeata se plasează , iar dacă fata obiectului este la dreapta liniei si în sus, plasarea săgetii va fi . Altfel spus, parcurgînd linia în sensul dat de săgeată, poliedrul se va afla la dreapta liniei iar fondul desenului se va afla la stînga liniei. Deci, pentru liniile extreme, conventia de etichetare se poate stabili parcurgînd conturul format din aceste linii si mentinînd tot timpul obiectul la dreapta. Directia de mers este directia săgetilor cu care se face etichetarea.

Figura 4.6 Conventia de etichetare a liniilor desenelor

Exemplu. Figura 4.7 prezintă etichetarea a două paralelipipede utilizînd conventiile specificate. Vîrfurile A si A' sînt vîrfurile cele mai apropiate de privitor ale celor două paralelipipede. Liniile care pornesc din A si A' sînt toate convexe. Liniile G'D' si D'F' sînt linii concave indicînd frontiera dintre cele două paralelipipede care se află în contact. Restul liniilor sînt linii extreme indicînd faptul că nu există conexiune fizică între cele două paralelipipede, de exemplu B'E' si E'C', si între paralelipipedul P si fondul desenului, de exemplu BE si EC, dar există alte laturi ale paralelipipedelor care nu pot fi văzute.

Figura 4.7 Un exemplu de etichetare a liniilor unui desen

Observatie. Dacă în desenul din exemplul anterior, liniile G'D' si D'F' ar fi fost etichetate ca linii extreme, semnificatia desenului ar fi fost cu totul alta. În acest caz cele două paralelipipede nu ar fi fost în contact, ele fiind deci "suspendate" în aer.

Odată ce s-a reusit etichetarea desenului, se pot recunoaste obiectele individuale si pozitiile lor relative. Considerînd cele patru etichete posibile pentru linii (+, , si ), pentru un desen continînd N linii există posibilităti de etichetare a desenului. Trebuie deci găsit un răspuns la întrebarea "Cum se poate găsi etichetarea corectă?". Pentru a realiza acest deziderat, trebuie tinut cont de faptul că fiecare linie are la capetele ei un vîrf. Pentru cazul figurilor triedrale, există numai patru tipuri de vîrfuri posibile: L, Furculită, Săgeată si T, prezentate în Figura 4.8.

Figura 4.8 Cele patru tipuri de vîrfuri ale figurilor triedrale

Rotatia unui vîrf este nesemnificativă; de asemenea, nu contează nici dimensiunea unghiurilor, cu exceptia cazului în care trebuie făcută distinctia între unghiuri ascutite (<90o) si obtuze (>90o), pentru a distinge între vîrfuri de tip Furculită si Săgeată.

4.3.2 Determinarea restrictiilor de etichetare a desenelor

Dacă se reuseste impunerea unui număr limitat de etichetări pentru fiecare tip de vîrf posibil, atunci aceste restrictii vor impune restrictii liniilor ce leagă aceste vîrfuri si se va reduce numărul posibil de etichetări ale desenului. Pentru a stabili restrictiile de etichetare a vîrfurilor, se consideră numărul maxim de combinatii de linii pentru fiecare tip de vîrf:

Vîrful de tip L leagă 2 linii, deci are maximum 16 etichetări posibile

Vîrfurile de tip T, Furculită si Săgeată leagă 3 linii, deci au maximum 64 etichetări posibile fiecare.

Există deci un număr maxim de 208 posibile etichetări pentru un vîrf triedral. Care dintre acestea sînt efectiv permise de restrictiile lumii fizice? Pentru a putea răspunde la această întrebare se consideră cele trei plane care formează un vîrf triedru. Aceste plane împart spatiul tridimensional în opt părti (opt octanti), deoarece fiecare plan împarte spatiul în două si nici unul din plane nu este identic sau paralel cu celălalt. Obiectele de tip triedru pot fi diferite din punct de vedere al octantilor pe care îi ocupă si din punct de vedere al pozitiei din care sînt privite. Fiecare vîrf ce poate apare într-un obiect triedral corespunde unei pozitii a obiectului ce ocupă diversi octanti si unui octant liber din care se priveste vîrful.

Pentru a determina toate posibilitătile reale de etichetare a vîrfurilor, trebuie să se ia în considerare cum pot fi asezate obiectele în octanti si cum se pot vedea vîrfurile pentru aceste pozitii. Cei opt octanti formati de un vîrf triedru sînt reprezentati în Figura 4.9 (a). Figura 4.9 (b) prezintă un obiect care ocupă unul din cei opt octanti formati prin intersectia planelor corespunzătoare vîrfului A.

(a)

(b)

Figura 4.9 Un poliedru care ocupă un octant

Dacă în Figura 4.9 (b) se priveste vîrful A din ceilalti sapte octanti liberi, directiile de privire fiind marcate prin săgeti numerotate, se obtin următoarele etichetări posibile pentru vîrful A:

Dacă se consideră aceste sapte etichetări si se elimină rotatiile si variatiile unghiulare, se constată că rămîn numai trei etichetări distincte:

Dacă se continuă acest proces pentru obiecte ce ocupă doi octanti, trei octanti s.a.m.d. pînă la sapte octanti (nu pot exista vîrfuri dacă toti cei opt octanti sînt ocupati) atunci, după eliminarea etichetărilor echivalente prin rotiri si variatii de unghiuri, se obtin numai 18 etichetări fizice posibile pentru vîrfuri triedrale [Clowes,1971], prezentate în Figura 4.10.

Figura 4.10 Cele 18 etichetări posibile ale vîrfurilor triedrale

Din cele 208 de etichetări posibile, numai 18 sînt fizic posibile. S-a găsit deci o multime de restrictii destul de severe. Acelasi proces se poate aplica si pentru figuri ce contin si alte tipuri de linii sau vîrfuri ce nu sînt triedre. S-a descoperit că raportul între numărul de etichetări fizic posibile si cel teoretic posibile în acest caz este chiar mai mic de 18/208.

În urma acestei analize s-a stabilit o multime de restrictii care vor fi folosite de algoritmul de etichetare a liniilor unui desen. Aceste restrictii sînt statice, deoarece regulile fizice pe care se bazează nu se schimbă niciodată si nu trebuie să fie reprezentate explicit ca stare a problemei. Restrictiile statice, determinate de restrictiile lumii fizice, pot fi codificate direct în algoritm. Cealaltă clasă de restrictii, restrictiile dinamice, reprezintă restrictiile de etichetare a vîrfurilor pentru fiecare desen în parte. Acestea vor fi reprezentate si prelucrate explicit de algoritm. Pornind de la restrictiile lumii fizice, descrise anterior, Waltz [1975] a propus un algoritm pentru rezolvarea problemei etichetării desenelor, algoritm care nu necesită căutare.

Waltz a proiectat un proces de filtrare care elimină interpretările inconsistente în timpul analizei desenului si a observat experimental că efortul necesar realizării procesului de filtrare este aproape liniar în raport cu dimensiunea desenului (numărul de vîrfuri). Argumente euristice bazate pe semantica domeniului justificau informal această comportare liniară. Ulterior, Mackworth si Freuder [1985] au demonstrat formal că orice proces de filtrare a desenelor de tipul celui propus de Waltz poate fi realizat în timp de complexitate liniară. În plus, ei au identificat o întreagă subclasă de probleme de satisfacere a restrictiilor care admit rezolvări în timp liniar, deci nu necesită căutare. Aceste probleme vor fi discutate în Sectiunea 4.5.

Ideea algoritmului lui Waltz este următoarea: pentru a eticheta liniile din desen se selectează un vîrf si toate etichetările lui posibile, apoi se trece la un vîrf adiacent, cu toate etichetările lui posibile. Linia ce uneste cele două vîrfuri trebuie, în final, să fie etichetată cu o singură etichetă constistentă cu cele două etichetări ale vîrfurilor. Deci din multimile de etichetări posibile ale celor două vîrfuri se elimină acele posibilităti care fac ca linia ce le uneste să nu aibă o etichetă unică. Procesul se repetă pentru alte vîrfuri si restrictiile se propagă înapoi la vîrfurile deja selectate, deci setul de etichetări posibile pentru acestea va fi redus si mai mult.

Exemplu. În Figura 4.11, vîrfurile 2, 4 si 6 sînt de tip Săgeată. Etichetarea începe cu liniile extreme si din cauza vîrfurilor 2, 4 si 6 etichetarea liniilor interioare va fi +, +, +. De fapt etichetarea vîrfului 7 se poate face numai pe baza vîrfului 2, deoarece acesta impune o linie + si singurul vîrf de tip Furculită cu + este cel care are toate trei liniile etichetate cu +.

Figura 4.11 Un exemplu simplu al procesului de etichetare

În continuare se prezintă algoritmul de etichetare a desenelor care realizează procesul descris anterior. În algoritm, s-a notat cu NV numărul vîrfurilor din desenul de etichetat, si cu LEV lista etichetărilor posibile pentru un nod V, această listă fiind specifică tipului nodului V, conform celor arătate în sectiunea anterioară. În cadrul algoritmului este folosită notiunea de etichetări consistente conform cu definitia următoare. Etichetarea unui vîrf, formată din etichetele celor două sau trei linii care îl determină, este numită în algoritm etichetă a vîrfului, iar listele de etichetări ale vîrfului, liste de etichete, pentru simplificarea exprimării.

Definitie. Două etichetări apartinînd listelor de etichetări atasate la două vîrfuri adiacente V si A, si , sînt consistente dacă linia care leagă vîrful V de vîrful A are o etichetă un 444j91e ică determinată de etichetările EV si EA.

Algoritm: Etichetarea desenelor

1. Identifică si etichetează liniile de contur exterior ale desenului

2. Numerotează vîrfurile desenului

2.1. Alege un vîrf V de pe o linie de contur si numerotează-l V

2.2.

2.3. cît timp mai sînt vîrfuri nenumerotate pe conturul exterior execută

2.3.1. Alege un vîrf nenumerotat de pe conturul exterior si numerotează-l Vi

2.3.2.

2.4. cît timp mai sînt vîrfuri nenumerotate în desen execută

2.4.1. Alege un vîrf deja numerotat Vk

2.4.2. Alege un vîrf nenumerotat, adiacent lui Vk, si numerotează-l Vi

2.4.3.

3. pentru pînă la NV execută

3.1.

3.2. Marchează V ca vîrf vizitat

3.3. Asociază lui V lista etichetelor LEV corespunzătoare tipului de vîrf

3.4. pentru fiecare vîrf A adiacent cu V si deja vizitat execută

3.4.1. Elimină din LEV etichetele care nu sînt consistente cu cel putin o etichetă din LEA

3.5.

sfîrsit.

pentru fiecare vîrf vizitat A, adiacent cu V execută

1. Elimină din LEA etichetele ce nu sînt consistente cu cel putin o etichetă din LEV

2. dacă s-a eliminat cel putin o etichetă din LEA

atunci

sfîrsit.

Observatii:

În pasul 1 al algoritmului liniile conturului exterior sînt găsite urmărind un traseu astfel încît nici un vîrf să nu rămînă în exteriorul traseului, pornind dintr-un vîrf al conturului exterior. Etichetarea acestor linii se face respectînd conventiile enuntate în Sectiunea 4.3.1.

În pasul 2 numerotarea vîrfurilor apartinînd conturului exterior al desenului va corespunde ordinii în care acestea au fost vizitate în timpul procesului de etichetare de la pasul 1. Din această cauză pasul 1 si pasii 2.12.3 pot fi executati simultan.

Alegerea unui vîrf de pe conturul exterior, ca vîrf de plecare în propagarea restrictiilor, la pasul 2.1, se explică prin faptul că liniile conturului exterior, fiind deja etichetate la pasul 1, vor impune restrictii mai puternice asupra vîrfurilor mentionate.

În pasul 3.4 al algoritmului, asa cum se poate vedea, sînt satisfăcute restrictiile locale, în timp ce în pasul 3.5, prin apelul subprogramului Propagă, se realizează propagarea restrictiilor.

Acest algoritm va găsi întotdeauna o etichetare unică corectă si consistentă, dacă o astfel de etichetare există. Dacă desenul este ambiguu, la terminarea algoritmului va exista cel putin un vîrf V avînd mai mult de o etichetă în lista de etichete atasate LEV. Un desen este ambiguu dacă în el apar si alte tipuri de linii si vîrfuri decît cele luate în consideratie în Sectiunea 4.3.1 sau dacă reprezintă o figură imposibilă. Algoritmul lui Waltz se extinde usor si pentru cazul în care desenul include si alte tipuri de linii, provenite fie din figuri ce nu sînt triedrale, fie din desene cu umbre ale obiectelor. De fapt, programul scris de Waltz include si aceste cazuri. În plus, cu cît numărul de tipuri de linii admise în desen este mai mare, cu atît raportul între numărul de restrictii fizic posibile si numărul de restrictii teoretic posibile este mai mic.

În cazul desenelor inerent ambigui, cum ar fi cel din Figura 4.12, algoritmul nu poate determina o etichetare consistentă deoarece aceasta nu există.

Figura 4.12 Desenul unei figuri imposibile, propus de R. Penrose

Procesul de filtrare prezentat în algoritmul lui Waltz poate fi executat în timp liniar pentru orice desen, complexitatea lui fiind O(n) si O(d), unde n este numărul de vîrfuri si d este numărul de etichetări posibile ale vîrfurilor.

4.4 Metode de rezolvare a problemei satisfacerii restrictiilor

Problema etichetării desenelor, prezentată în sectiunea anterioară, reprezintă o instantă a unei subclase de probleme de satisfacere a restrictiilor care nu necesită căutare. Pentru cazul unei probleme generale de satisfacere a restrictiilor se pot pune următoarele două întrebari: "Cum se poate identifica dacă problema admite o rezolvare în timp liniar?" si "Cum se pot îmbunătăti performantele procesului de căutare în cazul în care problema necesită un timp exponential de rezolvare?".

4.4.1 Metoda de bază: backtracking

În cazul general, problema satisfacerii restrictiilor este o problemă de căutare în spatiul stărilor. Strategia preferentială de rezolvare a acestei probleme este strategia de backtracking [Nilsson,1980;Pearl,1984;Winston,1984]. Strategia de backtracking este o variantă simplificată a căutării în adîncime a solutiei. În cadrul algoritmului de backtracking se selectează starea de explorat si se generează numai un singur succesor al acesteia. Acest succesor este fie starea finală, deci solutia problemei, fie noua stare care va fi explorată. În cazul în care o anumită stare nu mai are nici un succesor, procesul se întoarce la cea mai apropiată stare anterioară care mai are încă stări succesoare negenerate.

Se prezintă în continuare două variante ale algoritmului de backtracking. Prima variantă, nerecursivă, este o adaptare a algoritmului general de căutare în adîncime care utilizează listele FRONTIERA si TERITORIU pentru a memora nodurile explorate, respectiv expandate [Pearl,1984]. Deoarece în algoritmul de backtracking se memorează numai stările aflate pe calea (partială) curentă de căutare si aceste stări sînt marcate ca explorate, lista TERITORIU devine inutilă.

Algoritm: Backtracking nerecursiv

1. Crează lista /* Si este starea initială */

2. dacă

atunci întoarce INSUCCES /* nu există solutie /*

3. Fie S prima stare din FRONTIERA

4. dacă toate stările succesoare ale lui S au fost deja generate

atunci

4.1. Elimină S din FRONTIERA

4.2. repetă de la 2

5. altfel

5.1. Generează S', noua stare succesoare a lui S

5.2. Introduce S' la începutul listei FRONTIERA

5.3. Stabileste legătura

5.4. Marchează în S faptul că starea succesoare S' a fost generată

5.5. dacă S' este stare finală

atunci

5.5.1. Afisează calea spre solutie urmărind legăturile

5.5.2. întoarce SUCCES /* s-a găsit o solutie */

5.6. repetă de la 2

sfîrsit.

Observatii:

Algoritmul de backtracking realizează o economie de spatiu considerabilă fată de cel al căutării în adîncime, deoarece memorează numai un singur succesor al stării curente. Acest avantaj este contracarat de imposibilitatea algoritmului de backtracking de a utiliza informatii euristice pentru evaluarea celor mai promitătoare stări următoare.

În algoritmul prezentat nu s-a introdus o adîncime maximă de căutare, deci s-a presupus spatiul de căutare arbore finit.

Algoritmul prezentat găseste o singură solutie. El poate fi usor modificat pentru a determina toate solutiile.

O a doua variantă a algoritmului de backtracking, prezentată în continuare, este o solutie recursivă si ea va sta la baza algoritmilor cu eficientă crescută care vor fi prezentati în sectiunile următoare. În algoritmul recursiv, orientat pe rezolvarea problemei satisfacerii restrictiilor, se folosesc următoarele notatii:

sînt variabilele problemei, N fiind numărul de variabile ale problemei,

U este un întreg care reprezintă indicele variabilei curent selectate pentru a i se atribui o valoare,

F este un vector indexat după indicii variabilelor, în care sînt memorate selectiile de valori făcute de la prima variabilă si pînă la variabila curentă; F[U] este deci valoarea atribuită variabilei curente XU.

Algoritm: Backtracking recursiv

BKT

pentru fiecare valoare V a lui XU execută

1.

2. dacă Verifică = adevărat

atunci

2.1. dacă

atunci BKT

2.2. altfel

2.2.1. Afisează valorile din vectorul F /* F reprezintă solutia problemei */

2.2.2. întrerupe ciclul

sfîrsit.

Verifică

1.

2.

3. cît timp execută

3.1.

3.2.

3.3. dacă

atunci întrerupe ciclul

4. întoarce test

sfîrsit.

În continuare se prezintă o implementare în limbajul Lisp a strategiei de backtracking. Spre deosebire de algoritmul prezentat, structurile de date utilizate nu sînt vectoriale, ci de tip listă, conform specificului limbajului, iar functia BKT are trei parametri. Parametrul suplimentar Cale memorează o listă de perechi cu punct , perechi ce reprezintă atribuirile făcute pînă în momentul apelului functiei. Initial acest parametru este nil, el completîndu-se treptat cu o solutie a problemei. Parametrul Variabile memorează lista variabilelor rămase neinstantiate pînă în momentul apelului functiei BKT. Primul element al acestei liste reprezintă variabila curentă a procesului de backtracking. Parametrul Valori memorează lista domeniilor de valori ale variabilelor neinstantiate. Primul element al acestei liste este domeniul de valori al variabilei curente. Predicatul Verifica-p este codificarea Lisp a subprogramului Verifică. Verifica-p utilizează predicatul exista-relatie-p, corespunzător functiei Relatie din algoritm, si specific fiecărei probleme particulare, pentru verificarea compatibilitătii atribuirilor de valori pentru două variabile. Variabilele speciale *VERIFICARI* si *EXPANDARI* memorează numărul de teste de consistentă si de expandări necesare pentru o anumită solutie. Aceste variabile sînt utile pentru a putea evalua performantele diverselor variante de algoritmi de backtracking. Variabila specială *SOLUTII* memorează solutiile unei probleme, fiecare solutie fiind memorată împreună cu parametrii ei de calitate *VERIFICARI* si *EXPANDARI*. Aici apare o altă diferentă fată de algoritmul prezentat, în algoritm determinîndu-se doar prima solutie a problemei. *VARIABILE* si *VALORI* sînt două variabile speciale care memorează lista de variabile si pe cea a domeniilor de valori ale variabilelor specifice unei anumite probleme.

(defparameter *EXPANDARI* 0)

(defparameter *VERIFICARI* 0

(defparameter *SOLUTII* nil)

(defun BKT (Cale Variabile Valori)

(let (Caleaux)

(dolist (Val (car Valori))

(when (Verifica-p (setf Caleaux (cons (cons (first Variabile) Val) Cale)))

(if (cdr Variabile)

(progn

(incf *EXPANDARI*)

(BKT Caleaux (rest Variabile) (rest Valori)))

(push (cons (cons *EXPANDARI* *VERIFICARI*) Caleaux) *SOLUTII*))))))

(defun Verifica-p (Cale)

"Verifica compatibilitatea primei asignari din Cale cu restul asignarilor.

Intoarce t dacă prima asignare este compatibila cu restul asignarilor din Cale

sau nil in caz contrar."

(let ((var (caar Cale))

(val (cdar Cale)))

(every #'(lambda (pereche)

(incf *VERIFICARI*)

(exista-relatie-p var val (first pereche) (rest pereche)))

(rest Cale))))

Solutiile unei probleme specifice se obtin prin apelul

(BKT nil *VARIABILE* *VALORI*)

Vizualizarea solutiilor si a parametrilor de calitate a acestora fiind posibilă prin apelul

(dolist (solutie (reverse *SOLUTII*))

(format t "~&Solutia: ~A Expandari: ~A Verificari: ~A"

(rest solutie)(caar solutie) (cdar solutie)))

4.4.2 Îmbunătătirea performantelor algoritmilor de satisfacere a restrictiilor

Principala metodă de rezolvare a problemei satisfacerii restrictiilor este, asa cum s-a spus, algoritmul de backtracking. Utilizînd un astfel de algoritm complexitatea timp este , iar complexitatea spatiu este . Algoritmul de backtracking este ineficient din mai multe motive, printre care:

Are o privire locală asupra rezolvării problemei, prin aceasta întelegînd faptul că dacă variabila X are o valoare incompatibilă cu valoarea atribuită variabilei , toate valorile pentru variabilele sînt totusi verificate.

Utilizează un spatiu de memorie restrîns dar, datorită acestui lucru, nu memorează actiuni anterioare, ci le reexecută dacă ajunge din nou la executarea acestor actiuni. De exemplu, dacă prima valoare din domeniul variabilei Xi este incompatibilă cu prima valoare din domeniul variabilei , testul de incompatibilitate va fi efectuat prima oară pentru prima atribuire de valoare lui Xj, dar si după fiecare revenire la o variabilă anterioară lui Xi, si avans pînă la Xi, si apoi la Xj. Dacă astfel de incompatibilităti sînt tinute minte, este posibil să se evite reefectuarea testelor cu rezultat cunoscut.

Există mai multe posibilităti de îmbunătătire a performantelor algoritmului de backtracking utilizat în rezolvarea problemei satisfacerii restrictiilor, care duc la reducerea spatiului de căutare dar, de multe ori, algoritmii rezultati folosesc mai multă memorie. Totusi, acesti algoritmi folosesc mai putină memorie decît strategiile de căutare în lătime sau în adîncime. O clasificare a metodelor de îmbunătătire a performantelor algoritmilor de căutare este prezentată în continuare. De cele mai multe ori, aceste metode nu modifică complexitatea timp exponentială a algoritmului, dar realizează cresterea eficientei procesului de căutare.

Există trei modalităti de bază pentru cresterea performantelor algoritmilor de rezolvare a problemei satisfacerii restrictiilor [Meseguer,1989].

(1) Algoritmi care modifică spatiul de căutare prin eliminarea unor regiuni ce nu contin solutii. Acesti algoritmi pot fi împărtiti, la rîndul lor, în două categorii, prezentate mai jos.

(a) Algoritmi care modifică spatiul de căutare înainte de a începe procesul de căutare, numiti si algoritmi de îmbunătătire a consistentei reprezentării. Acesti algoritmi pot fi clasificati astfel:

Algoritmi care realizează consistenta locală a arcelor sau a căilor în graful de restrictii

Algoritmi de căutare fără backtracking, pentru o anumită clasă de probleme care admite astfel de rezolvări

Algoritmi de căutare cu backtracking limitat

(b) Algoritmi care modifică spatiul de căutare în timpul procesului de căutare, numiti si algoritmi hibrizi deoarece modificarea spatiului de căutare si căutarea se execută în acelasi timp. Acesti algoritmi îmbunătătesc performantele rezolvării prin reducerea numărului de teste. Algoritmii hibrizi pot fi clasificati astfel:

Tehnici prospective. La selectarea unei valori pentru o variabilă se verifică consistenta domeniilor de valori ale variabilelelor neconsiderate încă.

- Algoritmul de căutare cu predictie completă

- Algoritmul de căutare cu predictie partială

- Algoritmul de căutare cu verificare predictivă

Tehnici retrospective. La selectarea unei valori pentru o variabilă se verifică consistenta cu domeniile de valori ale variabilelor deja selectate.

- Algoritmul de backtracking cu salt

- Algoritmul de backtracking cu marcare

- Algoritmul de backtracking cu multime conflictuală

(2) Utilizarea euristicilor. Se stabilesc euristici generale, independente de problemă, care ghidează căutarea si ajută la reducerea efortului de căutare de cele mai multe ori. Acele euristici pot fi euristici de bază, euristici teoretice sau euristici bazate pe retele.

(3) Utilizarea structurii unei probleme particulare pentru găsirea unui algoritm eficient. În acest caz este vorba de fapt tot de utilizarea euristicilor, dar a euristicilor specifice problemei. Exemple de astfel de probleme sînt algoritmul de filtrare al lui Waltz prezentat în Sectiunea 4.3 si problema căsătoriilor stabile (Sectiunea 4.10).

Clasificarea de mai sus este departe de a fi exhaustivă si, în plus, diverse metode pot fi combinate. De exemplu, euristicile generale pot fi utilizate în una din tehnicile prospective sau retrospective. Modalitatea (2) de crestere a performantelor este prezentată în sectiunea următoare, iar cazurile (1a) si (1b) vor fi prezentate în Sectiunea 4.5 si respectiv sectiunile 4.6 si 4.7.

4.4.3 Utilizarea euristicilor generale în rezolvarea problemei satisfacerii restrictiilor

Utilizarea euristicilor în rezolvarea problemei satisfacerii restrictiilor se realizează prin considerarea următoarelor ordonări: ordonarea variabilelor în vederea atribuirii, ordonarea valorilor în vederea atribuirii, ordonarea testelor variabilelor anterioare si selectia variabilelor anterioare în backtracking. O combinatie adecvată a acestor patru criterii permite implementarea unor euristici simple, cu un cost computational scăzut. Anumite criterii euristice dintre cele prezentate în continuare formează si ideea de plecare a anumitor tehnici prospective si retrospective.

Există două criterii de bază pentru ghidarea căutării. Dacă se cere găsirea tuturor solutiilor problemei, se foloseste criteriul primei blocări, în care sînt încercate întîi cele mai probabile căi care ar putea conduce la insucces. Deoarece în cazul determinării tuturor solutiilor, tot spatiul de căutare trebuie să fie parcurs, detectarea cît mai devreme a căilor care nu duc la solutie prezintă avantajul reducerii spatiului de căutare. Dacă se cere găsirea unei singure solutii, este bun criteriul căii promitătoare, i.e. criteriul invers. Se încearcă întîi căile cele mai promitătoare pentru găsirea unei solutii.

În functie de criteriile prezentate anterior, se pot defini următoarele euristici:

(1) Ordonarea variabilelor

Această euristică se bazează pe alegerea unei ordonări a variabilelor astfel încît variabilele legate prin restrictii explicite să fie consecutive. Acest criteriu încearcă să evite, pe cît posibil, atribuiri de valori între variabile legate prin restrictii implicite. Restrictiile explicite sînt cele specificate de multimea de restrictii definită în problemă. Ele se numesc asa pentru a le deosebi de restrictiile implicite, care apar ca efect lateral al celor explicite în procesul de inspectare a spatiului de căutare.

Dacă se cer toate solutiile, variabilele care apar într-un număr mic de restrictii si au domenii de valori cu cardinalitate mică, sînt preferate, deci asezate la început în ordonare. Dacă se cere numai o solutie, criteriul opus celui enuntat mai sus este cel adecvat. În acest caz, se încearcă mai întîi atribuiri de valori pentru variabilele cu domenii de valori cu cardinalitate mare si legate printr-un număr mare de restrictii.

(2) Ordonarea valorilor

Această euristică tine cont de faptul că nu toate valorile din domeniul variabilelor apar în toate restrictiile. Dacă se cer toate solutiile, pentru o variabilă fixată se alege ca primă valoare de atribuit variabilei cea mai restrictionată valoare, i.e. cea care permite cele mai putine atribuiri. Dacă se cere găsirea unei singure solutii, se utilizează criteriul contrar.

(3) Ordonarea testelor

În tehnicile retrospective, după atribuirea unei valori unei variabile, se testează valoarea variabilei curente cu toate valorile atribuite variabilelor deja considerate. O euristică utilă este aceea de a începe cu variabila precedentă cea mai restrictionată. În tehnicile prospective, se va începe testarea cu variabilele care au domeniile de valori cele mai restrînse (cu cardinalitate mică).

(4) Ordonarea procesului de backtracking

Aceasta este euristica utilizată de algoritmul de backtracking cu salt si de algoritmul de backtracking condus de dependente ce va fi prezentat în Capitolul 5. În acesti algoritmi, euristica generală utilizată impune ca revenirea să se facă la variabila care a generat inconsistente pe un anumit nivel si nu la variabila imediat anterioară. O altă euristică posibilă este executarea revenirii la variabilele legate prin restrictii explicite de variabila curentă care a produs blocarea. Se presupune că dacă se face întoarcerea în căutare la o variabilă legată prin restrictii explicite, se va găsi mai repede o instantiere compatibilă pentru această variabilă. Deci revenirea se face la variabile anterioare care au restrictii nesatisfăcute cu variabila curentă.

4.5 Tehnici de modificare a spatiului de căutare

Una din metodele de îmbunătătire a performantelor algoritmului de backtracking pentru satisfacerea restrictiilor este eliminarea valorilor inconsistente din domeniile de valori ale variabilelor, înaintea începerii procesului de căutare. Eliminarea partială sau totală a valorilor inconsistente modifică reprezentarea, deci domeniile de valori, si are drept consecintă importantă reducerea spatiului de căutare. Procesul de eliminare a valorilor inconsistente ale variabilelor se poate realiza prin diverse forme de propagare a restrictiilor care vor fi discutate în continuare. În plus, prin recunoasterea anumitor proprietăti ale grafului de restrictii asociat problemei se pot identifica anumite subclase de probleme pentru care, după eliminarea valorilor inconsistente si fixarea unei ordonări a variabilelor, procesul de căutare nu mai este necesar. Aceste subclase de probleme vor fi prezentate în Sectiunea 4.5.3. Propagarea restrictiilor într-o formă sau alta este, evident, utilă atît timp cît complexitatea algoritmului de propagare rămîne polinomială, deci net eficientă fată de cea a algoritmului de căutare.

4.5.1 Propagarea restrictiilor

Restrictiile între două variabile pot fi explicite si implicite. Restrictiile explicite sînt date de multimea de restrictii dar cele implicite nu apar nicăieri, ele fiind efecte laterale ale restrictiilor explicite. Dacă o valoare asociată unei variabile violează o restrictie implicită, această incompatibilitate va fi detectată mult mai tîrziu, după intrarea în actiune a multimii de restrictii explicite ce determină această restrictie implicită.

Exemplu. Fie graful de restrictii prezentat în Figura 4.13 (a) si domeniile de valori ale variabilelor .

Figura 4.13 Transformarea restrictiilor implicite în restrictii explicite

Restrictiile R si R interactionează si, ca rezultat al acestei interactiuni, domeniul variabilei X se restrînge la . Acest rezultat este propagat de restrictiile R si R si domeniul variabilei X se restrînge la , iar domeniul variabilei X la . Fată de formularea initială a problemei, restrictiile R si R s-au schimbat si, în plus, a apărut o nouă restrictie R , deci o nouă legătură în graf între nodurile corespunzătoare variabilelor X si X , ce erau initial legate prin restrictia universală. Noul graf de restrictii obtinut prin modificarea reprezentării este prezentat în Figura 4.13(b). Domeniile de valori ale variabilelor, după explicitarea restrictiilor implicite, sînt , si .

Pentru a face explicite restrictiile implicite este nevoie de un astfel de proces de propagare a restrictiilor. Un graf în care toate restrictiile au fost propagate, deci făcute explicite, se numeste graf minim de restrictii si este echivalent cu graful original, în sensul că orice solutie a grafului initial de restrictii este solutie si pentru graful minim de restrictii.

Determinarea grafului minim de restrictii se numeste problema centrală. Această problemă este la rîndul ei NP-completă, iar algoritmii de rezolvare a ei sînt de complexitate exponentială. Ca atare, problema centrală nu prezintă un interes deosebit. Totusi, o versiune mai slabă a problemei, propagarea locală a restrictiilor, poate fi de mare interes.

4.5.2 Propagarea locală a restrictiilor

Se consideră un graf de restrictii orientat în care restrictiile între perechi de variabile sînt reprezentate prin două arce orientate între nodurile corespunzătoare celor două variabile, fiecare arc fiind etichetat cu valorile ordonate acceptate de restrictie. În Figura 4.14 se prezintă exemplul unui graf de restrictii orientat, cu două noduri si o restrictie. Evident, orice graf de restrictii poate fi reformulat ca un graf de restrictii ordonat prin transformarea legăturilor între noduri în arce (orientate) simetrice.

Figura 4.14 Graf orientat pentru reprezentarea unei restrictii

Într-un graf de restrictii orientat se definesc notiunile de arc-consistentă si cale-consistentă [Montanari,1974;Mackworth,1977]. Se notează cu asertiunea "Combinatia de valori x si y pentru variabilele Xi si Xj este permisă de restrictia explicită Rij".

Definitie. Un arc într-un graf de restrictii orientat se numeste arc-consistent dacă si numai dacă pentru orice valoare , domeniul variabilei Xi, există o valoare , domeniul variabilei Xj, astfel încît .

Altfel spus, fiind dată perechea de variabile Xi, Xj, pentru fiecare valoare a variabilei Xi există o valoare a variabilei Xj astfel încît restrictia Rij este satisfăcută. Arc-consistenta se poate realiza prin testarea valorilor perechilor de variabile legate prin restrictii explicite. Realizarea arc-consistentei poate implica eliminarea anumitor valori din anumite domenii ale variabilelor, astfel încît graful rezultat să fie arc-consistent; acest graf rezultat reprezintă aceeasi multime de solutii a problemei.

Definitie. Un graf de restrictii orientat este arc-consistent dacă toate arcele lui sînt arc-consistente.

Considerînd din nou exemplul robotului constient de restrictiile modei, din Sectiunea 4.1.2, dacă se aplică un algoritm de arc-consistentă, se obtin următoarele rezultate. Pantofii de tenis pot fi eliminati din DPf, domeniul de valori al variabilei Pantofi, deoarece nu sînt consistenti cu nici o valoare din domeniul variabilei Cămăsi. Cămasa verde poate fi eliminată din DC, domeniul de valori al variabilei Cămăsi, deoarece nu este consistentă cu nici o valoare din domeniul variabilei Pantofi, iar pantalonii bleu pot fi eliminati din DPt, domeniul de valori al variabilei Pantaloni, din acelasi motiv. Deoarece pantalonii de jeans pot fi purtati cu pantofii de tenis, dar acestia au fost eliminati, atunci pot fi eliminati si pantalonii de jeans din DPt. Deci în acest moment , si . Dar pentru cămasa albă nu există nici o restrictie care să permită pantalonii gri, deci cămasa albă se elimină din DC. Rezultă , deci problema nu are solutie. Prin realizarea arc-consistentei în acest caz a dispărut necesitatea unui proces ulterior de căutare.

Acest lucru nu se întîmplă pentru orice problemă, dar, de cele mai multe ori, realizarea arc-consistentei reduce domeniile de valori ale variabilelor, deci reduce spatiul de căutare.

Definitie. O cale de lungime m prin nodurile ale unui graf de restrictii orientat se numeste cale-consistentă dacă pentru orice valoare , domeniul de valori al variabilei i , si astfel încît , există o secventă de valori astfel încît si si ... .

Observatie. poate fi si restrictia universală, deci cea care permite toate multimile de valori posibile.

Definitie. Un graf de restrictii orientat este cale-consistent dacă orice cale din graf este cale-consistentă.

Cu alte cuvinte, valorile permise de un arc între nodul Xi si nodul Xj trebuie să fie permise si de o cale, diferită de arcul XiXj, între nodul Xi si nodul Xj, ce poate include si restrictia universală. Pentru realizarea cale-consistentei anumite perechi de valori care erau initial permise sînt eliminate, deci se adaugă restrictii suplimentare. În particular, dacă restrictia universală era permisă între două variabile si este restrictionată de realizarea cale-consistentei, noi restrictii explicite vor fi generate, vor apare noi legături în graf si graful se va modifica.

Montanari [1974] si Mackworth [1977] au propus algoritmi polinomiali pentru a realiza arc-consistenta si cale-consistenta unui graf de restrictii. Complexitatea timp a algoritmului de realizare a arc-consistentei, numit AC-3, este iar cea spatială este , unde N este numărul de variabile, a este cardinalitatea maximă a domeniilor de valori ale variabilelor, iar e este numărul de restrictii. S-a găsit chiar si un algoritm de complexitate temporală numit AC-4 [Mohr,Henderson,1986]. Pentru algoritmul de realizare a cale-consistentei, numit PC-4, complexitatea timp este [Mohr,Henderson,1986;Han,Lee,1988].

Algoritm: AC-3: Realizarea arc-consistentei pentru un graf de restrictii.

1. Creează o coadă

2. cît timp Q nu este vidă execută

2.1. Elimină din Q un arc

2.2. Verifică

2.3. dacă subprogramul Verifică a făcut schimbări în domeniile variabilelor

atunci

sfîrsit.

Verifică

pentru fiecare execută

1. dacă nu există nici o valoare astfel încît

atunci elimină x din Dj

sfîrsit.

Arc-consistenta si cale-consistenta efectuează propagarea locală a restrictiilor. Acesti algoritmi elimină anumite valori din domeniul de definitie al variabilelor, valori care nu vor apare niciodată în solutie. Pentru a rezolva o problemă, chiar dacă graful ei de restrictii este arc-consistent sau cale-consistent, tot avem nevoie, în cazul general, de un algoritm de căutare, deoarece restrictiile nu s-au propagat global si tot pot apare situatii de insucces.

Generalizînd, o multime de k variabile este k-consistentă dacă pentru orice submultime de variabile, cu valori ce satisfac toate restrictiile pentru cele variabile, este posibil să se găsească o valoare pentru variabila de ordin k, astfel încît restrictiile între cele k variabile să fie satisfăcute. Pentru valorile si se obtin cazurile particulare de arc-consistentă si cale-consistentă.

4.5.3 Satisfacerea restrictiilor fără backtracking

Există probleme de satisfacere a restrictiilor care pot fi rezolvate fără căutare cu reveniri. Fiecare pas făcut de algoritmul de căutare reprezintă un pas corect spre solutie. De fapt, procesul de căutare nu este un proces neinformat si deci nu este nevoie de backtracking. Pentru această categorie de probleme complexitatea timp a algoritmului de rezolvare este polinomială.

În continuare se prezintă o caracterizare a acestor tipuri de probleme, prin corelarea conectivitătii grafului de restrictii cu nivelul de consistentă locală.

Definitie. Un graf de restrictii ordonat este un graf de restrictii împreună cu o ordonare a nodurilor asociate variabilelor problemei, ordonare ce reprezintă ordinea de selectare a variabilelor în algoritmul de backtracking.

Definitie. Intr-un graf de restrictii ordonat, lătimea unui nod este egală cu numărul de arce care leagă acel nod de nodurile anterioare lui în ordonare.

Definitie. Intr-un graf de restrictii ordonat, lătimea unei ordonări a nodurilor este lătimea maximă a nodurilor.

Definitie. Lătimea unui graf de restrictii este valoarea minimă a lătimilor de ordonare a nodurilor, pentru toate posibilitătile de ordonare a nodurilor. Altfel spus,

Exemplu. Fie graful de restrictii din Figura 4.15 (a) si cele 6 ordonări posibile ale variabilelor (Figura 4.15 (b)) într-un proces de căutare a solutiei, ordonări determinate de secventa de variabile considerate în căutare. De pildă, pentru primul caz din Figura 4.15 (b) procesul de backtracking consideră variabilele în ordinea B, A, C. În această primă ordonare, lătimea nodului C este egală cu doi, iar în cea de a doua ordonare lătimea aceluiasi nod este este egală cu unu. Considerînd toate cele sase ordonări posibile se deduce lătimea grafului de restrictii egală cu unu.

Figura 4.15 Posibile ordonări ale variabilelor într-un graf de restrictii

Freuder [1982] a găsit un algoritm eficient, de complexitate polinomială , pentru a determina atît lătimea grafului de restrictii cît si o ordonare corespunzătoare acestei lătimi. Tot el a enuntat si demonstrat următoarele teoreme.

Teoremă. Dacă un graf de restrictii arc-consistent are lătimea egală cu unu (i.e. este un arbore), atunci problema asociată grafului admite o solutie fără backtracking.

Teoremă. Dacă un graf de restrictii cale-consistent are lătimea egală cu doi, atunci problema asociată grafului admite o solutie fără backtracking.

Din prima teoremă rezultă că problemele de satisfacere a restrictiilor al căror graf de restrictii este arbore pot fi rezolvate întîi prin realizarea arc-consistentei si apoi prin instantierea variabilelor în orice ordine de lătime egală cu unu. Testarea grafului de restrictii pentru a vedea dacă este un arbore se realizează în următorul mod. Se construieste arborele de acoperire al grafului [Sedgewick,1990] si se determină dacă arborele de acoperire a inclus toate arcele grafului de restrictii. Constructia arborelui de acoperire al grafului de restrictii se poate face pe baza unui algoritm de complexitate polinomială . Pentru un arbore, găsirea unei ordonări de lătime egală cu unu se face prin enumerarea în preordine, i.e. rădăcină-stînga-dreapta, a nodurilor. Enumerarea în inordine, i.e. stînga-rădăcină-dreapta, si postordine, i.e. stînga-dreapta-rădăcină, produc ordonări de lătime mai mare decît doi.

Deoarece instantierea variabilelor fără backtracking necesită pasi, si pentru arbori , întreaga problemă poate fi rezolvată într-un timp , deoarece instantierea variabilelor necesită , realizarea arc-consistentei necesită , iar verificarea faptului că graful de restrictii este arbore necesită pasi. Se reaminteste că N este numărul de variabile, a este cardinalitatea maximă a domeniilor de valori ale variabilelor si e este numărul de restrictii.

Pentru un graf de lătime egală cu doi, algoritmul de cale-consistentă poate adăuga arce în graf, deci lătimea grafului poate creste, devenind mai mare ca doi. Aceasta se întîmplă în cazul în care algoritmul elimină perechi de valori posibile pentru variabile care nu sînt legate în mod direct în graf, i.e. variabile legate initial prin restrictia universală. Dacă graful de restrictii îndeplineste de la început premisele celei de-a doua teoreme a lui Freuder, atunci concluzia acesteia este adevărată.

Dechter si Pearl [1987] au propus două definitii mai slabe ale notiunilor de arc-consistentă si cale-consistentă, definitii care sînt, de asemenea, suficiente pentru a garanta găsirea solutiei fără backtracking, dar au următoarele avantaje fată de cele ale lui Montanari si Mackworth:

pot fi realizate mai eficient

adaugă mult mai putine arce suplimentare la realizarea cale-consistentei, crescînd astfel sansele ca lătimea grafului să rămînă egală cu doi.

Realizarea arc-consistentei complete este mai mult decît este nevoie pentru a obtine solutii fără backtracking. De exemplu, dacă în graful de restrictii din Figura 4.16 ordonarea variabilelor este , nu se cîstigă nimic dacă se face arcul consistent. Pentru a asigura o atribuire de valori variabilelor fără backtracking, trebuie numai să se asigure faptul că pentru orice valoare atribuită variabilei X , există cel putin o valoare consistentă în domeniul D al variabilei X . Acest lucru poate fi realizat făcînd numai arcul consistent, fără să mai intereseze dacă arcul este sau nu consistent.

Figura 4.16 Graf de restrictii ordonat ce demonstrează suficienta conditiei de

Se observă deci că arc-consistenta este necesară numai într-o singură directie, în directia în care algoritmul de backtracking selectează variabilele pentru instantiere.

Definitie. Fiind dată o ordonare d a variabilelor unui graf de restrictii R, graful R este d-arc-consistent dacă toate arcele avînd directia d sînt arc-consistente.

Teoremă. Fie un graf de restrictii R, avînd ordonarea variabilelor d cu lătimea egală cu unu. Dacă R este d-arc-consistent atunci căutarea după directia d este fără backtracking.

Algoritmul următor realizează d-arc-consistenta unui graf de restrictii. El este o adaptare a algoritmului AC-3 pentru cazul unui graf de restrictii cu ordonarea variabilelor.

Algoritm: Realizarea d-arc-consistentei unui graf de restrictii cu ordonarea variabilelor

pentru pînă la 1 execută

1. pentru fiecare arc cu execută

1.1. Verifică

sfîrsit.

Acest algoritm are complexitatea timp . În algoritm, subprogramul Verifică este cel prezentat în sectiunea anterioară. Algoritmul realizează într-adevăr d-arc-consistenta unui graf de restrictii. După executia lui, orice arc cu , în ordonarea variabilelor d, este arc-consistent. Algoritmul verifică fiecare arc d-orientat o singură dată. Rămîne să se demonstreze că prin prelucrarea arcelor următoare nu se violează consistenta unui arc deja vizitat. Fie cu arcul prelucrat de Verifică . Pentru a distruge consistenta arcului , anumite valori din domeniul variabilei Xi ar trebui eliminate la continuarea procesului. Dar, în functie de ordinea de apel al subprogramului Verifică, numai variabile cu indici mai mici vor avea domeniile actualizate. Deci, odată ce un arc orientat este făcut arc-consistent, consistenta lui nu va fi violată.

O problemă de satisfacere a restrictiilor avînd graful de restrictii de tip arbore poate fi rezolvată în pasi si acest rezultat este optimal. Justificarea acestei afirmatii este următoarea: odată ce se cunoaste faptul că graful de restrictii este arbore (), găsirea unei ordonări de lătime egală cu unu necesită O(N) pasi. Realizarea d-arc-consistentei, cu algoritmul de mai sus, necesită pasi. Solutia fără backtracking a arborelui rezultat este găsită în pasi. Deci, .

Observatie. Dacă se aplică algoritmul pe ordonarea d, apoi pe ordonarea inversă, pentru arbori, se obtine arc-consistenta. Deci, pentru arbori, se poate obtine arc-consistenta într-un timp .

Definitie. Intr-un graf de restrictii R, fiind dată o ordonare a grafului , graful R este d-cale-consistent dacă pentru orice pereche de valori astfel încît , atunci pentru orice există astfel încît si .

Teoremă. Fie un graf de restrictii R cu ordonarea d si lătimea acestei ordonări egală cu doi. Dacă R este d-arc-consistent si d-cale-consistent, atunci căutarea după directia d este fără backtracking.

Algoritmul de realizare a d-cale-consistentei este prezentat în continuare. Pentru ca un algoritm să realizeze d-cale-consistenta, trebuie să facă atît schimbări în multimea de restrictii, cît si schimbări în graf, i.e. adăugare de noi arce. Pentru descrierea algoritmului se foloseste o matrice de reprezentare a restrictiilor. Fiecare restrictie între două variabile Xi si Xj este reprezentată printr-o matrice binară de dimensiune cu valori 1 pentru combinatii de valori permise si valori 0 pentru combinatii interzise. De exemplu, pentru graful de restrictii din Figura 4.17, restrictia are forma matricială indicată în figură. Pentru fiecare variabilă Xi se consideră si matricea unitară Rii, asa cum se vede tot în Figura 4.17. Elementele matricii Rii definesc multimea de valori permise ale variabilei Xi, fiind 1 pe diagonala principală si 0 în rest.

Se defineste intersectia a două restrictii ca o restrictie care permite numai perechile de valori ce apar în ambele restrictii. Intersectia a două restrictii se notează cu &. Compunerea a două restrictii, R si R , între variabilele X si X si respectiv X si X , determină o nouă restrictie R definită astfel: dacă există astfel încît si . În notatia cu matrice, compunerea a două restrictii se poate obtine făcînd produsul de matrice si înlocuind în matricea rezultat valorile pozitive cu 1.

Figura 4.17 Reprezentarea matricială a restrictiilor

În algoritmul următor se consideră graful de restrictii , se utilizează reprezentarea cu matrice a restrictiilor si ordonarea . V este multimea nodurilor din graf , iar E este multimea arcelor etichetate cu matricele de restrictii Rij.

Algoritm: Realizarea d-cale-consistentei unui graf de restrictii cu variabile ordonate

1.

2. pentru pînă la 1 execută

2.1. pentru fiecare pereche cu si execută

/*Xi legat la Xk */

2.1.1.

2.2. pentru fiecare triplet cu si si execută

2.2.1.

2.2.2.

sfîrsit.

În algoritmul de mai sus, pasul 2.1 realizează d-arc-consistenta si este echivalent cu subprogramul Verifică prezentat în Sectiunea 4.5.2. Pasul 2.2 actualizează restrictiile între perechi de variabile prin intermediul unei a treia variabile ce se află mai sus în ordonarea d. Dacă Xi si Xj, cu , nu sînt legate de Xk, atunci relatia între Xi si Xj nu este afectată de Xk. Dacă o variabilă Xi, cu , este legată cu variabila Xk, efectul variabilei Xk asupra restrictiei va fi calculat în pasul 2.1 al algoritmului. Singura dată cînd o variabilă Xk afectează restrictiile între perechi de variabile anterioare, este în situatia în care Xk este legată cu amîndouă variabilele din pereche. Numai în acest caz se poate adăuga un nou arc în graf. Complexitatea algoritmului este [Dechter,Pearl,1987].

4.6 Tehnici prospective de îmbunătătire a performantelor căutării

Tehnicile prospective se bazează pe ideea conform căreia fiecare pas spre solutie trebuie ales astfel încît să nu ducă la blocare. De fiecare dată cînd se atribuie o valoare variabilei curente, toate variabilele sînt verificate pentru a depista eventuale conditii de blocare. Anumite valori ale variabilelor neinstantiate încă pot fi eliminate deoarece nu vor putea să facă parte din solutie niciodată.

În continuare se vor prezenta trei algoritmi predictivi de rezolvare a problemei satisfacerii restrictiilor: algoritmul de predictie completă, de predictie partială si de verificare predictivă. Cei trei algoritmi sînt o combinatie de căutare neinformată cu realizarea unor grade diferite de k-consistentă.

În prezentarea algoritmilor se fac următoarele conventii:

(1) variabilele vor fi numerotate si numerotarea lor va reprezenta ordinea de instantiere

(2) la un anumit moment dat în procesul de căutare cu backtracking, variabilele deja instantiate se numesc variabile anterioare, variabila ce se instantiază pe nivelul curent se numeste variabilă curentă, iar variabilele neinstantiate încă se numesc variabile viitoare.

4.6.1 Algoritmul de backtracking cu predictie completă

Acest algoritm garantează, la orice nivel în arborele de căutare, îndeplinirea următoarelor conditii:

fiecare variabilă viitoare are cel putin o valoare compatibilă cu valorile variabilelor anterioare si cu a celei curente, si

fiecare variabilă viitoare are cel putin o valoare compatibilă cu orice altă variabilă viitoare.

Pentru realizarea acestor conditii se execută următoarele operatii:

(a) Pentru fiecare variabilă viitoare se verifică dacă valoarea variabilei curente este compatibilă cu cel putin o valoare din domeniul variabilei viitoare. Valorile variabilelor viitoare incompatibile cu valoarea atribuită variabilei curente sînt eliminate din domeniile variabilelor viitoare. În acest fel, domeniile variabilelor viitoare contin numai valori compatibile cu valorile variabilelor anterioare si la atribuirea unei valori variabilei curente este necesar să se testeze numai consistenta acestei valori cu domeniile variabilelor viitoare.

(b) Pentru fiecare variabilă viitoare se verifică dacă există cel putin o valoare compatibilă cu orice altă variabilă viitoare si valorile incompatibile sînt eliminate.

Algoritmul de backtracking cu predictie completă împiedică procesul de căutare în spatiul stărilor să execute repetat avans si revenire între variabilele Xv si Xu, cu , numai pentru a descoperi ulterior că valorile variabilelor au determinat incompatibilitatea între toate valorile unei variabile Xw, cu , si anumite variabile anterioare, curente sau viitoare.

Observatie. Algoritmul construieste solutia mentinînd un nivel de k-consistentă între cele variabile anterioare si variabila curentă si un nivel de 2-consistentă între variabilele viitoare.

În descrierea algoritmului se folosesc următoarele notatii:

U este o valoare întreagă ce reprezintă indicele variabilei curente; initial .

N este numărul de variabile din problemă.

F este un vector indexat după variabile, F[U] fiind valoarea atribuită variabilei XU.

T este o matrice în care fiecare linie T[U] reprezintă lista valorilor posibile pentru variabila XU. Initial matricea contine toate valorile din domeniile variabilelor problemei; această tabelă, indexată după variabile, indică, pentru fiecare nivel al arborelui de căutare, ce valori mai sînt încă posibil de atribuit variabilei curente si variabilelor viitoare. Pentru variabilele anterioare informatia din tabelă este neinteresantă.

TNOU este o matrice similară cu T, dar care memorează noile valori posibile pentru variabila curentă si variabilele viitoare la fiecare apel recursiv.

, unde L si L sînt valorile atribuite variabilelor cu indici U si U .

Acest algoritm utilizează un număr de locatii de memorie egal cu pătratul numărului variabilelor înmultit cu numărul maxim de valori din domeniile de valori ale variabilelor, pentru a memora matricile T si TNOU, deoarece pot numărul de nivele de recursivitate este cel mult egal cu numărul variabilelor.

Subprogramul Verifică_Înainte verifică pentru fiecare pereche viitoare variabilă-valoare dacă este consistentă cu valoarea prezentă F[U] pentru variabila curentă XU si copiază tabela T în tabela TNOU de pe nivelul următor, eliminînd din T valorile variabilelor viitoare incompatibile cu valoarea F[U] atribuită variabilei XU. Subprogramul întoarce ca valoare tabela TNOU sau o valoare specială LINIE_VIDĂ, dacă o variabila viitoare nu are nici o valoare compatibilă cu F[U]. Subprogramul Verifică_Viitoare verifică pentru fiecare pereche variabilă-valoare din tabela TNOU dacă este consistentă cu cel putin o valoare a fiecărei variabile viitoare si elimină valorile ce nu sînt consistente. Subprogramul actualizează de asemenea indicatorul LINIE_VIDĂ, în aceleasi conditii ca si subprogramul Verifică_Înainte. Dacă indicatorul LINIE_VIDĂ este activ, următorul nivel în căutare este ignorat si se încearcă o nouă selectie.

Algoritm: Backtracking cu predictie completă

Predictie

pentru fiecare element L din T[U] execută

1.

2. dacă

atunci /* verifică consistenta atribuirii */

2.1.

2.2. dacă

atunci

2.3. dacă

atunci Predictie

3. altfel afisează atribuirile din F

sfîrsit.

Verifică_Înainte

1.

2. pentru pînă la N execută

2.1. pentru fiecare element L2 din T[U2] execută

2.1.1. dacă

atunci introduce L2 în TNOU[U2]

2.2. dacă TNOU[U2] este vidă

atunci întoarce LINIE_VIDĂ /* la găsirea unei incompatibilităti între valoarea F[U] atribuită variabilei curente XU, si o variabilă viitoare, se va încerca o altă atribuire pentru XU, în Predictie */

3. întoarce TNOU

sfîrsit.

Verifică_Viitoare

dacă /* mai sînt variabile viitoare*/

atunci

1. pentru pînă la N execută

1.1. pentru fiecare element L1 din TNOU[U1] execută

1.1.1. pentru pînă la N, execută

i. pentru fiecare element L2 din TNOU[U2] execută

- dacă

atunci întrerupe ciclul /* după variabila L2 */

/* s-a găsit o valoare a variabilei U2 consistentă cu valoarea L1 a variabilei U1 */

ii. dacă nu s-a găsit o valoare consistentă pentru U2

atunci

Elimină L1 din TNOU[U1]

întrerupe ciclul /* după variabila U2 */

/* variabila U2 nu are nici o valoare consistentă cu valoarea L1 a variabilei U1 */

1.2. dacă TNOU[U1] este vidă

atunci întoarce LINIE_VIDĂ

2. întoarce TNOU

întoarce TNOU /* în acest caz TNOU este nemodificat */

sfîrsit.

Acest algoritm, desi face toate testele între valorile variabilelor viitoare, nu memorează aceste teste. Din această cauză, algoritmul nu este suficient de performant. Următorul algoritm, cu predictie partială, care face mai putine teste, se comportă mai bine din punct de vedere al performantelor.

4.6.2 Algoritmul de backtracking cu predictie partială

Algoritmul de backtracking cu predictie partială face aproximativ jumătate din testele de consistentă ale algoritmului de predictie completă în timp ce verifică valorile variabilelor viitoare cu valorile altor variabile viitoare. Fiecare pereche variabilă-valoare este verificată numai cu variabilele din propriul ei viitor, în loc să fie testată fată de toate variabilele viitoare. Această metodă va elimina din domeniul de valori al variabilelor mai putine valori decît algoritmul de predictie totală, dar va face mai putine teste de consistentă în toate cazurile.

Observatie. Algoritmul de predictie partială este echivalent cu algoritmul de predictie completă în care nivelul de 2-consistentă între valorile variabilelor viitoare este înlocuit cu d-arc-consistenta.

Algoritmul de backtracking cu predictie partială se obtine din algoritmul de backtracking cu predictie completă dacă în subprogramul Verifică_Viitoare se fac următoarele modificări: se înlocuieste pasul 1 cu

1'. pentru pînă la execută

si pasul 1.1.1 cu

1.1.1'. pentru pînă la N execută

Verificarea valorilor perechilor de variabile viitoare nu descoperă inconsistente suficient de des pentru a justifica numărul mare de teste necesare. În plus, rezultatele acestor teste nu pot fi memorate eficient. Un algoritm de predictie care verifică valorile variabilelor viitoare numai cu variabila prezentă si cu variabilele anterioare poate avea performante mai bune, deoarece testele efectuate pot fi memorate.

4.6.3 Algoritmul de backtracking cu verificare predictivă

Acest algoritm este similar cu cel de predictie, cu exceptia faptului că valorile variabilelor viitoare nu mai sînt verificate cu variabilele viitoare, iar verificările valorilor variabilelor viitoare cu variabilele anterioare sînt tinute minte în verificările făcute la nivele anterioare ale arborelui de căutare.

Verificarea predictivă începe dintr-o stare în care nici o variabilă viitoare nu are vreo valoare inconsistentă cu o pereche anterioară variabilă-valoare. Această premisă este sigur adevărată la rădăcina arborelui de căutare, cînd nu există variabile anterioare. Se selectează o valoare pentru prima variabilă. Această valoare este consistentă cu variabilele anterioare deoarece acestea nu există încă. Verificarea predictivă încearcă să provoace o blocare cît mai repede posibil, căutînd dacă există o variabilă viitoare ce nu are nici o valoare consistentă cu perechea curentă variabilă-valoare.

Dacă orice variabilă viitoare are o valoare consistentă cu perechea curentă variabilă-valoare, atunci se poate trece la următorul nivel în arborele de căutare, într-o stare avînd aceleasi proprietăti cu starea initială. Dacă există o variabilă viitoare ce nu are nici o valoare consistentă cu perechea curentă variabilă-valoare, atunci căutarea rămîne la acelasi nivel în arbore si continuă selectînd următoarea valoare din domeniul variabilei curente. Dacă nu mai există astfel de valori, atunci se execută revenirea la variabila anterioară.

Algoritmul de verificiare predictivă se obtine din algoritmul de backtracking cu predictie completă, prin eliminarea apelului Verifică_Viitoare (U, TNOU) în subprogramul Predictie.

Observatie. Toate cele trei variante de tehnici predictive pot fi îmbunătătite prin introducerea euristicii prin care se alege ca variabilă următoare variabila cu cele mai putine valori rămase în domeniul de valori. Acest lucru este echivalent cu o reordonare dinamică a variabilelor la fiecare avans în căutare. Experimental, s-a dovedit că introducerea acestei euristici furnizează rezultate foarte bune.

4.6.4 Solutii de implementare

În cele ce urmează va fi prezentată o solutie de implementare a algoritmului de backtracking cu predictie completă. Spre deosebire de algoritmul prezentat în Sectiunea 4.6.1, programul foloseste structuri de date de tip listă care facilitează implementarea în Lisp. Structurile utilizate sînt asemănătoare cu cele prezentate în Sectiunea 4.4.1. Astfel, vectorul de variabile F este reprezentat prin lista *VARIABILE*, iar solutia este construită în variabila *SOLUTII*. Matricea de valori ale domeniilor variabilelor, T, este reprezentată prin lista de liste *VALORI*, iar valorile compatibile rezultate în urma verificărilor, deci TNOU, sînt calculate în variabila ValoriNoi. Valoarea de incompatibilitate LINIE_VIDĂ este înlocuită cu rezultatul nil întors de functiile Verifica-Inainte si Verifica-Viitoare, în caz de blocare.

(defparameter *EXPANDARI* 0)

(defparameter *VERIFICARI* 0)

(defparameter *SOLUTII* nil)

(defun Predictie (Cale Variabile Valori)

(dolist (Val (car Valori))

(if (cdr Variabile)

(let ((ValoriNoi (Verifica-Inainte Variabile Val Valori)))

(when ValoriNoi

(when (cddr Variabile)

(setf ValoriNoi (catch 'break (Verifica-Viitoare Variabile ValoriNoi))))

(when ValoriNoi

(incf *EXPANDARI*)

(Predictie (cons (cons (first Variabile) Val) Cale) (rest Variabile) ValoriNoi))))

(push (cons (cons *EXPANDARI* *VERIFICARI*)

(cons (cons (first Variabile) Val) Cale))

*SOLUTII*))))

(defun Verifica-Inainte (Variabile Val Valori)

(do ((Variabile2 (rest Variabile) (rest Variabile2))

(Domenii2 (rest Valori) (rest Domenii2))

(DomeniuNou nil nil)

ValoriNoi)

((null Variabile2) (reverse ValoriNoi))

(dolist (Val2 (first Domenii2))

(incf *VERIFICARI*)

(when (exista-relatie-p (first Variabile) Val (first Variabile2) Val2)

(push Val2 DomeniuNou)))

(unless DomeniuNou (return))

(push DomeniuNou ValoriNoi)))

(defun Verifica-Viitoare (Variabile Valori)

(do* ((Variabile1 (rest Variabile) (rest Variabile1))

(Domenii1 Valori (rest Domenii1))

(Domeniu1 (first Domenii1) (first Domenii1))

ValoriNoi)

((null Variabile1) (reverse ValoriNoi))

(dolist (Val1 Domeniu1 (when (null Domeniu1) (throw 'break nil)))

(do* ((Variabile2 (rest Variabile) (rest Variabile2))

(Domenii2 Valori (rest Domenii2))

(Domeniu2 (first Domenii2) (first Domenii2)))

((or (null Variabile2) (unless (equal (first Variabile2) (first Variabile1))

(dolist (Val2 Domeniu2 (pop Domeniu1))

(incf *VERIFICARI*)

(when (exista-relatie-p (first Variabile1) Val1

(first Variabile2) Val2)

(return))))))))

(push Domeniu1 ValoriNoi)))

În continuare se prezintă modul în care se poate rezolva problema îmbrăcării robotului, prezentată în Sectiunea 4.1.2, utilizînd functiile definite. Se defineste predicatul exista-relatie-p care verifică compatibilitatea atribuirilor de valori pentru două variabile. Pentru aceasta se utilizează variabila specială *RESTRICTII*, care memorează restrictiile problemei sub forma unei liste de perechi cu punct între perechi variabilă-valoare. Functia tipareste-solutie tipăreste lista de asociatii variabilă-valoare primită ca parametru.

(defun exista-relatie-p (var1 val1 var2 val2)

"Verifica existenta unei relatii ((var1.val1).(var2.val2)) sau ((var2.val2).(var1.val1))

in lista *RELATII*. Intoarce t in caz afirmativ, nil in caz contrar."

(let ((aux1 (cons var1 val1))

(aux2 (cons var2 val2)))

(some #'(lambda (pereche)

(or (and (equal (first pereche) aux1)

(equal (rest pereche) aux2))

(and (equal (first pereche) aux2)

(equal (rest pereche) aux1))))

*RESTRICTII*)))

(defun tipareste-solutie (solutie)

(dolist (pereche solutie)

(format t "~&variabila: ~A valoare: ~A" (first pereche) (rest pereche))))

Variabilele speciale *VARIABILE*,*VALORI* si *RESTRICTII* se definesc astfel:

(defparameter *VARIABILE* '(Pantofi Pantaloni Camasi))

(defparameter *VALORI* '((Escarpeni Tenisi) (Jeans Bleu Gris) (Verde Alba)))

(defparameter *RESTRICTII*

`(,(cons '(Pantofi . Escarpeni) '(Pantaloni . Gris))

,(cons '(Pantofi . Tenisi) '(Pantaloni . Jeans))

,(cons '(Pantofi . Escarpeni) '(Camasi . Verde))

,(cons '(Pantofi . Tenisi) '(Camasi . Alba))

,(cons '(Pantaloni . Gris) '(Camasi . Verde))

,(cons '(Pantaloni . Jeans) '(Camasi . Alba))

,(cons '(Pantaloni . Bleu) '(Camasi . Alba))))

După cum se observă, în implementare apare o restrictie suplimentară, între Pantofii de tenis si Cămasa albă, restrictie care nu se regăseste în descrierea initială problemei. Această pereche suplimentară a fost introdusă pentru ca problema să admită solutie. Solutiile problemei pot fi obtinute utilizînd secventa de apeluri:

(Predictie nil *VARIABILE* *VALORI*)

(dolist (solutie (reverse *SOLUTII*))

(tipareste-solutie solutie)

(format t "~&Expandari: ~A Verificari: ~A" (caar solutie) (cdar solutie)))

4.7 Tehnici retrospective de îmbunătătire a performantelor căutării

Tehnicile retrospective memorează perechi variabilă-valoare care s-au detectat a fi inconsistente cu perechi variabilă-valoare prezente sau anterioare. Perechile memorate sînt obtinute numai pe baza testării perechii curente variabilă-valoare cu perechi variabilă-valoare anterioare si nu cu cele viitoare, cum se întîmplă în cazul tehnicilor prospective.

Fiecare test executat de o tehnică retrospectivă în timp ce inspectează calea de la Xi la , va fi deja executat de un algoritm prospectiv în momentul în care Xj era variabilă curentă; bineînteles, în acest moment, algoritmul prospectiv ar fi testat si toate variabilele de după Xi. Tehnicile retrospective prezentate în următoarele sectiuni fac mai putine teste de consistentă, dar plătesc pretul parcurgerii unui arbore de căutare mai mare.

4.7.1 Algoritmul de backtracking cu salt

Ideea care stă la baza acestui algoritm este următoarea: la întîlnirea unei blocări, se identifică atribuirea de valori care a generat blocarea si revenirea în căutre se face la nivelul de blocare si nu la nivelul imediat anterior. Algoritmul detectează nivelul cel mai adînc din arborele de căutare care a generat blocarea, adică acel nivel pentru care toate valorile variabilei curente sînt incompatibile, iar revenirea se face pînă la acel nivel.

Pentru a ilustra functionarea algoritmului de backtracking cu salt, se consideră exemplul robotului constient de restrictiile modei (Sectiunea 4.1.2) la care se adaugă o pereche suplimentară de valori complementare între variabilele Pantaloni si Cămăsi: cămasa verde se poate îmbrăca cu pantalonii jeans. Graful de restrictii asociat este prezentat în Figura 4.18 (a). Considerînd ordinea variabilelor Pantofi, Pantaloni, Cămăsi, ce se va întîmpla dacă se încearcă atribuirea unei valori variabilei Cămăsi pe calea pantofi de tenis, jeans a arborelui de căutare? Ambele valori ale variabilei Cămăsi, verde si albă, desi compatibile cu jeans, se dovedesc incompatibile datorită pantofilor de tenis. În algoritmul de backtracking cronologic, căutarea ar reveni la nivelul variabilei Pantaloni încercînd celelalte două valori bleu si gri. Acest lucru este inutil deoarece inconsistenta a fost generată de atribuirea făcută variabilei Pantofi. Concluzia care se desprinde este aceea că revenirea trebuie să se facă la nivelul variabilei care a produs inconsistenta, în acest caz la nivelul variabilei Pantofi. Cum pentru Pantofi nu mai există nici o altă valoare posibilă, algoritmul se opreste fără a găsi solutii pentru acest exemplu. Arborele de căutare generat de acest algoritm este prezentat în Figura 4.18 (b). Săgetile numerotate indică nivelele de revenire (salt) din backtracking. Se observă eliminarea unei portiuni din arborele de căutare datorită saltului la nivelul variabilei care a produs inconsistenta.

Figura 4.18 Problema robotului si arborele de căutare al algoritmului
de backtracking cu salt

Algoritmul care urmează utilizează variabilele U, N, F si functia descrise la tehnicile prospective. În plus, se utilizează vectorul NivelVec, cu dimensiunea egală cu gradul maxim al problemei, care memorează nivelele de blocare asociate fiecărei valori pentru variabila de pe nivelul curent. Procedura de bază BacktrackingCuSalt contine un parametru suplimentar Nivel care, la iesirea din procedură, va indica nivelul de blocare pentru atribuirile nivelului curent. Vectorul NivelVec este variabilă locală procedurii BacktrackingCuSalt. Functia Verifică, asemănătoare cu cea prezentată la algoritmul de backtracking simplu (Sectiunea 4.4.1), contine de asemenea un parametru suplimentar Nivel, care indică nivelul de blocare a unei perechi variabilă valoare. Se observă că functia Verifică testează compatibilitatea unei atribuiri curente începînd de la nivelul cel mai adînc (mai depărtat de rădăcină) spre nivelul cel mai scăzut al arborelui de căutare generat de algoritm. În acest fel algoritmul de backtracking cu salt detectează cel mai adînc nivel din arbore care a generat blocarea.

Algoritm: Backtracking cu salt

BacktrackingCuSalt

1. ,

2. pentru fiecare valoare V a lui XU execută

2.1.

2.2.

2.3. dacă

atunci

2.3.1. dacă

atunci

i. BacktrackingCuSalt(U+1,F,Nivel1)

ii. dacă Nivel1<U

atunci întrerupe executia procedurii

iii. altfel

2.3.2. altfel afisează valorile vectorului F /* F reprezintă solutia problemei */

2.4. altfel

2.5.

3. dacă si

toate elementele din NivelVec sînt egale

atunci

4. altfel

sfîrsit.

Verifică

1.

2.

3. cît timp execută

3.1.

3.2. dacă

atunci întrerupe ciclul

3.3.

4.

5. întoarce test

sfîrsit.

4.7.2 Algoritmul de backtracking cu marcare

Algoritmul de backtracking cu marcare elimină executia unor teste de consistentă care au fost deja făcute, nu au reusit, si dacă sînt repetate vor esua din nou. Sînt eliminate, de asemenea, si testele care au fost deja făcute, au reusit si ar reusi din nou dacă s-ar reface.

Pentru a explica acest proces, se tine cont de faptul că în arborele de căutare se face avans, apoi revenire, iar avans, etc. Se consideră variabila curentă XU. Fie XV variabila de nivel cel mai scăzut (cel mai aproape de rădăcină în arborele de căutare) la care s-a ajuns cu procesul de backtracking, deci si-a schimbat valoarea de la ultima vizitare a lui XU. Algoritmul de backtracking cu marcare va memora variabila XV.

Dacă , atunci algoritmul de backtracking cu marcare procedează similar algoritmului de backtracking simplu. Dacă , atunci toate valorile variabilei XU au fost deja testate cu valorile variabilelor , deci orice valoare a variabilei XU trebuie testată numai cu valorile variabilelor , acestea fiind variabilele ale căror valori s-au schimbat de la ultima vizitare a variabilei XU.

Figura 4.19 O portiune a spatiului de căutare în algoritmul de
backtracking cu marcare

Deoarece algoritmul de backtracking cu marcare memorează, de la ultima vizită a variabilei XU, ce valori ale lui XU au fost compatibile cu valorile variabilelor , segmentul A al arborelui de căutare prezentat în Figura 4.19 nu mai trebuie reverificat. Se verifică numai segmentul B, deci se testează valorile variabilelor .

Algoritmul prezentat în continuare mentine semnificatia variabilelor U si F folosite în algoritmii tehnicilor prospective. În plus, se folosesc două structuri de date suplimentare:

Matricea Marc, de dimensiune , unde N este numărul de variabile, iar V este numărul de valori ale variabilelor. Matricea Marc este indexată pe linii după numărul variabilelor, considerat în functie de ordinea de instantiere, si pe coloane după valorile fiecărei variabile. Astfel indicii elementului indică variabila XU si valoarea l din domeniul de definitie al acesteia. Elementul indică nivelul cel mai scăzut, i.e. cel mai apropiat de rădăcină, la care un test de consistentă a esuat atunci cînd perechea , de pe nivelul curent a fost testată cu perechi variabilă-valoare de pe nivele anterioare.

Vectorul Nivel, de dimensiune N, unde indică cel mai scăzut nivel în arborele de căutare la care a apărut o modificare de valoare pentru o variabilă, de la ultima atribuire a unei valori unui element al matricii Marc.

În timpul procesului de căutare apar 2 cazuri:

(1) , deci perechea a fost deja testată cu perechile variabilă-valoare de deasupra nivelului si testul va esua oricum la nivelul , deci aceste teste nu mai trebuie repetate.

(2) , deci toate testele perechii au reusit pe portiunea . În continuare numai testele de la nivelul si cele de sub pînă la nivelul variabilei X­U trebuie executate.

În intervalul figurat cu linie întreruptă din schema de mai sus, nu se execută teste de consistentă, deoarece acestea au reusit înainte de a se face revenire si în timpul revenirii nimic nu s-a schimbat pînă la .

Înaintea apelului subprogramului BacktrackingCuMarcare, toate elementele vectorului Nivel si ale matricii Marc sînt initializate cu valoarea 1, iar subprogramul este apelat cu parametrul . Deoarece structurile Nivel si Marc sînt utilizate la toate nivelele în recursivitate, spatiul de memorie necesar acestui algoritm este aproximativ egal cu numărul de variabile înmultit cu numărul de valori ale variabilelor.

Algoritm: Backtracking cu marcare

BacktrackingCuMarcare

1. pentru fiecare valoare V a lui XU execută

1.1.

1.2. dacă

atunci

1.2.1.

1.2.2.

1.2.3. cît timp execută /* găseste cel mai scăzut nivel de blocare */

i.

ii. dacă

atunci întrerupe ciclul /* cît timp */

iii.

1.2.4. /*marchează valoarea de blocare pe nivelul cel mai scăzut în arbore */

1.2.5. dacă

atunci

i. dacă

atunci BacktrackingCuMarcare

ii. altfel afisează atribuirea din F

2. /* nivelul anterior va fi schimbat */

3. pentru pînă la numărul de variabile execută

3.1.

sfîrsit.

Teste experimentale pentru problema celor N regine au demonstrat că, în toate cazurile, algoritmul de backtracking simplu este mai putin eficient. Dintre ceilalti algoritmi, algoritmul de backtracking cu marcare si cel cu verificare predictivă s-au dovedit a fi cele mai eficiente solutii. Eficienta a fost măsurată în functie de:

numărul de teste de consistentă

numărul de noduri generate în arborele de căutare

numărul de accese la structurile de date

În general acestia sînt indicatori standard de apreciere a eficientei algoritmului de rezolvare a problemei satisfacerii restrictiilor. Solutiile de implementare prezentate au folosit variabilele *EXPANDARI* si *VERIFICARI* pentru calculul si mentinerea primilor doi indicatori.

4.7.3 Algoritmul de backtracking cu multime conflictuală

Ideea de bază a algoritmului de backtracking cu multime conflictuală este o combinatie a celor două strategii retrospective anterioare. Într-o situatie de blocare, se identifică variabilele care au generat această situatie cu un dublu scop:

pentru a fi considerate în procesul de căutare cu reveniri, ca în orice algoritm de backtracking

pentru a se memora perechea de atribuiri incompatibile variabilă-valoare în vederea evitării ei la o viitoare resatisfacere a restrictiei.

Algoritmul de backtracking cu multime conflictuală realizează o transformare partială a restrictiilor implicite în restrictii explicite prin detectarea unor perechi de atribuiri inconsistente variabilă-valoare si memorarea acestora. Acest algoritm se mai numeste si algoritm de backtracking cu învătare în timpul căutării.

Una dintre formele de învătare automată este memorarea informatiei obtinute pe parcursul rezolvării unei probleme, informatie care poate fi ulterior utilizată fie la rezolvarea aceleiasi instante a problemei, fie la rezolvarea altor instante ale problemei. Metodele de învătare în timpul rezolvării unei probleme se numesc metode de învătare bazată pe explicatii si vor fi discutate pe larg în Capitolul 7. Aceste metode identifică în timpul căutării cea mai generală descriere a unei multimi de conditii care permite executia anumitor actiuni si care poate fi învătată pe parcursul rezolvării. În contextul rezolvării problemei satisfacerii restrictiilor, procesul transformării restrictiilor implicite în restrictii explicite poate fi văzut ca o formă de învătare bazată pe explicatii. Acest proces poate fi executat independent de procesul de căutare prin backtracking, asa cum s-a arătat în Sectiunea 4.5, dar eficienta procesului poate deveni efectivă dacă este încorporat în algoritmul de căutare, asa cum se prezintă în continuare.

Definitie. Fie starea curentă reprezentată de multimea atribuirilor curente variabilă-valoare realizate pînă la un moment dat în căutare. Se spune că multimea S este în conflict cu variabila Xi sau, pe scurt, S este o multime conflictuală dacă starea curentă este o situatie de blocare, i.e. multimea S nu mai poate fi extinsă cu nici o atribuire consistentă pentru variabila următoare Xi.

Observatie. Dacă problema ar fi inclus restrictii explicite, acestea ar fi împiedicat atribuirile din S si blocarea curentă ar fi fost evitată.

Din multimea conflictuală, însă, algoritmul de căutare poate să învete ceva. În anumite cazuri se memorează întreaga multime conflictuală pentru a putea răspunde la întrebări viitoare care referă aceeasi multime initială de conflicte. De cele mai multe ori însă, nu este necesară memorarea acestei multimi deoarece, în strategia de backtracking, această stare nu va mai apare niciodată. Dar dacă multimea S contine una sau mai multe submultimi ce sînt, de asemenea, în conflict cu variabila Xi, atunci memorarea acestei informatii sub forma unor restrictii noi, explicite, poate fi utilă, deoarece stări viitoare pot contine aceste submultimi conflictuale si pot fi astfel evitate.

Dacă o multime conflictuală contine cel putin o submultime conflictuală, memorarea celei mai mici submultimi conflictuale ca o restrictie este suficientă pentru a împiedica aparitia celorlalte submultimi conflictuale. Scopul algoritmului de backtracking cu multime conflictuală este acela de a identifica submultimi conflictuale cît mai mici ale multimii conflictuale S, deoarece submultimile conflictuale mici vor apare mai devreme în procesul de căutare.

Definitie. O multime conflictuală M se numeste multime conflictuală minimală, dacă multimea conflictuală M nu are nici o submultime conflictuală, i.e. , M nu este multime conflictuală.

Multimile conflictuale minimale pot fi privite ca multimile de instantieri de variabile care au generat conflictul, i.e. situatia de blocare. Descoperirea si memorarea unei submultimi conflictuale minimale, sau numai a uneia conflictuale, poate duce la cresterea performantelor algoritmului de backtracking. Primul pas în descoperirea unei submultimi conflictuale , unde S este o multime conflictuală cu variabila Xi, este acela de a elimina din S toate valorile care sînt irelevante pentru variabila Xi.

Definitie. O pereche variabilă-valoare este irelevantă pentru variabila Xi, dacă este consistentă cu toate valorile variabilei Xi. Perechile irelevante pot fi eliminate dintr-o multime conflictuală S deoarece nu pot face parte din multimea conflictuală minimală.

Procesul de memorare a restrictiilor generate prin eliminarea din S a perechilor irelevante pentru o variabilă Xi, se numeste învătare de suprafată. Învătarea de suprafată este completă dacă toate perechile irelevante sînt eliminate din S. Multimea conflictuală rezultată se notează .

Graful de restrictii al problemei oferă o modalitate usoară de identificare a perechilor irelevante. În acest graf perechile irelevante sînt perechile pentru care variabila Xk nu este legată cu variabila Xi din . Această conditie nu elimină toate perechile irelevante, deoarece si o variabilă legată cu variabila Xi în graf poate fi irelevantă. Deci multimea calculată cu ajutorul conditiei de mai sus include multimea .

Exemplu. Fie graful de restrictii din Figura 4.20, ordonarea variabilelor si un algoritm de backtracking care a ajuns în starea curentă

Această stare nu mai poate fi extinsă cu nici o valoare pentru variabila X , deci S este o multime în conflict cu variabila X . Dacă , atunci restrictia R este violată, dacă , restrictia R este violată. Se observă că si sînt perechi irelevante pentru variabila X , deoarece nu există nici o restrictie explicită între variabilele X si X sau între variabilele X si X . Rezultă multimea ca fiind . Această multime poate fi memorată prin eliminarea perechii din multimea de restrictii R . În această situatie, restrictia R devine . Multimea conflictuală nu este minimală deoarece este în conflict cu variabila X . De fapt, ar fi suficient să se memoreze numai această informatie, eliminînd valoarea b din domeniul variabilei X .

Figura 4.20 Graf de restrictii si multime conflictuală

Procesul de identificare si memorare numai a multimilor conflictuale minimale se numeste învătare de adîncime. Descoperirea tuturor multimilor conflictuale minimale se numeste învătare de adîncime completă.

Deducerea multimilor conflictuale minimale este un proces exponential în raport cu cardinalitatea multimii de conflicte, deci învătarea de adîncime completă poate induce necesităti de timp si spatiu suplimentare care vor depăsi avantajele de eficientă aduse de această metodă. Dacă c este cardinalitatea multimii si se consideră cazul defavorabil în care toate submultimile lui avînd elemente sînt în conflict cu Xi, numărul de multimi conflictuale minimale este de ordinul 2c, ceea ce înseamnă complexitate timp si spatiu exponentială la fiecare blocare. Chiar dacă din punct de vedere al timpului, procesul de învătare poate fi eficient pentru anumite grafuri de restrictii, el este costisitor din punct de vedere al spatiului de căutare.

În plus, nu este sigur că adăugarea restrictiilor suplimentare reduce necesar calculele efectuate de algoritmul de backtracking. Desi, în principiu, prezenta unui număr mare de restrictii va reduce spatiul de căutare, cresterea numărului de restrictii creste costul generării spatiului de căutare deoarece trebuie să se testeze un număr mai mare de restrictii la fiecare instantiere de variabilă. Din această cauză, algoritmul de backtracking cu multime conflictuală foloseste euristica memorării multimilor care referă un număr mic de variabile, de obicei una sau două. Controlul aritătii multimilor conflictuale este aplicabil atît la învătarea de suprafată cît si la cea de adîncime. De exemplu, dacă se decide memorarea numai a multimilor conflictuale cu o variabilă, implementarea poate realiza acest lucru prin eliminarea valorii variabilei din domeniul ei de valori. Învătarea de suprafată de ordinul doi va memora multimea conflictuală ca o restrictie numai dacă multimea are maximum două variabile. Învătarea de adîncime de ordinul doi va identifica si memora ca restrictii numai multimile conflictuale minimale de una sau două variabile.

Observatii:

Schemele de învătare de ordinul întîi sînt echivalente cu realizarea unei arc-consistente partiale, deoarece numai arcele găsite în procesul de căutare sînt făcute consistente. Schemele de învătare de ordinul doi sînt echivalente cu realizarea unui proces de arc-consistentă partială si cale-consistentă partială.

Asa cum s-a văzut, tehnicile prezentate sînt centrate pe două idei fundamentale: detectarea si schimbarea deciziilor care au cauzat o situatie de blocare cu ignorarea deciziilor irelevante si înregistrarea motivelor blocării, astfel încît aceleasi conflicte să nu mai apară din nou pe parcursul căutării. Ambele idei sînt încorporate într-un alt algoritm de satisfacere a restrictiilor care a fost extins la rezolvări generale a problemelor: algoritmul de backtracking condus de dependente. Prezentarea acestui algoritm si utilizarea lui în sistemele de mentinere a consistentei datelor se va face în Capitolul 5.

4.8 Problema satisfacerii partiale a restrictiilor

Prezentarea initială a problemei satisfacerii restrictiilor a discutat o instantă a problemei, numită problema satisfacerii partiale a restrictiilor. În continuare se vor prezenta doi algoritmi pentru rezolvarea acestei instante a problemei satisfacerii restrictiilor.

În cazul unei probleme de satisfacere a restrictiilor, o blocare apare în momentul în care se detectează o inconsistentă între o pereche de variabile instantiate. În cazul problemei satisfacerii partiale a restrictiilor, nu apare blocare atît timp cît nu s-au acumulat suficiente inconsistente pentru a se atinge numărul maxim de inconsistente admis. În acest caz, se pune problema găsirii unui algoritm de determinare a unei solutii maximale, i.e. o solutie care satisface un număr cît mai mare de restrictii. Acestă solutie poate fi aceea care satisface toate restrictiile, în cazul în care o astfel de solutie există si limitarea resurselor permite găsirea acestei solutii, sau solutia care satisface cele mai multe restrictii posibile, tot în conditiile existentei unor resurse date, eventual limitate.

4.8.1 Determinarea solutiei utilizînd algoritmul "branch and bound"

Primul algoritm prezentat este o extindere a algoritmului de backtracking simplu pentru problema satisfacerii partiale a restrictiilor. Ideea de bază a algoritmului este combinarea schemei de backtracking pentru găsirea tuturor solutiilor cu o strategie de căutare informată de tip "branch and bound" [Pearl,1984;Winston,1984;Freuder,Wallace,1992]. O strategie de căutare "branch and bound" memorează cea mai bună solutie găsită pînă la un anumit moment si abandonează calea de căutare curentă în momentul în care se constată că acea cale de căutare nu poate duce la o solutie mai bună.

Functia de evaluare utilizată de strategia "branch and bound" este, în acest caz, numărul de restrictii violate, altfel spus numărul de inconsistente detectate. Valoarea acestei functii reprezintă distanta unei anumite instantieri (partială sau completă) a variabilelor fată de solutia perfectă, i.e. solutia care satisface toate restrictiile. Această functie va fi notată în continuare cu d.

În timpul căutării se foloseste o variabilă NI care memorează numărul de inconsistente găsite în "cea mai bună solutie" depistată pînă la un moment dat. Valoarea NI reprezintă o limită necesară, în sensul că, pentru a obtine un rezultat mai bun, este necesară găsirea unei solutii cu mai putine inconsistente. Limita necesară NI poate fi stabilită initial pe baza cunostintelor specifice problemei: se stie, de exemplu, că există o solutie care violează mai putin de NI restrictii sau, alt exemplu, există cerinta a priori ca solutia să nu violeze mai mult de restrictii. În timpul căutării, în cazul în care se găseste o solutie care violează un număr de restrictii NI', , valoarea NI este inlocuită cu NI'. Din acest motiv, în cazul în care nu există informatie a priori despre valoarea limitei necesare, se poate considera la începutul algoritmului limita necesară "infinită" (foarte mare), iar algoritmul va determina cea mai mică valoare posibilă pentru limita necesară NI.

Considerînd din nou exemplul robotului constient de restrictiile modei (Sectiunea 4.1.2), în Figura 4.21 se prezintă arborele de căutare determinat de strategia "branch and bound" pentru rezolvarea acestei probleme. În figură, d reprezintă distanta fată de solutie, NI este limita necesară iar t.c. reprezintă numărul de teste de consistentă efectuate de la începutul căutării pînă într-un anumit nod al arborelui. Pe prima ramură de căutare, escarpeni-jeans-verde, se determină valoarea limitei necesare , iar pe ramura escarpeni-jeans-albă, valoarea . Se retine această ultimă valoare. Pe a treia ramură de căutare se recunoaste faptul că orice solutie partială care implică atribuirile Pantofi-escarpeni si Pantaloni-bleu, nu se poate extinde la o solutie cu o valoare inferioară pentru limita necesară NI, deoarece functia de evaluare are deja valoarea , asa că se abandonează căutarea de-a lungul acestei căi. Astfel de căi au fost marcate în Figura 4.21 prin atasarea simbolului * nodului de la care expandarea căii încetează.

Figura 4.21 Arborele de căutare generat de algoritmul "branch and bound"
pentru problema robotului

Algoritmul poate fi extins prin includerea unei valori noi, numită limita suficientă si notată cu S. Această valoare specifică faptul că o solutie care violează un număr de S restrictii (sau mai putine), este acceptabilă. Existenta limitei suficiente implică abandonarea căutării de îndată ce s-a ajuns într-o stare în care . De exemplu, dacă se stie a priori că o problemă de satisfacere a restrictiilor nu admite o solutie perfectă, se poate alege valoarea limită suficientă . Cu cît valoarea limitei suficiente este mai mare, cu atît mai simplu este de rezolvat problema. În cazul în care nu există cunostinte a priori despre S sau se testează dacă există solutie perfectă, se alege valoarea limitei suficiente .

Algoritmul "branch and bound" este potrivit si în cazul existentei unor resurse limitate, de exemplu timp, deoarece poate produce o primă solutie acceptabilă într-un interval limitat de timp si poate încerca ulterior o rafinare a acestei solutii, prezentînd deci o comportare de tipul "cel mai bun găsit pînă în prezent".

Determinarea unei solutii partiale utilizînd strategia "branch and bound" se bazează pe functia PBKT care întoarce ca valoare starea procesului de căutare; parametrii functiei au următoarea semnificatie:

Cale memorează calea de căutare, sub forma unei liste de instantieri variabilă-valoare realizate pînă la un anumit moment.

Distanta reprezintă numărul de restrictii violate, pînă la un anumit moment, de instantierile realizate pînă în acel moment.

Variabile reprezintă lista variabilelor ce nu au fost încă instantiate.

Valori memorează lista valorilor care nu au fost încă încercate ca extensie a căii curente, pentru variabila curentă. Se consideră ca variabilă curentă primul element din lista Variabile.

Functia poate întoarce două valori, care indică starea procesului de căutare:

GATA care semnalizează găsirea solutiei si întreruperea procesului de căutare, si

CONTINUĂ care semnalizează faptul că nu s-a găsit încă solutia si este necesară continuarea căutării.

În algoritm, functia PBKT este apelată recursiv pentru extensia căii curente prin instantierea variabilei următoare, sub forma PBKT, unde Rest(Variabile) este lista variabilelor neinstantiate din care a fost înlăturat primul element (variabila curentă) iar ValoriNoi reprezintă domeniul de valori al variabilei de pe nivelul următor. Functia PBKT este, de asemenea, apelată si pentru încercarea unei noi instantieri pe acelasi nivel, sub forma PBKT.

Algoritmul utilizează următoarele variabile globale:

CeaMaiBună, care memorează cea mai bună solutie găsită pînă la un moment dat,

NI, care memorează limita necesară si reprezintă numărul de inconsistente găsite în cea mai bună solutie pînă la un moment dat în căutare si

S, care memorează limita suficientă,

celelalte variabile fiind locale functiei PBKT.

Algoritmul este o tehnică retrospectivă, deci după instantierea unei variabile, valoarea ei este testată cu valorile atribuite variabilelor anterioare. Distanta fată de solutia perfectă este comparată cu valoarea NI după fiecare esec de verificare a restrictiilor.

Algoritm: Satisfacerea partială a restrictiilor utilizînd strategia "branch and bound"

PBKT (Cale, Distanta, Variabile, Valori)

1. dacă /* toate variabilele au atribuite valori */

atunci

1.1.

1.2.

1.3. dacă

atunci întoarce GATA /* solutia este suficient de bună */

1.4. altfel întoarce CONTINUĂ

2. altfel

2.1. dacă /* s-a încercat extinderea căii de căutare cu toate valorile */

atunci întoarce CONTINUĂ /* se revine la variabila anterioară */

2.2. altfel

2.2.1. dacă

atunci întoarce CONTINUĂ /* se revine la variabila anterioară pentru a încerca găsirea unei solutii mai bune */

2.2.2. altfel /* se încearcă extinderea căii curente */

i.

ii.

iii.

iv.

v. cît timp si execută

- Consideră prima pereche din Cale1

- dacă

atunci

-

vi. dacă si

PBKT

/* ValoriNoi - domeniul de valori asociat primei variabile din Rest(Variabile) */

atunci întoarce GATA /* s-a găsit o solutie satisfăcătoare */

vi. altfel întoarce PBKT

/* se încearcă găsirea unei solutii mai bune cu o nouă valoare pentru variabila curentă */

sfîrsit.

În algoritmul prezentat, s-a ales o variantă de căutare "branch and bound" care functionează pe o schemă de căutare în adîncime, deoarece această paradigmă este mai apropiată de algoritmul de backtracking. În plus, căutarea în adîncime este potrivită pentru a produce cea mai bună solutie pînă la un moment dat. Timpul cel mai defavorabil al aceastui algoritm este exponential în raport cu numărul de variabile si valori, dar nu este mai costisitor decît cel al algoritmului de backtracking simplu pentru găsirea unei solutii perfecte.

4.8.2 Determinarea solutiei utilizînd algoritmul de backtracking cu salt

Algoritmul de backtracking cu salt pentru rezolvarea problemei satisfacerii restrictiilor memorează nivelul din arborele de căutare pentru care toate valorile unei variabile au dus la blocare si, la revenire, face saltul la acel nivel. În cazul în care acest nivel este nivelul anterior, atunci se procedează ca în algoritmul de backtracking simplu.

În algoritmul de backtracking cu salt pentru rezolvarea problemei satisfacerii partiale a restrictiilor, blocarea nu apare la găsirea unei inconsistente, ci numai atunci cînd s-a acumulat un număr de inconsistente egal cu valoarea predefinită NI. De exemplu, dacă căutarea a ajuns la a variabilă din secventă, X , si verificarea consistentei unei valori din domeniul ei de valori cu valoarea atribuită variabilei X determină cresterea distantei la valoarea NI, adîncimea de blocare a variabilei X este 5.

Revenind la exemplul robotului constient de restrictiile modei, exemplu deja învătat pe dinafară de cititorul constiincios, arborele de căutare generat de algoritmul de backtracking cu salt pentru satisfacerea partială a restrictiilor este cel prezentat în Figura 4.22. Se observă că algoritmul detectează nivelul de blocare pantofi de tenis pentru variabila Cămăsi cu valorile verde si albă. În consecintă, se face saltul la nivelul variabilei Pantofi si nu se mai consideră celelalte două valori posibile pentru variabila Pantaloni, respectiv bleu si gri. Săgetile numerotate din figură indică nivelele de salt întoarse de functia PBJ, ce va fi prezentată în continuare.

Figura 4.22 Arborele de căutare generat de algoritmul de backtracking cu salt
pentru problema robotului

În afara diferentei mentionate anterior, există o a doua diferentă semnificativă între algoritmul de backtracking cu salt pentru rezolvarea problemei satisfacerii restrictiilor si cel pentru rezolvarea problemei satisfacerii partiale a restrictiilor. În cazul acestei ultime probleme, nu se poate sări întotdeauna la cel mai adînc nivel de blocare. Dacă una din valorile de pe nivelele inferioare nivelului de blocare a fost inconsistentă, i.e. a necesitat o crestere a distantei, se poate sări înapoi numai pînă la nivelul L al valorii inconsistente celei mai adînci, acesta fiind nivelul cel mai de jos în arbore unde a fost admisă o valoare inconsistentă. Acest lucru este necesar deoarece valori alternative de pe nivelul L ar putea implica mai putine inconsistente, făcînd distanta să crească mai putin, iar căutarea ar putea continua de la nivelul L, fără să ajungă la distanta limită NI în acelasi punct.

Ca un exemplu al acestui fenomen, se modifică problema robotului astfel încît să existe alte valori testate anterior care au dat o limită necesară . Se consideră ordinea variabilelor: Pantaloni, Cămăsi, Pantofi, asa cum se vede în Figura 4.23. Fiecare domeniu este verificat de la stînga la dreapta si o linie verticală apare la dreapta valorilor curent considerate. Inconsistentele sînt indicate de liniile ce unesc nodurile. Căutarea s-a blocat cînd a ajuns la variabila numărul trei, deoarece numărul de inconsitente a devenit egal cu valoarea limită NI, cu adîncimea de blocare egală cu X , nivelul variabilei 1. În cazul problemei satisfacerii restrictiilor, căutarea ar sări la nivelul variabilei X (Pantaloni) si următoarea valoare ar fi selectată; în cazul problemei satisfacerii partiale a restrictiilor, următoarea valoare asociată variabilei X (Cămăsi), albă, este compatibilă cu valoarea variabilei X (Pantaloni), bleu, deci nu există nici o inconsistentă între variabilele X si X (Pantaloni si Cămăsi). Prin revenirea la nivelul variabilei X , se poate alege o valoare care lasă distanta egală cu valoarea 0. În plus, valoarea escarpeni pentru variabila X este compatibilă cu valoarea albă a variabilei X , dar nu cu valoarea bleu a variabilei X , deci este posibilă găsirea unei solutii cu pantaloni bleu si cămasa albă avînd distanta egală cu 1.

Deoarece distanta limită NI a fost stabilită la valoarea 2, solutia găsită este acceptabilă. Totusi, ar fi putut fi ignorată dacă s-ar fi procedat ca în cazul algoritmului de backtracking cu salt pentru problema satisfacerii complete a restrictiilor.

Figura 4.23 Backtracking cu salt la nivelul ultimei selectii inconsistente

Pentru a surprinde acest caz, algoritmul trebuie să memoreze cel mai adînc nivel L asociat unei inconsistente, notat în continuare cu AdInconsist, în plus fată de memorarea adîncimii de blocare. Subprogramul PBJ(Cale, Distanta, Variabile, Valori, Adîncime, AdSalt, AdInconsist) rezolvă problema satisfacerii partiale a restrictiilor prin backtracking cu salt pornind de la o schemă generală asemănătoare cu cea folosită de subprogramul PBKT. Functia PBJ întoarce fie o valoare specială, GATA, avînd semnificatia găsirii unei solutii acceptabile, fie adîncimea de salt (i.e. nivelul unde se revine din backtracking). AdInconsist este transmis ca parametru al subprogramului si este actualizat la valoarea Adîncime, adîncimea curentă a procesului de căutare, dacă apare o blocare pe nivelul curent.

Algoritm: Satisfacerea partială a restrictiilor utilizînd strategia backtracking cu salt

PBJ (Cale, Distanta, Variabile, Valori, Adîncime, AdSalt, AdInconsist)

1. dacă

atunci

1.1.

1.2.

1.3. dacă

atunci întoarce GATA

1.4. altfel întoarce

2. altfel

2.1. dacă sau

atunci întoarce AdSalt /* poate duce la salt */

2.2. altfel /* încearcă extinderea căii */

2.2.1.

2.2.2.

2.2.3.

2.2.4.

2.2.5. cît timp si execută

i. Consideră prima pereche din Cale1

ii. dacă

atunci

-

-

iii.

2.2.6. dacă

atunci /* nu a apărut blocare */

2.2.7. dacă

atunci

2.2.8. altfel

2.2.9. dacă ( sau ) si

atunci întoarce NivelBloc2

2.2.10.altfel întoarce

sfîrsit.

Observatii:

Dacă problema admite o solutie care violează un număr de restrictii egal sau mai mic cu limita suficientă S, atunci algoritmul se opreste de îndată ce găseste această solutie. În cazul exemplului cu robotul, dacă se porneste cu limita suficientă , solutia găsită va fi .

Dacă nu există nici o solutie cu distanta inferioară limitei suficiente, atunci algoritmul inspectează toate căile de căutare care au o distantă inferioară sau egală cu cea mai bună distantă găsită pînă la un moment dat, în speranta găsirii unei solutii cu o distantă mai mică. În exemplul robotului, dacă se porneste cu limita suficientă , solutia găsită va fi .

Cele două observatii anterioare sînt valabile atît pentru algoritmul de backtracking cu salt cît si pentru algoritmul "branch and bound". În cazul algoritmului de backtracking cu salt, avantajul este evident acela al reducerii numărului de teste de consistentă efectuate, deci obtinerea unui timp de rezolvare mai bun.

4.8.3 Solutii de implementare

În această sectiune se prezintă solutiile de implementare ale celor doi algoritmi de backtracking pentru rezolvarea problemei satisfacerii partiale a restrictiilor: algoritmul "branch and bound" si algoritmul de backtracking cu salt.

În solutiile prezentate, semnificatia variabilelor speciale *EXPANDARI* si *VERIFICARI*, si a parametrilor Cale si Variabile ai functiilor PBKT si PBJ a rămas nemodificată fată de cea prezentată în Sectiunea 4.4.1. Spre deosebire de acestea, parametrul Valori si-a schimbat semnificatia. În implementarea din Sectiunea 4.4.1, parametrul Valori memora lista domeniilor de valori ale variabilelor neinstantiate. De această dată, Valori memorează domeniul de valori neexplorat al variabilei curente. Pentru a nu adăuga noi parametri functiilor, întregul domeniu de valori al unei variabile este memorat ca valoare a proprietătii Domeniu a simbolului asociat respectivei variabile. Din această cauză, la avansul pe un nivel mai adînc al arborelui de căutare, corespunzător variabilei ValoriNoi din algoritmii prezentati, se va folosi valoarea proprietătii Domeniu a variabilei următoare, iar rămînerea pe acelasi nivel în arborele de căutare va reprezenta explorarea restului domeniului de valori al variabilei curente Valori. Nivelul fiecărei variabile va fi memorat ca valoare a proprietătii Nivel, atasată simbolului asociat respectivei variabile.

Fată de programele prezentate anterior, care determinau toate solutiile unei probleme si le memorau în variabila specială *SOLUTII*, programele corespunzătoare algoritmilor de backtracking pentru rezolvarea problemei satisfacerii partiale a restrictiilor determină numai cea mai bună solutie găsită pînă la un moment al căutării. Această solutie este memorată în variabila specială *CEA-MAI-BUNA*. Variabilele speciale *NI* si *S* corespund limitei necesare si, respectiv, limitei suficiente din algoritmii prezentati. Valorile GATA si CONTINUĂ utilizate în algoritmi pentru a indica starea procesului de căutare vor fi codificate prin simbolii Lisp t si respectiv nil.

;; Satisfacerea partiala a restrictiilor utilizind strategia "branch and bound"

(defun PBKT (Cale Distanta Variabile Valori)

(if (null Variabile)

(progn

(setf *CEA-MAI-BUNA* Cale ;; memoreaza cea mai buna solutie

*NI* Distanta) ;; si calitatea ei

(<= *NI* *S*))

(if (null Valori) nil ;; CONTINUA

(if (>= Distanta *NI*)

nil

(let ((Var (first Variabile))

(Val (first Valori))

(DistNoua Distanta))

(do* ((Cale1 Cale (rest Cale1))

(pereche (first Cale1) (first Cale1)))

((or (null Cale1) ;; s-a terminat verificarea

(>= DistNoua *NI*))) ;; sau a aparut o blocare

(incf *VERIFICARI*)

(unless (exista-relatie-p Var Val (first pereche) (rest pereche))

(incf DistNoua)))

(if (and (<= DistNoua *NI*)

(incf *EXPANDARI*)

(PBKT (cons (cons Var Val) Cale)

DistNoua (rest Variabile)

(get (cadr Variabile) 'Domeniu)))

t

(PBKT Cale Distanta Variabile (rest Valori))))))))

;; Satisfacerea partiala a restrictiilor utilizind strategia backtracking cu salt

(defun PBJ (Cale Distanta Variabile Valori Adincime AdSalt AdInconsist)

(if (null Variabile)

(progn

(setf *CEA-MAI-BUNA* Cale ;; memoreaza cea mai buna solutie

*NI* Distanta) ;; si calitatea ei

(if (<= *NI* *S*)

t ;; GATA

(1- Adincime))) ;; nivelul de revenire

(if (or (null Valori) (>= Distanta *NI*))

AdSalt ;; nivelul de revenire

(let ((Var (first Variabile)) ;; incearca extinderea solutiei

(Val (first Valori))

(DistNoua Distanta)

NivelBlocare1

NivelBlocare2)

(do* ((Cale1 Cale (rest Cale1))

(pereche (first Cale1) (first Cale1)))

((or (null Cale1) ;; s-a terminat verificarea

(>= DistNoua *NI*))) ;; sau a aparut o blocare

(incf *VERIFICARI*)

(unless (exista-relatie-p Var Val (first pereche) (rest pereche))

(incf DistNoua) ;; marcheaza inconsistenta

(setf NivelBlocare1 ;; si adincimea variabilei

(get (first pereche) 'Nivel)))) ;; care a produs-o

(when (< DistNoua *NI*) ;; nu s-a blocat

(setf NivelBlocare1 Adincime))

(if (= DistNoua Distanta) ;; au aparut inconsistente?

(progn

(incf *EXPANDARI*)

(setf NivelBlocare2

(PBJ (append Cale (list (cons Var Val)))

DistNoua

(rest Variabile) (get (cadr Variabile) 'Domeniu)

(1+ Adincime) 0 AdInconsist)))

(progn

(incf *EXPANDARI*)

(setf NivelBlocare2

(PBJ (append Cale (list (cons Var Val)))

DistNoua

(rest Variabile) (get (cadr Variabile) 'Domeniu)

(1+ Adincime) 0 Adincime))))

(if (or (not (numberp NivelBlocare2)) ;; solutie acceptabila

(and (< DistNoua *NI*)

(< NivelBlocare2 Adincime))) ;; se face salt

NivelBlocare2

(PBJ Cale

Distanta

Variabile (rest Valori)

Adincime (max NivelBlocare1 AdSalt AdInconsist) AdInconsist)))))))

Initializarea procesului de căutare se realizează prin secventa:

(defparameter *CEA-MAI-BUNA* nil)

(defparameter *NI* *MOST-POSITIVE-FIXNUM*)

(defparameter *S* calitate)

(defparameter *EXPANDARI* 0)

(defparameter *VERIFICARI* 0)

unde *MOST-POSITIVE-FIXNUM* este o constantă Lisp avînd valoarea celui mai mare întreg reprezentabil, iar calitate este limita suficientă pe care utilizatorul doreste să o utilizeze.

Pentru rezolvarea problemei robotului se pot utiliza predicatul exista-relatie-p si functia tipareste-solutie definite în Sectiunea 4.6.4, iar reprezentarea problemei se obtine prin secventa:

(defparameter *VARIABILE* '(Pantofi Pantaloni Camasi))

(setf (get (first *VARIABILE*) 'Domeniu) '(Escarpeni Pantofi-de-tenis)

(get (second *VARIABILE*) 'Domeniu) '(Jeans Bleu Gri)

(get (third *VARIABILE*) 'Domeniu) '(Verde Alba)

(get (first *VARIABILE*) 'Nivel) 0

(get (second *VARIABILE*) 'NIVEL) 1

(get (third *VARIABILE*) 'Nivel) 2)

(defparameter *RESTRICTII*

`(,(cons '(Pantofi . Escarpeni) '(Pantaloni . Gri))

,(cons '(Pantofi . Pantofi-de-tenis) '(Pantaloni . Jeans))

,(cons '(Pantofi . Escarpeni) '(Camasi . Alba))

,(cons '(Pantaloni . Gri) '(Camasi . Verde))

,(cons '(Pantaloni . Jeans) '(Camasi . Alba))

,(cons '(Pantaloni . Bleu) '(Camasi . Alba))))

Tipărirea solutiei problemei se face prin apelurile:

(PBKT nil 0 *VARIABILE* (get (car *VARIABILE*) 'Domeniu))

sau

(PBJ nil 0 *VARIABILE* (get (car *VARIABILE*) 'Domeniu) 0 0 0)

si

(format t "~&Cea mai buna solutie (N=~D) :" *NI*)

(tipareste-solutie *CEA-MAI-BUNA*))

4.9 Exercitii si probleme

1. Trei actori, Radu, Sergiu si Tatiana, apar într-un spectacol alcătuit din mai multe acte. În fiecare act apar unul, doi sau toti trei actorii. Distributia din fiecare două acte consecutive trebuie să contină cel putin un actor comun, dar nu poate avea toti actorii în comun. Presupunîndu-se că actorii din distributia unui act rămîn pe scenă pe întreaga durată a actului, se cere:

1. Să se indice toate distributiile posibile pentru două acte consecutive

2. Dacă Sergiu apare în actele I si IV, care din următoarele asertiuni sînt adevărate:

(A) Sergiu apare în fiecare din primele patru acte.

(B) Radu apare o singură dată în primele patru acte.

(C) Tatiana apare atît în actul II cît si în actul III.

(D) Radu, Sergiu si Tatiana apar împreună în actul V.

(E) Distributia actului V este identică cu cea a actului III.

3. Dacă Radu este distribuit în actul I si apoi nu mai apare în următoarele patru acte, care dintre următoarele afirmatii este adevărată pentru distributiile din cel putin două din primele cinci acte

(A) Sergiu apare singur.

(B) Tatiana apare singură.

(C) Sergiu si Tatiana apar împreună.

2. Un agricultor plantează cinci tipuri diferite de legume: fasole, porumb, napi, mazăre si dovlecei. În fiecare an, agricultorul plantează trei tipuri de legume respectînd următoarele restrictii:

(1) Dacă agricultorul plantează porumb într-un an, trebuie să planteze si fasole în acel an.

(2) Dacă agricultorul plantează napi într-un an, nu mai trebuie să-i planteze si anul următor.

(3) În fiecare an agricultorul plantează cel mult un soi din legumele plantate în anul precedent.

Se cere:

(a) Dacă agricultorul plantează fasole, porumb si napi în primul an, ce va planta în cel de-al treilea an?

(b) Indicati combinatiile posibile de legume plantate în doi ani consecutivi. Care din următoarele combinatii se află printre cele posibile?

(A) fasole, porumb, napi; porumb, mazăre, dovlecei

(B) fasole, porumb, mazăre; fasole, porumb, dovlecei

(C) fasole, mazăre, dovlecei; fasole, porumb, napi

(D) porumb, mazăre, dovlecei; fasole, napi, mazăre

3. Să se scrie un program care să implementeze algoritmul de etichetare a desenelor prezentat în Sectiunea 4.3.

4. Se consideră o problemă definită prin următoarele restrictii:

(a) Restrictiile determinate de optiunile studentilor pentru anumite cursuri

Mihai, Prolog

Mihai, Matematică

Vlad, Artă

Vlad, Prolog

Anda, C

Anda, Lisp

Anda, Pascal

(b) Restrictiile determinate de desfăsurarea cursurilor în anumite zile ale săptămînii

Prolog, Luni ; Prolog, Vineri

Matematică, Marti ; Matematică, Vineri

C, Joi ; C, Vineri

Lisp, Marti

Pascal, Joi ; Pascal, Sîmbătă

(c) Restrictiile determinate de locul de desfăsurare al cursurilor

Luni, Clasa1

Marti, Clasa1

Joi, Clasa1 ; Joi, Clasa3

Vineri, Clasa2

Sîmbătă, Clasa2

Se cere:

(1) Să se reprezinte graful de restrictii asociat scopului "Ce studenti pot urma două cursuri diferite în două zile diferite?"

.

(2) Să se reprezinte graful de restrictii asociat scopului "Ce studenti pot urma care cursuri, în ce zile si în ce clase?".

(3) Să se utilizeze un limbaj de programare logic, de exemplu Prolog, pentru reprezentarea acestei probleme si să se exprime în limbaj cele două scopuri enuntate anterior.

5. Se consideră următoarea problemă, numită problema căsătoriilor stabile. N bărbati si N femei îsi exprimă preferintele, în ordine, pentru cei N indivizi de sex opus. Problema constă în găsirea unei multimi de căsătorii stabile. O multime de căsătorii este instabilă dacă există cel putin două persoane necăsătorite între ele care se preferă reciproc fată de sotii lor. Altfel spus, fiecare din cele două persoane si-a exprimat o preferintă mai mare fată de cealaltă persoană decît fată de sotul, respectiv sotia lui actuală. Se cere:

(1) Să se reprezinte graful de restrictii asociat unei instante a problemei, de exemplu , specificînd variabilele, domeniile lor de valori si restrictiile.

(2) Să se scrie un program pentru găsirea unei solutii a acestei probleme utilizînd un algoritm eficient.

(3) Să se scrie un subprogram care verifică dacă o multime generată de căsătorii este stabilă.

(4) Să se scrie un program pentru determinarea tuturor solutiilor acestei probleme, utilizînd unul din algoritmii de backtracking prezentati.

6. Se consideră următoarea problemă, cunoscută sub numele de problema zebrei. Există cinci case, de culori diferite, locuite de persoane avînd nationalităti diferite si care cresc animale diferite, fumează tigări diferite si beau băuturi diferite. Se cunoaste că:

1. Englezul locuieste în casa rosie.

2. Spaniolul are un cătel.

3. Cafeaua se bea în casa verde.

4. Ucraineanul bea ceai.

5. Casa verde este imediat la dreapta casei ocru.

6. Fumătorul de Old Gold creste melci.

7. În casa galbenă se fumează Kools.

8. În casa din mijloc se bea lapte.

9. Norvegianul trăieste în prima casă din stînga.

10. Fumătorul de Chesterfield locuieste imediat lîngă cel care creste vulpea.

11. În casa de lîngă cea în care se creste calul se fumează Kools.

12. Fumătorul de Lucky Strike bea suc de portocale.

13. Japonezul fumează Parliament.

14. Norvegianul trăieste imediat lîngă casa albastră.

Se cere:

(1) Să se reprezinte graful de restrictii binare al acestei probleme.

(2) Să se exprime restrictiile 5, 8, 9 si 11 si să se indice dacă aceste restrictii sînt unare sau binare.

(3) Să se afle cine creste zebra si cine bea apă. Pentru aceasta se va folosi un limbaj de programare logic, de exemplu Prolog, si se vor exprima restrictiile direct în limbaj. Se vor stabili două scopuri care să răspundă la cele două întrebări formulate.

7. Se consideră o problemă de satisfacere a restrictiilor definită în următorul mod:

există cinci variabile X1, X2, X3, X4 si X5

domeniile de valori ale variabilelor sînt , , , si

restrictiile sînt specificate de următoarele multimi

X1 X3

X2 X3

X3 X4

X3 X5

X4 X5

Se cere:

1. Să se deseneze graful de restrictii asociat problemei.

2. Să se aplice algoritmul de d-arc-consistentă si să se deseneze noul graf astfel rezultat.

3. Să se construiască arborii de căutare ai solutiei cu indicarea variabilelor conflictuale de fiecare dată cînd apare o blocare, atît înainte cît si după aplicarea algoritmului de d-arc-consistentă.

8. Să se scrie un program pentru implementarea algoritmului de realizare a d-arc-consistentei unui graf de restrictii, algoritm prezentat în Sectiunea 4.5. Se consideră ca date de intrare N, numărul de variabile ale problemei, domeniile de valori ale variabilelor si restrictiile binare dintre variabile. Cele N variabile ale problemei sînt ordonate si reprezentate prin numere întregi. Programul trebuie să afiseze noile domenii de valori ale variabilelor.

9.

Să se scrie un algoritm care determină dacă un graf de restrictii dat este d-arc-consistent. Să se discute care este efectul aplicării algoritmului de realizare a d-arc-consistentei pe un graf de restrictii care nu are proprietatea de d-arc-consistentă.

10.

Să se scrie un program pentru rezolvarea problemei celor opt regine utilizînd:

un algoritm de backtracking cu predictie completă,

un algoritm de backtracking cu predictie partială,

un algoritm de backtracking cu verificare predictivă.

În fiecare caz se va include o componentă de numărare a testelor de consistentă efectuate si se vor compara rezultatele obtinute.

11.

Să se scrie un program pentru rezolvarea problemei generale a criptogramei prezentată în Sectiunea 4.1.3, utilizînd:

un algoritm de backtracking simplu,

un algoritm de backtracking cu marcare.

12. Să se scrie un algoritm de backtracking pentru o problemă a cărei solutie este reprezentată prin grafuri SI/SAU. Să se implementeze acest algoritm pentru a rezolva problema următoare. Există 12 monede, identice ca formă, dintre care 11 au aceeasi greutate si una are o greutate diferită (este mai usoară sau mai grea decît celelalte). Utilizînd o balantă cu două talere egale să se găsească moneda de greutate diferită printr-un număr minim de cîntăriri.

13. Să se scrie un algoritm pentru rezolvarea problemei satisfacerii partiale a restrictiilor utilizînd metoda de backtracking cu marcare.

4.10 Rezolvări

4. (1) Graful de restrictii asociat scopului "Ce studenti pot urma două cursuri diferite în două zile diferite?"

este prezentat în Figura 4.24.

Figura 4.24 Graful de restrictii asociat primului scop al problemei cursurilor

(2) Graful de restrictii asociat scopului "Ce studenti pot urma care cursuri, în ce zile si în ce clase?" este prezentat în Figura 4.25.

Figura 4.25 Graful de restrictii asociat celui de-al doilea scop al problemei cursurilor

(3) Programul Prolog pentru rezolvarea problemei este:

%% Baza de fapte

%% optiune(Student,Curs) specifica restrictiile determinate de optiunile studentilor

%% pentru cursuri

optiune(mihai, prolog). optiune(mihai, matematica).

optiune(vlad, arta). optiune(vlad, prolog).

optiune(anda, c). optiune(anda, lisp).

optiune(anda, pascal).

%% desfasurare(Curs,Zi) specifica restrictiile determinate de desfasurarea cursurilor

%% în anumite zile ale saptaminii

desfasurare(prolog, luni). desfasurare(prolog, vineri).

desfasurare(matematica, marti). desfasurare(matematica, vineri).

desfasurare(c, joi). desfasurare(c, vineri).

desfasurare(lisp, marti). desfasurare(pascal, joi).

desfasurare(pascal, simbata).

%% sala(Zi,Clasa) specifica restrictiile determinate de locul de desfasurare al cursurilor

sala(luni, clasa1). sala(marti, clasa1).

sala(joi, clasa1). sala(joi, clasa3).

sala(vineri, clasa2

). sala(simbata, clasa2).

%% scopuri

?- optiune(Student,Curs1), optiune(Student,Curs2),

desfasurare(Curs1,Zi1), desfasurare(Curs2,Zi2),

not(Curs1=Curs2), not(Zi1=Zi2).

?- optiune(Student,Curs), desfasurare(Curs,Zi), sala(Zi,Clasa).

5. (2) Problema admite o solutie fără căutare, algoritmul următor găsînd o multime de căsătorii stabile. În algoritm LB reprezintă lista bărbatilor nelogoditi, LF pe cea a femeilor nelogodite, iar LFi reprezintă lista ordonată a preferintelor bărbatului Bi.

Algoritm: Determinarea unei multimi de căsătorii stabile

CăsătoriiStabile(LB, LF)

1. repetă

1.1.

1.2. Alege următoarea femeie preferată

1.3. Elimină Fj din LFi

1.4. dacă Fj nu este logodită

atunci

1.3.1. Logodeste Bi cu Fj

1.3.2. Elimină Fj din LF

1.3.3. Elimină Bi din LB

1.5. altfel

1.5.1.

1.4.2. dacă Fj preferă pe Bi lui Bj

atunci

i. Rupe logodna Fj - Bj

ii. Logodeste Fj cu Bi

iii. Elimină Bi din LB

iv. Introduce Bj în LB

pînă cînd

sfîrsit.

Pentru algoritmul prezentat complexitatea timp este liniară. Ordinea bărbatilor si a femeilor în listele initiale LB si LF este lipsită de importantă. Asa cum este scris, algoritmul "favorizează" preferintele bărbatilor. Algoritmul poate fi scris în mod similar pentru a favoriza preferintele femeilor, între solutiile obtinute de cele două variante putînd apare diferente.

Programul Lisp, prezentat în continuare, implementează algoritmul prezentat mai sus. Variabilele speciale *LB* si *LF* memorează listele bărbatilor nelogoditi si ale femeilor nelogodite considerate drept exemplu. Variabila LL din functia casatorii-stabile memorează logodnele stabilite pînă la un moment dat, iar în final va reprezenta solutia problemei, deci multimea de căsătorii stabile. Fiecare logodnă este reprezentată printr-o pereche cu punct . Listele de preferinte ale bărbatilor si femeilor sînt memorate ca valori ale proprietătii Preferinte a simbolurilor asociate bărbatilor si femeilor.

(defun stabileste-preferinte (persoana lista-preferinte)

"Stabileste lista preferintelor pentru o persoana si intoarce persoana."

(setf (get persoana 'Preferinte) lista-preferinte)

persoana)

(defparameter *LB*

`(,(stabileste-preferinte 'Adrian '(Carmen Tatiana Elena Rodica Sanda))

,(stabileste-preferinte 'Bogdan '(Elena Carmen Rodica Sanda Tatiana))

,(stabileste-preferinte 'Cristi '(Carmen Rodica Tatiana Sanda Elena))

,(stabileste-preferinte 'David '(Elena Rodica Carmen Sanda Tatiana))

,(stabileste-preferinte 'Florin '(Tatiana Rodica Carmen Elena Sanda)))

"Lista barbatilor nelogoditi.")

(defparameter *LF*

`(,(stabileste-preferinte 'Elena '(Florin Adrian David Bogdan Cristi))

,(stabileste-preferinte 'Carmen '(David Florin Bogdan Adrian Cristi))

,(stabileste-preferinte 'Rodica '(Adrian David Bogdan Cristi Florin))

,(stabileste-preferinte 'Sanda '(Cristi Bogdan David Adrian Florin))

,(stabileste-preferinte 'Tatiana '(David Bogdan Cristi Florin Adrian)))

"Lista femeilor nelogodite.")

(defun logodeste (barbat femeie lista-logodne)

"Introduce o noua logodna in lista de logodne.

Intoarce noua lista a logodnelor."

(cons (cons barbat femeie) lista-logodne))

(defun rupe-logodna (barbat femeie lista-logodne)

"Elimina o logodna din lista de logodne."

(delete (cons barbat femeie) lista-logodne :test #'equal))

(defun casatorii-stabile (LB LF)

"Stabileste un set de casatorii stabile intre barbatii din

lista LB si femeile din lista LF. Intoarce lista casatoriilor."

(do ((Bi (first LB) (first LB))

LL Bj Fj)

((null LB) LL)

(setf Fj (pop (get Bi 'Preferinte))) ;; extrage prima preferinta a lui Bi

(if (member Fj LF :test #'eq)

(progn ;;Fj este nelogodita

(setf LL (logodeste Bi Fj LL))

(setf LF (delete Fj LF :test #'eq))

(pop LB))

(progn ;; Fj este logodita si

(setf Bj (first (rassoc Fj LL))) ;; Bj este logodnicul actual al lui Fj

(when (member Bj ;; Bj se afla după Bi in lista de

(member Bi ;; preferinte a lui Fj ?

(get Fj 'Preferinte)

:test #'eq)

:test #'eq)

(setf LL (rupe-logodna Bj Fj LL))

(setf LL (logodeste Bi Fj LL))

(pop LB)

(push Bj LB))))))

(3) Algoritmul de complexitate liniară prezentat mai sus, găseste o singură solutie. Pentru generarea tuturor solutiilor problemei trebuie utilizat un algoritm general de satisfacere a restrictiilor.

6. (1) Se folosesc 25 de variabile împărtite în 5 grupe, astfel:

1. rosu, albastru, galben, verde, ocru

2. norvegian, ucrainean, englez, spaniol, japonez

3. cafea, ceai, apă, lapte, suc de portocale

4. zebră, cătel, cal, vulpe, melci

5. Old Gold, Parliament, Kools, Lucky Strike, Chesterfield

Fiecare variabilă are domeniul de valori , atribuirea unei valori variabilei reprezentînd asocierea unui număr de casă caracteristicii reprezentate de variabilă. De exemplu, (initial) iar indică atribuirea valorii 2 variabilei rosu si semnifică faptul că a doua casă este rosie.

Restrictiile problemei pot fi astfel exprimate ca restrictii binare. De exemplu, "Spaniolul are un cătel" descrie o restrictie între variabilele spaniol si cătel ce permite numai valorile . Această restrictie are următoarea semnificatie: dacă spaniolul stă în prima casă, deci , atunci si cătelul este în prima casă, deci , de unde apare restrictia (1,1), si analog pentru celelalte restrictii. Astfel, fiecare conditie din problemă se traduce printr-o restrictie. În plus, există o restrictie între fiecare pereche de variabile din aceeasi grupă, care împiedică atribuirea de valori egale unor astfel de variabile.

Graful de restrictii este prezentat în Figura 4.26. În figură, restrictiile între variabilele aceleiasi grupe au fost omise.

Figura 4.26 Graful de restrictii al problemei zebrei

(2) Conditia 5 va fi reprezentată sub forma unei restrictii binare între variabilele verde si ocru, restrictie care permite numai valorile .

Conditia 8 va fi reprezentată printr-o restrictie unară care determină domeniul de valori al variabilei lapte să contină numai valoarea 3 ().

Conditia 9 va fi reprezentată tot printr-o restrictie unară, domeniul de valori al variabilei norvegian devenind .

Conditia 11 va fi reprezentată sub forma unei restrictii binare între variabilele Kools si cal, restrictie care permite numai valorile indicate mai jos.

8. Functia d-arc-cons realizează d-arc-consistenta unui graf de restrictii. Graful este specificat prin lista ordonată a variabilelor problemei, deci prin lista nodurilor grafului. Fiecare variabilă va memora ca valoare a proprietătilor Nivel si Vecini pozitia variabilei în ordonare si, respectiv, variabilele cu care este legată în graful de restrictii. Domeniul de valori al fiecărei variabile va fi memorat ca valoare a proprietătii Domeniu, atasată simbolului asociat variabilei în reprezentarea problemei. Functia verifica este implementarea în Lisp a subprogramului descris în Sectiunea 4.5.2.

(defun verifica (Xj Xi)

(dolist (x (get Xj 'Domeniu))

(unless (some #'(lambda (y)

(exista-relatie-p Xi y Xj x))

(get Xi 'Domeniu))

(setf (get Xj 'Domeniu) (delete x (get Xj 'Domeniu) :test #'eq)))))

(defun d-arc-cons (Variabile)

(dolist (Xi Variabile)

(let ((i (get Xi 'Nivel)))

(do* ((vecini (get Xi 'Vecini) (rest vecini))

(Xj (first vecini) (first vecini))

(j (get Xj 'Nivel) (get Xj 'Nivel)))

((or (null vecini) (>= j i)))

(verifica Xj Xi)))))

Ordonarea variabilelor unei probleme particulare poate fi realizată prin apelul:

(sort *VARIABILE* #'(lambda (Xi Xj) (< (get Xi 'Nivel) (get Xj 'Nivel))))

unde *VARIABILE* este o variabilă specială, care memorează lista de variabile ale unei probleme particulare.

Capitolul 6

Logica actiunii si planificare automată

Un aspect important al rationamentului de bun simt si al problemelor de planificare automată este capacitatea de a reprezenta actiuni si de a rationa despre aceste actiuni, deci de a rationa despre schimbări. Planificarea automată, care implică utilizarea actiunilor, reprezintă un domeniu intens investigat al inteligentei artificiale. Cele mai multe probleme de planificare se referă la domenii complexe, pentru care reprezentarea si prelucrarea descrierii complete a stărilor problemei de rezolvat poate deveni foarte costisitoare. Din această cauză, de multe ori este nevoie să se adopte o strategie de reprezentare partială a universului problemei cît si o strategie de descompunere a problemei în subprobleme.

Rationamentul despre actiuni implică rezolvarea celor trei probleme ale rationamentului de bun simt, mentionate în capitolul anterior: problema cadrului, problema calificării si problema ramificării. Se consideră cazul unui robot care trebuie să execute actiunile de mutare a obiectelor dintr-o cameră. Dacă robotul mută masa din centrul camerei lîngă fereastră, un sistem de planificare automată trebuie să fie capabil să deducă faptul că nici covorul si nici dulapul nu si-au schimbat pozitia, chiar dacă acest lucru nu s-a spus explicit . Aceasta este problema cadrului, deci a identificării si inferării tuturor faptelor care nu s-au schimbat ca efect al executării unei actiuni sau a trecerii timpului. Dacă robotul trebuie să execute actiunea de mutare a bibliotecii din cameră, el ar putea să nu reusească deoarece biblioteca este prea grea, sau pentru că ea este ancorată în podea, sau din cauză că se dărîmă casa, etc. Înregistrarea tuturor preconditiilor necesare executării unei actiuni este de multe ori imposibilă, aceasta fiind problema cadrului. Dacă robotul mută dulapul dintr-un loc în altul al camerei, floarea de pe dulap va fi mutată odată cu dulapul, anumite portiuni de covor vor fi acoperite, s-ar putea ca fereastra să fie blocată, etc. Aceasta este problema ramificării, deoarece este imposibil să se înregistreze toate consecintele unei actiuni. Astfel, reprezentarea completă si explicită a tuturor stărilor universului unei probleme de executare a actiunilor în lumea reală este foarte diferită, de fapt imposibilă pentru situatii complexe. Tot datorită complexitătii problemelor de planificare, de multe ori este indicat să se folosească paradigma de rezolvare a problemelor prin descompunere în subprobleme [Pearl,1988].

Tehnicile de rezolvare a problemelor prin descompunerea problemei în subprobleme sînt viabile numai în cazul problemelor pentru care subproblemele componente nu interactionează între ele, deci sînt independente. Altfel spus, rezolvarea unei subprobleme nu depinde de rezolvarea altor subprobleme si nici nu este afectată de rezolvarea subproblemelor ulterioare ei. Din păcate, pentru numeroase probleme nu există o descompunere în subprobleme care să satisfacă conditia anterior enuntată, problemele rezultate din descompunere fiind interdependente. Din multimea problemelor interdependente, Herbert Simon identifică problemele aproape independente ca fiind o multime de subprobleme, provenite din descompunerea unei probleme, între care există numai o interactiune redusă. Această caracteristică simplifică, într-o oarecare măsură, problema generării automate a planurilor, dar si în acest caz trebuie să se tină seama de interactiunile existente.

Din punct de vedere al întelesului obisnuit, planificarea implică stabilirea unei secvente de actiuni pentru atingerea unui anumit scop. În cazul rezolvării unei probleme de planificare cu ajutorul calculatorului, distinctia între plan si actiune este mai putin evidentă, deoarece planul propus pentru a realiza un anumit scop nu este, de cele mai multe ori, aplicat pe măsura dezvoltării sale. Chiar dacă problema implică actiuni irevocabile în lumea reală, programul de planificare poate simula planul, ceea ce permite utilizarea unei strategii tentative. Succesul acestei abordări se bazează pe presupunerea că lumea reală este predictibilă. Din nefericire, acest lucru nu este întotdeauna adevărat, deci procesul de simulare nu poate considera toate alternativele posibile.

Un aspect important al problemelor de planificare este tocmai acela că lumea reală nu este întotdeauna predictibilă. Un plan bine alcătuit pentru atingerea unui scop în anumite conditii poate să nu mai functioneze la aparitia unor conditii reale diferite. Modificarea neasteptată a contextului poate să invalideze tot planul sau numai o parte din el. O problemă importantă este aceea a refacerii planului, păstrînd totodată acele părti din plan care rămîn în continuare valide. Acest aspect constituie un argument în plus în favoarea necesitătii descompunerii problemelor în subprobleme. Pe lîngă reducerea complexitătii reprezentării si a procesului de rezolvare a problemelor, descompunerea problemelor în subprobleme reduce si complexitatea operatiilor de revizuire dinamică a planului, operatii necesare pe parcursul executării unui plan într-o lume imprevizibilă. Operatiile de revizuire a planului se execută mai usor în cazul unor probleme independente sau aproape independente.

Asa cum se deduce si din aspectele prezentate anterior, problemele de planificare si rationament despre actiuni necesită un proces de căutare. De cele mai multe ori căutarea este condusă de scopuri, deci se face pornind de la starea scop si determinînd secventele de operatori care fac trecerea de la starea initială la starea finală. În scopul facilitării operatiilor de revizuire a planului, este util să se asocieze fiecărei actiuni executate în cadrul unui plan motivul care a determinat aparitia actiunii în cadrul planului. Astfel, dacă într-o nouă situatie o anumită actiune nu mai este necesară sau valabilă, utilizînd o strategie de backtacking condus de dependente, se pot determina restul actiunilor din plan dependente de actiunea în cauză, deci se pot identifica astfel actiunile care trebuie reconsiderate.

Metodele de generare automată a planurilor pot fi împărtite în două categorii: metode de planificare liniară si metode de planificare neliniară. În cazul planificării liniare, o secventă de scopuri este rezolvată prin satisfacerea fiecărui subscop, pe rînd. Un plan generat de o astfel de metodă contine o secventă de actiuni care duce la satisfacerea primului subscop, apoi secventa de actiuni necesară satisfacerii celui de-al doilea subscop, si asa mai departe.

Această metodă nu poate fi utilizată pentru rezolvarea problemelor de planificare în care subproblemele interactionează, asa cum se va prezenta în Sectiunile 6.3 si 6.4. În acest caz, trebuie utilizată o metodă de planificarea neliniară care generează planuri prin considerarea simultană a mai multor subprobleme obtinute din descompunerea problemei initiale. Planul este întîi incomplet specificat si rafinat ulterior considerînd interactiunile existente. O astfel de metodă se numeste planificare neliniară deoarece planul nu este compus dintr-o secventă liniară de subplanuri complete. Planificarea neliniară implementează o paradigmă de rezolvare a problemelor cunoscută în inteligenta artificială sub numele de strategia deciziilor amînate. Această abordare este utilă si în cazul necesitătii revizuirii dinamice a planului.

Primele sisteme de planificare automată au fost: sistemul GPS [Newell,Simon,1963] si sistemul STRIPS [Fikes,Nilsson,1971], ce vor fi prezentate în Sectiunea 6.2 si, respectiv, Sectiunea 6.3. Sistemul de planificare liniară STRIPS a fost primul program care a dat o rezolvare problemei cadrului, la nivelul implementării.

Sistemul de planificare independent de domeniu HACKER [Sussman,1975] a fost primul program care a considerat aspecte de planificare neliniară si a încercat să dea o rezolvare anomaliei lui Sussman (anomalia lui Sussman este prezentată în Sectiunea 6.3). Primul sistem de planificare neliniară a fost NOAH [Sacerdoti,1975] care a inclus o îmbunătătire a modalitătilor de reprezentare a planurilor, un set extins de operatori de modificare a planului si care a oferit o rezolvare consistentă anomaliei lui Sussman.

Un sistem de planificare neliniară de referintă este sistemul MOLGEN [Stefik,1981a,b], destinat planificării experientelor de genetică moleculară. Sistemul MOLGEN este primul program care a utilizat propagarea restrictiilor ca o tehnică centrală în planificare si care a introdus conceptul de planificare ierarhică. Sistemul TWEAK [Chapman,1987], care va fi prezentat în Sectiunea 6.4, este un sistem recent de planificare neliniară care utilizează de asemenea propagarea restrictiilor si, în plus, oferă o formalizare si o analiză a eficientei computationale a planificării automate.

Formalizarea rationamentului despre actiuni

S-au propus diverse modele de formalizare logică a rationamentului despre actiuni. În continuare, se prezintă pe scurt un model monoton si doua modele nemonotone ale actiunilor. Cititorul trebuie să remarce faptul că rationamentul despre actiuni este de tip nemonoton, implică cele trei probleme discutate anterior, deci oricare din abordările formale nemonotone prezentate în Capitolul 5 pot constitui punctul de plecare al formalizării actiunilor.

Abordarea monotonă

Prima propunere de formalizare a rationamentului despre actiuni a fost făcută de McCarthy [McCarthy,Hayes,1969]. În această abordare, există axiome explicite care indică toate faptele ce rămîn valabile după executarea fiecărei actiuni. Aceste axiome sînt de două tipuri: axiome ale actiunilor care indică faptele care se schimbă ca efect al unei actiuni, si axiome ale cadrului care indică faptele neafectate de executarea fiecărei actiuni.

De exemplu, fie operatia de mutare a unui obiect executată de un robot. Dacă obiectul x care se mută si obiectul l peste care se va pune x sînt libere, mutarea obiectului x peste l va avea ca rezultat faptul că x este deasupra lui l. Formal, acest lucru se exprimă astfel:

unde notatia ps semnifică faptul că propozitia p este adevărată în situatia (sau la momentul de timp) s, iar expresia se referă la situatia (sau timpul) în care actiunea a fost executată.

Pe lîngă axiomele de acest tip, care descriu actiuni, trebuie enuntate si axiome care descriu faptele ce nu se schimbă în urma executării unei actiuni, deci axiomele cadrului. De exemplu, o axiomă a cadrului poate enunta faptul, prin mutarea obiectului x peste l, pozitia celorlalte obiecte nu se modifica, astfel:

Similar, trebuie adăugate axiome ale cadrului care indică faptul că mutarea unui obiect nu afectează forma sau culoarea obiectelor existente:

Abordarea monotonă pune două mari probleme. Prima problemă este de ordin epistemologic si constă în indicarea explicită a tuturor axiomelor cadrului. Acest lucru poate deveni foarte dificil, mai ales dacă axiomele cadrului sînt complexe. A doua problemă este complexitatea computatională implicată de determinarea faptelor care rămîn adevărate după executarea unei actiuni. Dacă baza de cunostinte contine un număr mare de fapte, numărul de deductii necesare pentru demonstrarea acestor fapte poate deveni prohibitiv de mare.

Abordarea logicii implicite

O abordare nemonotonă a descrierii actiunilor permite reprezentarea schimbărilor prin axiome explicite care indică ce fapte se modifică si adăugarea unei singure axiome de rationament implicit care spune că toate celelalte fapte nu se modifică. Folosind logica implicită a lui Reiter [1980], o formalizare posibilă este:

Această axiomă exprimă faptul că dacă propozitia p este adevărată în situatia (la momentul de timp) s si p este în continuare consistentă după executarea actiunii a, se poate infera că p este adevărată după actiunea a. Deci, atît timp cît actiunea a nu a produs o consecintă care să infirme p, propozitia p poate fi considerată adevărată.

Abordarea implicită nu prezintă dificultătile epistemologice ale celei monotone, dar ridică în continuare problema complexitătii computationale. Pentru a determina faptele adevărate după executarea unei actiuni, axioma cadrului descrisă mai sus trebuie aplicată pentru fiecare fapt de interes.

Abordarea lumilor posibile

Modelul lumilor posibile poate fi utilizat în formalizarea rationamentului despre actiuni, asa cum arată Ginsberg si Smith [1988]. În această abordare, rezultatul unei actiuni reprezintă lumea nouă cea mai apropiată de lumea curentă, în care rezultatele actiunii sînt consistente. De exemplu, dacă un robot mută dulapul dintr-un loc în altul al camerei, rezultatul acestei actiuni este cea mai apropiată lume de cea curentă, în care dulapul este în noua pozitie. În această lume nouă, dulapul nu va mai fi în vechea pozitie, tot ce se află în dulap si deasupra lui va fi în noua pozitie si, în plus, fereastra sau tabloul din cameră pot fi blocate de dulap.

În formalizarea actiunilor prin lumi posibile, se identifică o serie de fapte si axiome care se numesc restrictii ale domeniului sau propozitii protejate, si despre care se stie că nu pot fi modificate de nici o actiune. Se defineste o lume partială ca fiind orice colectie consistentă de fapte si axiome care descrie domeniul problemei, o parte din elementele acestei lumi fiind specificate ca protejate.

Se presupune că lumea partială S descrie situatia curentă si că se doreste adăugarea multimii de fapte C la această lume. În modelul general al lumilor posibile, adăugarea de fapte la o lume curentă nu revine la considerarea multimii deoarece C poate fi inconsistentă cu S. Pentru a rezolva această problemă, se consideră submultimi ale multimii . În aceste submultimi există restrictiile domeniului care nu pot fi eliminate. Un exemplu de astfel de elemente protejate este axioma care indică faptul că un obiect poate fi într-un singur loc la un anumit moment.

Definitie. Fiind dată o multime de formule logice S, o multime de elemente protejate (restrictii ale domeniului) si o multime de formule suplimentare C, o lume potentială pentru C în S se defineste ca fiind orice submultime astfel încît:

(1) . T contine formulele din C care trebuie explicit adăugate pentru a construi noua lume.

(2) . Orice element protejat din S este păstrat în noua lume.

(3) T este consistentă.

Se observă că "apropierea" unei lumi potentiale pentru C în S de lumea initială S este reflectată de cardinalitatea multimii T. Astfel, dacă T si T sînt lumi potentiale pentru C în S, si , T este cel putin la fel de aproape de S ca si T . Această observatie conduce la definitia notiunii de cea mai apropiată lume potentială sau a lumii posibile pentru C în S.

Definitie. Fie o multime de formule logice S, o multime de elemente protejate si o multime de formule suplimentare C. O lume posibilă pentru C în S se defineste ca fiind multimea astfel încît:

(1) ,

(2) ,

(3) T este consistentă,

(4) T este maximală din punct de vedere al restrictiilor (1)(3).

Se notează cu L(C,S) multimea de lumi posibile pentru C în S.

Plecînd de la aceste notiuni, Ginsberg si Smith formalizează actiunile după cum urmează. Fie o descriere a universului initial al problemei S, împreună cu o multime de actiuni A. Fiecare actiune este definită printr-o multime de preconditii p(a) si o multime de consecinte C(a). Preconditiile trebuie să fie adevărate pentru a putea executa actiunea si rezultatul actiunii este adăugarea faptelor din C(a) la descrierea lumii curente. Dacă p(a) ar specifica toate preconditiile necesare actiunii, deci ar fi completă, ar dispare problema calificării. Dacă C(a) ar fi completă, ar dispare problema ramificării.

Fiind dată descrierea lumii S si o actiune a, se doreste definirea rezultatului actiunii a ca fiind lumea nouă obtinută prin adăugarea consecintelor actiunii la lumea curentă. Dificultatea constă în faptul că lumea rezultată poate fi inconsistentă. Se defineste rezultatul unei actiuni a, executată în lumea S, cu consecintele C(a), ca fiind intersectia tuturor lumilor posibile pentru C(a) în S, si se notează această multime cu . Dacă , atunci se consideră că . Definitia efectului unei actiuni în termenii modelului lumilor posibile se poate extinde la definitia rezultatului unei secvente de actiuni .

Autorii formalismului descris propun algoritmi pentru generarea lumilor posibile si pentru selectia celei mai apropiate lumi posibile. Din nefericire, selectia celei mai apropiate lumi posibile nu poate fi făcută întotdeauna deoarece sînt cazuri în care nu există o relatie de incluziune între lumile posibile generate. Constructia formală propusă nu poate selecta o lume între astfel de lumi si trebuie să se recurgă la cunostinte specifice domeniului pentru a lua o decizie. În sectiunile care urmează se vor prezenta solutii computationale ale rationamentului despre actiuni care încearcă să rezolve eficient o parte din problemele apărute în modelele formale.

Sistemul General Problem Solver

Unul dintre primele sisteme de planificare propuse a fost sistemul General Problem Solver, pe scurt GPS, dezvoltat la sfîrsitul anilor '50 de Alan Newell si Herbert Simon [1963]. Strategia de rezolvare a problemelor utilizată în GPS este analiza bazată pe modalităti. Ideea de bază a acestei strategii, enuntată întîia oară de Aristotel, este următoarea: la rezolvarea unei anumite probleme, se presupune scopul atins, i.e. problema rezolvată, si se analizează cum, prin aceasta întelegîndu-se prin ce mijloace, se poate realiza acest deziderat. Dacă se constată că există mai multe mijloace de realizare, se va considera acel mijloc care rezolvă problema cel mai usor si în acelasi timp cel mai bine. Dacă, dimpotrivă, se constată că există un singur mijloc de rezolvare a problemei, se consideră acel mijloc, si analiza se concentrează asupra modalitătilor de realizare a acestuia. Cu alte cuvinte, problema initială s-a descompus (transformat) într-o nouă problemă. Procesul de descompunere continuă pînă cînd problema rezultată în urma unei descompuneri nu mai poate fi redusă printr-o nouă descompunere, fie datorită faptului că este suficient de simplă pentru a nu mai constitui o problemă, fie datorită inexistentei unor mijloace de reducere. În acest din urmă caz, rezolvarea problemei esuează. Aristotel a conjecturat că acesta este chiar modelul de analiză aplicat de oameni în subconstient.

Newell si Simon au descris acest mod de analiză folosind notiunea de eliminare a diferentelor. Ei au identificat problema cu multimea diferentelor existente între starea scop si starea initială a problemei si rezolvarea problemei cu reducerea acestor diferente pînă la eliminarea lor, efectuînd pentru aceasta numai transformări (actiuni) posibile în universul problemei. Transformările sînt asociate cu o multime de preconditii care trebuie să fie îndeplinite într-o stare pentru a putea aplica transformarea în starea respectivă. Ca efect al transformării, starea problemei se modifică în conformitate cu o multime de efecte asociate transformării. Asocierea unei transformări cu preconditiile si efectele sale formează un operator. Operatorii sînt specificati de către proiectantul problemei.

În viziunea celor doi autori, rezolvarea unei probleme utilizînd analiza bazată pe modalităti constă în detectarea repetată a diferentelor între starea curentă si starea scop, apoi selectarea unui operator care poate fi aplicat pentru a reduce această diferentă. În cazul în care operatorul nu poate fi aplicat în starea curentă, se crează subscopul prin care trebuie să se ajungă din starea curentă în starea în care operatorul selectat poate fi aplicat. Dar este posibil ca operatorul selectat, desi a redus o parte din diferentele dintre starea curentă si starea scop, să nu producă chiar starea scop dorită. Apare în acest fel un nou subscop, acela de a ajunge din starea produsă de operator în starea scop. Dacă operatorul este bine ales, rezolvarea celor două subprobleme, corespunzatoare celor două scopuri, poate fi mai usoară decît rezolvarea problemei initiale. Deci, o problemă poate fi rezolvată fie aplicînd direct un operator adecvat, fie rezolvînd mai întîi subproblemele ridicate de îndeplinirea preconditiilor operatorului adecvat si executînd apoi actiunea asociată lui.

Procesul de analiză bazată pe modalităti poate fi aplicat împreună cu criterii euristice care fac ca strategia să se concentreze mai întîi pe eliminarea diferentelor mai importante dintre starea scop si starea curentă. Pentru aceasta se pot asocia nivele de prioritate diferentelor, diferentele cu prioritate mai mare fiind considerate pentru a fi eliminate mai întîi.

Asa cum s-a aratat, operatorii de eliminare a diferentelor sînt operatori de transformare a unei stări într-o altă stare si includ preconditiile pe care trebuie să le satisfacă o stare pentru ca un operator să fie aplicabil în acea stare. O dezvoltare ulterioară a sistemelor de planificare a abandonat ideea reprezentării integrale a stării, formulînd operatorii de eliminare a diferentelor sub forma unor reguli în care partea stîngă specifică preconditiile operatorului, iar partea dreaptă indică efectul aplicării operatorului asupra stării curente numai în termenii modificării acesteia. Această dezvoltare va fi prezentată în Sectiunea 6.3. Motivele acestei evolutii în reprezentarea operatorilor au fost prezentate la începutul acestui capitol.

Sistemul GPS foloseste o structură de date suplimentară, numită tabela de diferente, pentru a indexa operatorii după diferentele care pot fi reduse prin aplicarea lor. Se consideră în continuare exemplul robotului Robo care foloseste analiza bazată pe modalităti pentru a dezvolta un plan de călătorie între localitătile Paris si Bucuresti. Există mai multe posibilităti de a călători între cele două orase si Robo trebuie să selecteze o posibilitate. Operatorii pe care Robo îi are la dispozitie sînt: , , , si , cu preconditiile si efectele specificate în continuare.

Operator Preconditii Efect

Tabela de diferente asociată problemei este prezentată în Figura 6.1.

Figura 6.1 Tabela de diferente pentru problema planului de călătorie

Pentru a ajunge de la Paris la Bucuresti, distanta initială este mai mare de 2000 km, deci operatorul selectat este foloseste_avion. Pentru a folosi avionul, Robo trebuie să fie la avion. Distanta dintre Robo si Orly, presupunînd că Robo se află în centrul Parisului, este între 1-100 km, deci Robo la avion este un subscop ce poate fi atins dacă se aplică operatorul de reducere a distantei foloseste_taxi. Pentru a folosi taxiul, Robo trebuie să fie la taxi, si cum cea mai apropiată statie de taxiuri este la o distantă mai mică de 1 km, Robo poate merge. Acest subscop nu necesită nici o conditie initială, deci acest subscop poate fi realizat imediat. Acelasi rationament se poate aplica si în cazul ajungerii la Otopeni, deci pentru starea rezultată prin aplicarea operatorului selectat initial, si pentru a reduce diferentele si a ajunge în centrul Bucurestiului. Procesul descris poate fi reprezentat, în linii generale, de următorul algoritm:

Algoritm: Analiză bazată pe modalităti

MEA

1. dacă

atunci

1.1.

1.2. întoarce SUCCES

2. Selectează cea mai importantă diferentă D între Stare si Scop

3.

4. repetă

4.1. dacă nu mai există nici un operator neaplicat diferentei D

atunci

4.2. altfel

4.2.1. Selectează un operator potrivit O pentru a reduce diferenta D

4.2.2. Generează descrierile a două stări O_START si O_REZULTAT

4.2.3. dacă MEA si

MEA

atunci

i.

ii. repetă de la 1

pînă

5. întoarce INSUCCES

sfîrsit.

Observatii:

O-START este o stare în care preconditiile operatorului O sînt satisfăcute, iar O-REZULTAT este starea care rezultă din aplicarea operatorului O stării O-START.

Ordinea de selectie a diferentelor poate afecta drastic performantele rezolvării problemei. Dacă diferentele semnificative nu sînt selectate înaintea celor nesemnificative, se poate investi un efort considerabil pentru realizarea unor subscopuri care s-ar fi realizat deja prin atingerea scopului principal.

Acest mod de abordare a problemelor nu este potrivit pentru rezolvarea problemelor complexe deoarece, pe de o parte, eliminarea unei diferente poate influenta planul stabilit pentru eliminarea altei diferente si, pe de altă parte, tabela de diferente poate avea dimensiuni considerabile în cazul aplicatiilor complexe.

6.3 Planificare liniară în sistemul STRIPS

Sistemul GPS, desi abandonat de multe vreme, a avut un rol important în dezvoltarea ulterioară a sistemelor de planificare automată. Unul dintre sistemele care a evoluat din sistemul GPS, sistemul STRIPS (STanford Research Institute Problem Solver) [Fikes,Nilsson,1971] încearcă să rezolve o parte din limitările existente în GPS.

6.3.1 Functionarea sistemului STRIPS

Reprezentarea actiunilor si construirea planului în sistemul STRIPS [Fikes,Nilsson,1971] pleacă de la presupunerea că domeniul problemei de rezolvat nu se schimbă semnificativ prin executarea unei actiuni. Din acest motiv, în sistemul STRIPS se reprezintă un model unic al universului problemei, care este permanent actualizat pentru a reflecta rezultatul actiunilor executate. Starea curentă a universului problemei este descrisă printr-o multime de formule bine formate în logica cu predicate de ordinul I. În plus se pot indica axiome specifice domeniului. Actiunile sînt descrise în sistem prin operatori de plan care nu mai specifică integral starea curentă în care un operator poate fi aplicat, si starea rezultată prin aplicarea operatorului. Descrierea unei actiuni se face specificînd conditiile în care această actiune poate fi efectuată si schimbările survenite în starea problemei ca urmare a executării actiunii. Schimbările generate de efectuarea actiunii pot fi văzute ca fiind formate din două multimi: o multime de formule ce descriu noua stare a problemei, formule care devin adevărate în urma executării actiunii, si o multime de formule care devin false în urma executării actiunii. În consecintă, fiecare operator este definit de următoarele elemente:

Actiune care reprezintă actiunea asociată operatorului.

Lista Preconditiilor ce contine formulele care trebuie să fie adevărate într-o stare a problemei pentru ca operatorul să poată fi aplicat, notată în continuare cu LP.

Lista Adăugărilor ce contine formulele care vor deveni adevărate după aplicarea operatorului, notată în continuare cu LA.

Lista Eliminărilor ce contine formulele care vor deveni false după aplicarea operatorului, notată în continuare cu LE.

Se observă că sistemul STRIPS a preluat de la predecesorul sau ideea de a atasa unei actiuni o multime de preconditii. Acest fapt a fost posibil datorită păstrării analizei bazate pe modalităti ca strategie de rezolvare a problemelor. Dar, în loc de a reprezenta rezultatul actiunii prin descrierea integrală a noii stări, sistemul STRIPS reprezintă numai modificările aduse de actiune stării curente. Acest lucru permite, pe de o parte, simplificarea descrierii si, pe de altă parte, rezolvarea problemei cadrului. Orice predicat (element al stării curente) care nu apare explicit în Lista Adăugărilor sau în Lista Eliminărilor unei actiuni, este automat considerat ca fiind nemodificat de executarea acelei actiuni.

Se consideră următorul exemplu în lumea blocurilor, considerat un exemplu clasic în inteligenta artificială. Există o suprafată plană, numită masă, pe care pot fi plasate cuburi si un număr de astfel de cuburi, de aceeasi dimensiune, asezate pe masă. Problema cere să se genereze un plan de transformare a unei configuratii initiale date într-o configuratie finală, stiind că există următoarele conditii:

(1) cuburile pot fi asezate unul peste celalalt cu ajutorul bratului unui robot care este folosit pentru a muta cuburile;

(2) bratul robotului nu poate tine decît un singur bloc la un moment dat.

Actiunile care pot fi executate de bratul robotului sînt:

reprezintă actiunea de apucare a blocului A aflat deasupra blocului B. Pentru a executa actiunea, bratul robotului trebuie să fie liber si deasupra blocului A nu trebuie să se afle alte blocuri.

reprezintă actiunea de plasare a blocului A deasupra blocului B. Pentru a executa actiunea, bratul robotului trebuie deja să tină blocul A iar deasupra blocului B nu trebuie să se afle alte blocuri.

reprezintă actiunea de apucare a blocului A asezat pe masă. Pentru a executa actiunea, bratul robotului trebuie să fie liber, blocul A trebuie să fie asezat pe masă si deasupra blocului A nu trebuie să se găsească alte blocuri.

reprezintă actiunea de asezare a blocului A pe masă. Pentru a executa actiunea, bratul robotului trebuie să tină blocul A.

Pentru a specifica conditiile în care un operator se poate executa cît si rezultatul executării acestei actiuni, se definesc următoarele predicate:

este adevărat dacă blocul A se află peste blocul B.

este adevărat dacă blocul A este asezat pe masă.

este adevărat dacă nu există nici un bloc asezat deasupra blocului A.

este adevărat dacă bratul robotului tine blocul A.

ARMEMPTY este adevărat dacă bratul robotului este liber.

În plus, se specifică axiomele domeniului, deci asertiuni logice adevărate în această lume a blocurilor, cum ar fi:

Cititorul este îndemnat să indice o exprimare în limbaj natural a acestor asertiuni. Axiomele domeniului, care nu se modifică prin executarea actiunilor, sînt indicate de proiectant.

Pentru exemplul prezentat, lista operatorilor din sistemul STRIPS este următoarea:

LP:

LE: CLEAR(y)HOLD(x)

LA: ON(x,y)ARMEMPTY

LP:

LE:

LA:

PICKUP(x) LP:

LE:

LA:

PUTDOWN (x) LP:

LE:

LA:

Se observă că, pentru actiuni simple, Lista Preconditiilor este de multe ori identică cu Lista Eliminărilor, însă preconditiile nu sînt eliminate întotdeauna. De exemplu, pentru ca bratul robotului să tină un bloc (), blocul nu trebuie să aibă un alt bloc deasupra lui. După ce bratul robotului apucă blocul, acesta continuă să nu aibă nici un alt bloc deasupra lui.

În Figura 6.2 se prezintă schematic, pentru o instantă a problemei specificată anterior, tranzitia din starea initială Si în starea finală Sf, prin starea intermediară S în care blocul B este liber si se află pe masă, iar blocul A este tinut de bratul robotului. În figură sînt reprezentate si descrierile celor trei stări si actiunile efectuate pentru a trece dintr-o stare în alta.

ARMEMPTY

Figura 6.2 Reprezentarea stărilor si actiunilor în lumea blocurilor

Sinteza planului în sistemul STRIPS se face în următorul mod: se consideră descrierea stării finale, se inspectează asertiunile din starea finală care nu există în starea initială si se selectează operatorii (actiunile) ale căror Liste de Adăugări contin asertiunile de interes din starea finală. Pentru a putea aplica un astfel de operator, formulele din Lista Preconditiilor operatorului trebuie să fie adevărate în starea curentă. Sistemul verifică validitatea preconditiilor cu ajutorul unui demonstrator de teoreme, utilizînd faptele din starea curentă si axiomele domeniului. Preconditiile care nu sînt îndeplinite devin, la rîndul lor, asertiuni care trebuie satisfăcute pentru a putea aplica operatorii. Dacă toate preconditiile sînt adevărate, operatorul poate fi aplicat. Înaintea aplicării operatorului, variabilele acestuia sînt instantiate, dacă este cazul, folosind substitutiile efectuate în timpul demonstrării preconditiilor operatorului. Aplicarea unui operator elimină din starea curentă formulele care identifică cu o formulă din Lista Eliminărilor si adaugă formulele din Lista Adăugărilor, obtinînd astfel o nouă stare. Procesul continuă în acest fel pînă la găsirea unei secvente de operatori care pot transforma descrierea stării initiale în descrierea stării finale. Această secventă de operatori (actiuni) constituie planul sintetizat de sistemul STRIPS.

Un astfel de proces de rezolvare a problemei implică, evident, un proces de căutare. Realizarea preconditiilor unei operatii stabileste lista de scopuri care trebuie îndeplinite iar un anumit scop poate fi îndeplinit în mai multe moduri. Deoarece pot exista căi de căutare care conduc la esec, apare necesitatea unei căutări cu reveniri. Revenirea la o stare anterioară, dintr-o stare curentă obtinută pe baza modificărilor din Lista Adăugărilor si Lista Eliminărilor, se face prin adăugarea la starea curentă a elementelor din Lista Eliminărilor si eliminarea din starea curentă a elementelor din Lista Adăugărilor. Pentru ca acest lucru să fie posibil, este necesar să se memoreze actiunea (operatorul) aplicată si obiectele asupra căreia s-a aplicat această actiune pentru fiecare stare obtinută pe parcursul căutării. În exemplul din Figura 6.2, pentru a reveni din starea finală Sf în starea initială Si, trebuie întîi eliminate efectele actiunii , apoi efectele actiunii . Cresterea eficientei procesului de revenire poate fi realizată prin adăugarea unui sistem de mentinere a consistentei datelor. Diverse versiuni de planificatoare care au evoluat din sistemul STRIPS au folosit această facilitate.

Utilizarea tehnicii prezentate poate pune mai multe probleme. Prima problemă este aceea a aparitiei unui ciclu în satisfacerea scopurilor. De exemplu, pentru satisfacerea scopului SC este necesară realizarea preconditiei SC , pentru satisfacerea scopului SC este necesară realizarea preconditiei SC , iar pentru realizarea scopului SC este necesară realizarea preconditiei SC . În termenii unui proces de căutare, această situatie este echivalentă cu generarea unui spatiu de căutare de tip graf, cu cicluri.

A doua problemă care poate apare este problema generată de interactiunea între scopuri. Dacă se doreste realizarea unei liste de scopuri si, după realizarea scopurilor S si S , la realizarea scopului S se produce invalidarea scopului S , sistemul nu va putea să satisfacă conjunctia de scopuri . În acest caz, se spune că există o interactiune a scopurilor S si S pe calea . Există diverse posibilităti de a trata această problemă. Fie, dacă este posibil, se reordonează scopurile astfel încît interactiunea să nu mai apară, fie se încearcă găsirea unei alte solutii în speranta că, pentru noile planuri, scopul S nu va mai fi invalidat, fie se încearcă satisfacerea scopului S , în conditiile în care se stie că scopurile S si S sînt satisfăcute. În anumite situatii, nici una din aceste variante nu este realizabilă. În plus, dacă programul functionează în timp real, un scop care a fost satisfăcut nu mai poate fi resatisfăcut sau, pentru alte cazuri, efectul actiunilor efectuate nu mai poate fi anulat. Un plan ce contine o actiune de tipul "dinamitează usa" nu mai poate fi modificat dacă usa a fost efectiv aruncată în aer. Alternativ, dacă într-o secventă de scopuri

S : Intră în casă.

S : Mentine integritatea usii.

scopul S poate fi satisfăcut alternativ prin satisfacerea fie a subscopului S , fie a lui S :

S : Descuie usa.

S : Dinamitează usa.

dacă subscopul S esuează si se execută subscopul S , atunci scopul S nu mai poate fi satisfăcut.

O solutie partială a problemelor enuntate a fost propusă în sistemul STRIPS prin utilizarea unei stive de scopuri si operatori. Această stivă poate fi asimilată cu lista de tip FRONTIERA folosită în tehnicile de căutare. Programul foloseste următoarele structuri de date:

lista operatorilor, fiecare operator avînd asociate cele trei liste: de preconditii, adăugări si eliminări;

descrierea stării curente a universului problemei;

stiva de scopuri si operatori propusi pentru satisfacerea acestor scopuri;

lista scopurilor nesatisfăcute pe calea curentă.

Se consideră din nou exemplul lumii blocurilor si următoarea instantă a problemei de planificare în această lume: se cere găsirea unui plan de actiuni pentru a ajunge din starea initială Si în starea finală Sf, descrierile acestor stări fiind indicate în Figura 6.3, iar operatorii posibili fiind cei specificati anterior.

ARMEMPTY

Figura 6.3 O problemă de planificare în lumea blocurilor

În continuare, se va utiliza prescurtarea OTAD pentru conjunctia de scopuri ONTABLE(A)ONTABLE(D), deoarece aceste scopuri ale stării finale sînt deja îndeplinite în starea initială. În functie de ordinea de satisfacere a scopurilor, din starea initială se pot crea două stive de scopuri:

Stiva 1 Stiva 2

Se presupune că se începe cu investigarea alternativei Stiva 1 (alternativa Stiva 2 va găsi mai repede solutia, dar nu pune în evidentă problemele mentionate anterior). Sistemul STRIPS va executa pasii următori.

1. Se încearcă satisfacerea scopului . Operatorul potrivit este . Acest operator înlocuieste scopul în stivă, deoarece dacă se aplică acest operator, rezultatul lui va fi sigur , deci satisfacerea scopului dorit. Continutul stivei devine:

/* pentru realizarea scopului */

2. Pentru a putea aplica operatorul trebuie îndeplinite preconditiile lui, acestea devenind la rîndul lor scopuri si întroducîndu-se în stivă:

/* preconditiile operatorului */

Ordinea de introducere a scopurilor în stivă este importantă. Se pot aplica diverse euristici pentru a ordona aceste scopuri. În cazul de fată, a fost aplicată euristica conform căreia, pentru a putea executa alte actiuni, robotul trebuie să aibă bratul liber, deci este bine ca scopul să fie lăsat ultimul.

3. Se verifică scopul . Acest scop nu este satisfăcut în starea Si datorită axiomei

Se încearcă satisfacerea scopului prin aplicarea operatorului , care va înlocui scopul în stivă. Stiva rezultată este:

ARMEMPTY

4. Scopul este satisfăcut de starea initială si se elimină din stivă. La fel scopurile si ARMEMPTY. Se face reverificarea preconditiilor pentru operatia , pentru a evita situatia în care satisfacerea unui scop ar fi invalidat un alt scop. Conjunctia de scopuri este satisfăcută, deci se elimină din stivă. În aceste conditii se poate aplica operatorul si se modifică starea curentă Si, obtinîndu-se noua stare S si planul indicat în continuare.

Stiva devine:

Pentru a putea realiza , se pot aplica doi operatori: si , deci există două ramuri alternative ale arborelui de căutare. Dacă s-ar urmări alternativa atunci rezultatul ar fi:

ARMEMPTY

/* satisface */

Se observă că apare o satisfacere circulară a scopurilor, în acest caz a scopului , deci această cale trebuie abandonată.

6. Se alege deci prima alternativă, iar stiva devine:

ARMEMPTY

/* satisface */

.

7. În starea S , scopurile si sînt adevărate dar ARMEMPTY nu este adevărat datorită axiomei

Pentru a satisface scopul ARMEMPTY, există doi operatori posibili: si . Aplicînd o euristică de alegere, de exemplu euristica distantei fată de scopul initial, se va alege . Se pot alege si alte instantieri pentru x si y, dar preconditia a scopului este satisfăcută numai pentru , iar instanta este cea mai aproape de scopul initial. Stiva devine:

Preconditiile operatorului sînt îndeplinite în starea S , deci operatorul poate fi aplicat si se face tranzitia în starea S .

Procesul continuă si se descoperă starea finală S si planul care conduce în această stare:

Ce se întîmplă însă în cazul în care se aplică această metodă pentru rezolvarea următoarei probleme, cunoscută si sub numele de "anomalia lui Sussman" [Sussman,1975]. Fie o altă instantă a problemei de planificare în lumea blocurilor, descrisă anterior, în care starea initială si starea finală sînt cele prezentate în Figura 6.4.

ARMEMPTY

Figura 6.4 Anomalia lui Sussman

Se consideră în continuare functionarea sistemului STRIPS pentru această problemă. Considerarea scopurilor de satisfăcut pentru ajungerea în starea finală poate genera următoarele două stive:

Stiva 1 Stiva 2

Pornind cu ordonarea scopurilor din Stiva 1, se generează secventa de operatori care determină tranzitia din starea initială Si în starea Sk:

În starea Sk, scopul este realizat, scopul este eliminat din stivă si se trece la îndeplinirea scopului . Pentru satisfacerea acestui scop, trebuie ca blocul A să fie mutat pe masă, pentru a putea realiza mutarea blocului B peste blocul C. În momentul în care s-a realizat scopul , s-au mai aplicat în plus operatorii care au determinat tranzitia din starea Sk în starea St:

Deoarece scopul este satisfăcut în starea St, se elimină acest scop din stivă; în stivă rămîne conjunctia de scopuri care nu este satisfăcută, desi scopul fusese initial satisfăcut. Scopul a fost invalidat datorită realizării scopului . Diferenta între starea curentă si starea scop este acum . Acest scop este adăugat în stivă si satisfăcut, prin aplicarea a încă doi operatori, care determină tranzitia din starea St în starea Sf:

În acest moment, scopul compus este din nou verificat, si de această dată este satisfăcut. Planul complet care a fost sintetizat este:

Desi acest plan va realiza scopul propus, el nu este deosebit de eficient. O situatie similară apare si în cazul în care se porneste din varianta Stiva 2. Metoda utilizată în sistemul STRIPS nu este capabilă să găsească o solutie eficientă pentru această problemă. Dificultatea este generată de faptul că nu există nici o combinatie de planuri care, rezolvînd separat cele două subscopuri, să rezolve si conjunctia celor două subscopuri.

Pentru a genera un plan eficient există două abordări posibile. Prima abordare este aceea de a prelua planul existent si de a-l îmbunătăti, de exemplu prin eliminarea operatiilor care execută o actiune pentru ca apoi să o anuleze imediat. Pornind de la acest criteriu se pot elimina operatorii 4 si 5 ai planului, apoi, aplicînd acelasi criteriu pe planul rezultat, se elimină operatorii 3 si 6. Deci planul îmbunătătit va fi format numai din operatorii 1, 2, 7, 8, 9, 10. Această abordare poate fi deosebit de dificilă pentru probleme complexe, în care operatorii care interferează sînt separati prin secvente lungi de operatori. În plus, în procesul de construire a planului s-a pierdut deja o mare parte de timp pentru descoperirea acestor operatori nenecesari, si care au fost ulterior eliminati.

O altă posibilitate este utilizarea unei metode de planificare neliniară. Metoda prezentată în această sectiune este o metodă de planificare liniară, în care programul încearcă satisfacerea scopurilor la rînd, unul după altul, deci liniar. Pentru eliminarea anomaliei lui Sussman este necesar ca programul să ia în considerare, simultan, mai multe scopuri care interactionează, deci să execute o planificare neliniară. O astfel de abordare se va prezenta în Sectiunea 6.4.

6.3.2 Solutii de implementare

În această sectiune se prezintă un algoritm de functionare a sistemului STRIPS, împreună cu implementarea sa în limbajul Lisp. Algoritmul utilizează următoarele structuri de date:

Variabila S care memorează descrierea stării curente a universului problemei;

Stiva care memorează stiva de scopuri satisfăcute pe calea curentă de căutare;

Scopuri care păstrează lista scopurilor nesatisfăcute pe calea curentă;

Structura Operator avînd cîmpurile Actiune, Preconditii, ListaAdăugări si ListaEliminări.

Algoritm: Planificare liniară în STRIPS

SatisfacereScopuri (Scopuri, S, Stiva)

1. pentru fiecare execută

1.1.

1.2. dacă

atunci întoarce INSUCCES

2. dacă toate scopurile din Scopuri sînt satisfăcute în starea StareNouă

atunci întoarce StareNouă

3. altfel întoarce INSUCCES

sfîrsit.

RealizeazăScop (Scop S, Stiva)

1. dacă Scop este marcat satisfăcut în starea S

atunci întoarce S

2. dacă

atunci întoarce INSUCCES

3.

4. pentru fiecare operator execută

4.1.

4.2. dacă

atunci

4.2.1. Marchează scopul Scop satisfăcut în starea S

4.2.2. întoarce StareNoua

5. întoarce INSUCCES

sfîrsit.

AplicăOperator (Operator, Stare, Stiva)

1.

2. dacă

atunci

2.1. execută

2.2.

2.3. întoarce

3. altfel întoarce INSUCCES

sfîrsit.

Observatii:

În algoritm, referirea cîmpurilor structurii unui operator se face cu ajutorul operatorului ..

În pasul 3 al subprogramului RealizeazăScop operatorii din multimea OperatoriValizi sînt acei operatori care pot satisface scopul Scop, deci care contin Scop în cimpul ListaAdăugări.

Implementarea în limbajul Lisp a algoritmului prezentat anterior este descrisă în continuare. Variabila specială *OPERATORI* memorează operatorii de rezolvare a problemei, fiecare operator fiind o structură Lisp avînd cîmpurile actiune, preconditii, lista-adaugari si lista-eliminari. Actiunea fiecărui operator este reprezentată de o listă cu două elemente, primul dintre acestea fiind atomul Lisp EXECUTA, al doilea fiind actiunea asociată operatorului. Valoarea variabilei *OPERATORI* este stabilită prin apelul functiei utilizeaza cu parametrul lista de operatori specifici unei anumite probleme. Functia satisfacere-scopuri satisface fiecare scop din lista de scopuri primită ca parametru, asigurîndu-se că după satisfacerea tuturor scopurilor acestea sînt în continuare satisfăcute. Functia realizeaza-scop este cea care satisface un scop într-o stare a problemei. O stare S a problemei este reprezentată printr-o listă formată din atomi Lisp, atomi ai căror nume descriu în limbaj natural trăsăturile stării S, si actiunile operatorilor executati pînă la ajungerea în starea S. Un scop este reprezentat printr-un atom Lisp si este satisfăcut într-o stare a problemei dacă el se află inclus în starea problemei sau dacă există un operator potrivit prin aplicarea căruia scopul este inclus în starea problemei, i.e. scopul se află inclus în lista de adăugări a operatorului. Functia aplica-operator întoarce o nouă stare a problemei dacă operatorul primit ca parametru este aplicabil, i.e. toate preconditiile sale sînt satisfăcute. Noua stare a problemei este obtinută din precedenta stare modificată în conformitate cu lista de eliminări si lista de adăugări ale operatorului în care se adaugă actiunea operatorului. Predicatul potrivit-p verifică dacă un operator este potrivit pentru satisfacerea unui scop, verificînd dacă scopul se află în lista de adăugări a operatorului. Functiile extrage, sterge si subsetp sînt functii auxiliare si se regăsesc în majoritatea implementărilor limbajului Lisp. Functia extrage primeste ca parametri un element, o secventă si o functie de test si întoarce lista elementelor din secventă care sînt similare elementului, potrivit testului efectuat cu functia de test, fără a altera secventa. Functia sterge primeste ca parametri o functie de test si o listă si întoarce lista din care au fost îndepărtate toate elementele pentru care rezultatul testului efectuat cu functia de test a fost adevărat. Predicatul subsetp primeste două secvente si verifică dacă elementele primului parametru se regăsesc, în totalitate, printre elementele celui de-al doilea parametru.

(defvar *OPERATORI* nil

(defstruct operator

(actiune nil) (preconditii nil) (lista-adaugari nil) (lista-eliminari nil))

(defun strips (stare scopuri &optional (*OPERATORI* *OPERATORI*))

(sterge #'atom (satisfacere-scopuri (cons '(START) stare) scopuri nil)))

(defun satisfacere-scopuri (stare scopuri stiva-scopuri)

(let ((stare-curenta stare))

(when

(and (every #'(lambda (scop)

(setf stare-curenta (realizeaza-scop stare-curenta scop stiva-scopuri)))

scopuri)

(subsetp scopuri stare-curenta :test #'equal))

stare-curenta)))

(defun realizeaza-scop (stare scop stiva-scopuri)

(cond ((member scop stare :test #'equal) stare)

((member scop stiva-scopuri :test #'equal) nil)

(t (some #'(lambda (operator)

(aplica-operator stare scop operator stiva-scopuri))

(extrage scop *OPERATORI* #'potrivit-p)))))

(defun aplica-operator (stare scop operator stiva-scopuri)

(let ((stare2 (satisfacere-scopuri stare

(operator-preconditii operator)

(cons scop stiva-scopuri))))

(when stare2

(append (sterge #'(lambda (x)

(member x (operator-lista-eliminari operator) :test #'equal))

stare2)

(list (operator-actiune operator))

(operator-lista-adaugari operator)))))

(defun potrivit-p (scop operator)

(member scop (operator-lista-adaugari operator) :test #'equal))

(defun utilizeaza (lista-operatori)

(length (setf *OPERATORI* lista-operatori)))

(defun extrage (element secventa functie-test)

(delete nil (mapcar #'(lambda (i) (when (funcall functie-test element) i)) secventa)))

(defun sterge (functie-test lista)

(delete nil (mapcar #'(lambda (elem) (unless (funcall functie-test elem) elem)) lista)))

(defun subsetp (subset set &rest args)

(every #'(lambda (element) (apply #'member element set args)) subset))

În continuare vor fi prezentati operatorii de rezolvare a unei probleme clasice, problema maimutei si a bananei, prezentată în Sectiunea 5.5.1, cu următoarea ipoteză simplificatoare: în cameră există un singur cub si o singură banană. Pozitia maimutei în interiorul camerei este specificată prin atomii Lisp la-usa, sub-banana, pe-podea, pe-cub, linga-banana si in-camera. Pozitia cubului în interiorul camerei este specificată prin atomii cub-la-usa si cub-sub-banana, iar starea maimutei este descrisă prin atomii are-minge, are-banana, miini-libere, maimuta-flaminda si maimuta-satula. Starea problemei la un moment dat este definită prin pozitia maimutei, pozitia cubului si starea maimutei. Actiunile pe care maimuta le poate realiza sînt: urca-pe-cub, impinge-cub-de-la-usa-sub-banana, merge-la-usa, merge-de-la-usa-sub-banana, apuca-banana, arunca-minge si maninca-banana.

(defparameter *operatori-maimuta*

`(,(make-operator

:actiune '(executa urca-pe-cub)

:preconditii '(cub-sub-banana sub-banana pe-podea)

:lista-adaugari '(linga-banana pe-cub)

:lista-eliminari '(sub-banana pe-podea))

,(make-operator

:actiune '(executa impinge-cub-de-la-usa-sub-banana)

:preconditii '(cub-la-usa la-usa)

:lista-adaugari '(cub-sub-banana sub-banana)

:lista-eliminari '(cub-la-usa la-usa))

,(make-operator

:actiune '(executa merge-la-usa)

:preconditii '(in-camera pe-podea)

:lista-adaugari '(la-usa)

:lista-eliminari nil)

,(make-operator

:actiune '(executa merge-de-la-usa-sub-banana)

:preconditii '(la-usa pe-podea)

:lista-adaugari '(sub-banana)

:lista-eliminari '(la-usa))

,(make-operator

:actiune '(executa apuca-banana)

:preconditii '(la-banana miini-libere)

:lista-adaugari '(are-banana)

:lista-eliminari '(miini-libere))

,(make-operator

:actiune '(executa arunca-minge)

:preconditii '(are-minge)

:lista-adaugari '(miini-libere)

:lista-eliminari '(are-minge))

,(make-operator

:actiune '(executa maninca-banana)

:preconditii '(are-banana)

:lista-adaugari '(miini-libere maimuta-satula)

:lista-eliminari '(are-banana maimuta-flaminda))))

Stabilirea contextului si rezolvarea problemei particulare se realizează prin apelurile:

(utilizeaza *operatori-maimuta*)

(strips '(in-camera pe-podea are-minge maimuta-flaminda cub-la-usa)

'(maimuta-satula))

6.4 Planificare neliniară în sistemul TWEAK

Exemplul lui Sussman prezentat în sectiunea anterioară a pus în evidentă faptul că satisfacerea conjunctiilor de scopuri care interactionează poate crea dificultăti în sinteza planului. Pentru anumite probleme, nu se poate garanta existenta unei ordonări conjunctiei de scopuri, în care planurile pentru realizarea unor scopuri să nu interfereze cu planurile pentru realizarea celorlalte scopuri. Un plan eficient pentru rezolvarea problemei din exemplul lui Sussman ar putea fi următorul:

(1) Începe lucrul pentru satisfacerea scopului prin eliberarea blocului A si asezarea blocului C pe masă.

(2) Realizează scopul prin asezarea blocului B peste blocul C.

(3) Realizează restul operatiilor pentru satisfacerea scopului prin asezarea blocului A peste blocul B.

Un astfel de plan nu poate fi sintetizat printr-o metodă de planificare liniară, cum ar fi cea utilizată în sistemul STRIPS. În schimb, el poate fi realizat printr-o metodă de planificare neliniară. Primul sistem de planificare neliniară a fost sistemul NOAH [Sacerdoti,1974]. Ideea importantă a acestui sistem este aceea că un plan, în timp ce este construit, nu trebuie să specifice complet ordinea de executare a operatiilor. Cu alte cuvinte, un plan specifică numai o ordine partială a operatiilor lui, cel putin pînă în momentul în care planul este complet.

Sistemul de planificare neliniară TWEAK [Chapman, 1987], este un sistem de planificare independent de domeniu care foloseste ca tehnică centrală a planificării neliniare, înregistrarea restrictiilor. Utilizarea restrictiilor în rezolvarea problemelor de planificare a fost introdusă pentru prima oară de sistemul MOLGEN [Stefik,1981a,b].

Înregistrarea restrictiilor este procesul de definire a unui obiect, un plan în acest caz, prin specificarea incrementală a descrierilor partiale (restrictiilor) pe care obiectul trebuie să le satisfacă. Alternativ, înregistrarea restrictiilor poate fi văzută ca o strategie de căutare în care se elimină succesiv portiuni din spatiul de căutare prin adăugarea unor restrictii. Restrictiile exclud stări si căi de căutare din acest spatiu, pînă ce, în final, toate alternativele rămase sînt satisfăcătoare. Avantajul tehnicii de înregistrare a restrictiilor constă în faptul că proprietătile obiectului căutat, i.e. ale planului, nu trebuie alese pînă în momentul în care nu există un motiv pentru alegerea acestora. Această reducere a selectiilor arbitrare determină de multe ori o reducere a numărului de reveniri necesare în procesul de căutare. Înregistrarea restrictiilor utilizată în sistemul TWEAK este o paradigmă a strategiei deciziilor amînate de rezolvare a problemelor.

Sistemul TWEAK este primul sistem de planificare automată care prezintă o definire formală a planului si a corectitudinii unui plan. Autorul sistemului construieste o formalizare matematică a principiilor planificării neliniare. În acelasi timp, sistemul este implementat într-o variantă functională. Din punct de vedere conceptual, sistemul TWEAK este construit din trei nivele:

nivelul de reprezentare a planului;

nivelul de modificare a planului pentru a obtine un plan care realizează scopul problemei;

structura de control generală.

În continuare se vor prezenta elementele constructive si functionarea sistemului TWEAK, iar în final se vor descrie aspectele de bază ale formalizării planificării neliniare si limitările sistemului.

6.4.1 Reprezentarea planului

Un plan dezvoltat de sistemul TWEAK este alcătuit dintr-o secventă de pasi de plan (operatori, actiuni). Un pas de plan este reprezentat prin actiunea care trebuie executată, o multime finită de preconditii (echivalentă cu lista preconditiilor din sistemul STRIPS) si o multime finită de postconditii. Analog sistemului STRIPS, multimea efectelor unei actiuni, deci postconditiile, este alcătuită din Lista Adăugărilor si Lista Eliminărilor. Preconditiile reprezintă asertiuni despre starea curentă a problemei care trebuie să fie adevărate pentru ca actiunea să poată fi executată. Postconditiile reprezintă asertiunile validate si invalidate ca efect al executării pasului de plan. Preconditiile si postconditiile sînt exprimate prin formule atomice în logica cu predicate de ordinul I, negate sau nu, care acceptă ca argumente constante si variabile. Simbolurile functionale, operatorii si cuantificatorii sînt interzise în preconditii si postconditii. Postconditiile corespunzătoare asertiunilor validate de o actiune sînt reprezentate prin formule atomice nenegate, iar cele corespunzătoare asertiunilor invalidate de o actiune, prin formule negate. Se observă că puterea de reprezentare a sistemului TWEAK este echivalentă cu cea a sistemului STRIPS. În ambele cazuri, aceste restrictii restrîng capacitătile generale de modelare a universului problemei, asa cum se va discuta în Sectiunea 6.4.3.

Considerînd lumea blocurilor si operatorii de plan definiti în Sectiunea 6.3.1, o reprezentare a doi dintre acesti operatori este următoarea, reprezentarea celorlalti operatori obtinîndu-se analog.

Actiune:

Preconditii:

Postconditii:

Actiune: PICKUP(x)

Preconditii:

Postconditii:

În timpul activitătii de planificare, starea problemei este reprezentată printr-o multime de formule, considerate conjunctiv, de tipul celor descrise anterior. Pe măsură ce se execută pasi de plan, starea problemei se modifică. Reprezentarea este similară cu cea din sistemul STRIPS. Un plan are asociate o stare initială, i.e. starea problemei în momentul începerii executării planului, si o stare finală, i.e. starea problemei la terminarea executării planului. Asemănător, pentru fiecare pas al planului se definesc starea de intrare, respectiv starea de iesire, ca fiind multimile de formule adevărate la începerea, respectiv la terminarea executării pasului de plan. Chapman, autorul sistemului TWEAK, numeste stările din sistem situatii.

Sistemul TWEAK a preluat si îmbunătătit ideea sistemului NOAH de a dezvolta planuri în care ordinea de executare a operatorilor nu este specificată complet. Pe parcursul procesului de rezolvare a problemei, sistemul TWEAK dezvoltă un plan incomplet. Un plan incomplet este o descriere partială a unui plan capabil să rezolve problema propusă. Informal, în fiecare moment, sistemul TWEAK are la dispozitie o multime utilă de pasi de plan, dar nu are o idee clară asupra modului în care va trebui să ordoneze în final această multime de actiuni pentru a executa planul. În cele ce urmează, planurile vor fi reprezentate prin multimi de pasi de plan, considerînd deci că ordinea pasilor nu este stabilită, de exemplu

Planul partial poate fi completat, deci transformat într-un plan complet, în diferite moduri, prin adăugarea de restrictii în planul partial. Din această cauză, un plan incomplet reprezintă o clasă de planuri complete. Procesul de planificare constă, de fapt, în adăugarea de noi restrictii planurilor incomplete si se termină în momentul în care se obtine un plan (complet sau incomplet) care rezolvă problema propusă.

În sistemul TWEAK, planurile pot fi incomplete datorită:

specificării incomplete a ordinii (temporale) de executare a pasilor de plan, sau

specificării incomplete a pasilor de plan.

Generarea unui plan complet dintr-unul incomplet se poate face prin adăugarea a două tipuri de restrictii:

restrictii temporale care specifică ordinea de executare a pasilor de plan;

restrictii de codesemnare care specifică complet pasii planului.

O restrictie temporală este reprezentată de conditionarea executării unui pas de plan înaintea altui pas de plan. Din această cauză, o multime de restrictii temporale reprezintă o ordonare partială a pasilor unui plan. O completare a unei multimi de restrictii temporale R, referitoare la o multime de pasi de plan P, este orice ordonare totală T a multimii P astfel încît implică oricare ar fi p si p pasi de plan. Cu alte cuvinte, orice ordonare în planul incomplet rămîne valabilă si în planul complet.

Un plan complet reprezintă o ordonare totală a unei multimi finite de pasi de plan. Relatia de ordine este ordonarea temporală, iar pasii de plan sînt reprezentati de actiunile asociate lor. Realizarea planului corespunde executării actiunilor asociate pasilor planului în ordinea stabilită de plan.

Restrictia de codesemnare este o relatie de echivalentă între variabilele si constantele din formule. Într-un plan complet, toate variabilele care apar în preconditii si postconditii trebuie să codesemneze (i.e. să fie legate) cu o anumită constantă. În momentul executării actiunilor asociate pasilor de plan, constanta care codesemnează cu o variabilă care apare într-un pas de plan va substitui acea variabilă.

Restrictiile de codesemnare impun codesemnarea sau noncodesemnarea elementelor formulelor. Este evident că două constante diferite nu pot codesemna. Două formule codesemnează dacă ambele contin acelasi nume de preconditie sau postconditie (predicat), sînt în forma negată sau normală si elementele lor componente codesemnează. Codesemnarea formulelor este similară unificării formulelor atomice din logica cu predicate de ordinul I.

Adăugarea unei restrictii la un plan incomplet poate conduce la distrugerea tuturor extinderilor complete ale planului incomplet. În acest caz, multimea de restrictii este inconsistentă si nu mai reprezintă un plan incomplet valid, sistemul fiind obligat să execute un proces de revenire pentru a alege o altă restrictie pentru a fi adăugată planului incomplet.

6.4.2 Sinteza planului

Scopul sistemului TWEAK este acela de a construi un plan pentru o problemă dată. Planul sintetizat trebuie să contină actiunile prin care se ajunge din starea initială în starea finală, deci trebuie să valideze toate formulele din starea finală a problemei. Initial se porneste cu un plan vid, deci un plan care nu contine nici un pas. Pe măsură ce procesul de planificare avansează, se alege cîte un scop (formulă) care trebuie satisfăcut si se adaugă pasii de plan, incomplet specificati atît ca instantieri cît si ca ordine temporală, care formează un plan incomplet. Satisfacerea fiecărui scop determină rafinarea treptată a planului incomplet pe baza operatiilor de modificare a planului. Planul care rezolvă problema poate fi atît complet, cît si incomplet, caz în care orice instantă a planului incomplet poate produce solutia.

În sistemul TWEAK există cinci operatii de modificare a planului:

(1) adăugarea de pasi este operatia prin care se crează noi pasi care se adaugă la plan;

(2) promovarea este operatia de stabilire a unei ordonări (temporale) între doi pasi de plan;

(3) legarea simplă este operatia de atribuire de valori variabilelor pentru a valida preconditiile unui pas de plan;

(4) separarea este operatia de împiedicare a atribuirii anumitor valori unei variabile;

(5) eliminarea destructivitătii este operatia de introducere a unui pas S3 (un pas deja existent în plan sau un pas nou) între pasii S1 si S2, în scopul de a adăuga un fapt invalidat de pasul S1 si necesar în pasul S2.

Operatia de separare este contrariul operatiei de legare simplă si este folosită pentru a împiedica legarea a două variabile sau unificarea a două formule. Operatia de separare este folosită tot ca o modalitate de eliminare a destructivitătii. Pentru a ilustra acest fapt se presupune existenta planului P în care pasul C precede pasul C , si, în plus, pasul C ar putea invalida o preconditie a pasului C2. Se spune că "ar putea invalida" deoarece pasul C poate contine variabile. Separarea permite specificarea restrictiei prin care două formule nu trebuie să se instantieze în acelasi fel în planul final eliminînd astfel posibilitatea de invalidare a unor formule.

În continuare se va prezenta functionarea sistemului TWEAK pentru rezolvarea problemei anomaliei lui Sussman, cu starea initială si starea finală descrise în Figura 6.5 si cu operatorii (actiunile) descrisi în Sectiunea 6.3.1. În cele ce urmează, se presupune că sistemul este capabil să selecteze de fiecare dată pasii de plan ce conduc spre solutie. În realitate, sistemul va face un proces de căutare cu reveniri pentru a alege alternativa corectă de completare a planului. Se va discuta ulterior strategia de selectie utilizată.

ARMEMPTY

Figura 6.5 Anomalia lui Sussman

Se doreste realizarea stării scop . Procesul de planificare începe cu un plan vid. Conform principiului analizei bazată pe modalităti, pentru realizarea stării scop se aleg doi pasi de plan care contin în lista postconditiilor cîte unul din cele două scopuri, în forma directă. În continuare, fiecare operator este reprezentat cu lista preconditiilor indicată deasupra operatorului si lista postconditiilor dedesubt. Asertiunile invalidate sînt marcate cu simbolul ~ în fată. O preconditie nesatisfăcută în starea curentă este marcată cu simbolul *. Pentru satisfacerea celor două asertiuni din starea finală, se pot aplica pasii de plan indicati mai jos si planul se modifică prin adăugarea acestor doi pasi.

----- ----- -------- ----- ----- --------

----- ----- -------- ----- ----- --------

ARMEMPTY ARMEMPTY

Planul se modifică în continuare prin introducerea de noi operatori care să ducă la satisfacerea preconditiilor celor doi pasi de plan. Euristica de introducere a noilor pasi de plan pentru satisfacerea preconditiilor corespunde, de asemenea, operatiei de modificare a planului adăugare de pasi. Deoarece si sînt scopuri satisfăcute în starea initială, scopurile care trebuie satisfăcute, prin modificarea planului, sînt si . Următorii pasi sînt adăugati planului incomplet:

*ARMEMPTY *ARMEMPTY

----- ----- -------- ----- ----- ----

----- ----- -------- ----- ----- ----

~ARMEMPTY

În acest moment planul incomplet contine multimea neordonată de pasi:

Dacă un pas de plan PICKUP ar urma pasului STACK în planul final, scopurile si ar trebui satisfăcute în alt mod, si nu ar mai putea fi satisfăcute de pasul PICKUP. Această problemă se rezolvă prin introducerea unor restrictii temporale de ordonare a pasilor planului, de forma , si avînd semnificatia deja cunoscută: pasul de plan P trebuie să preceadă pasul de plan P în planul final. Restrictiile temporale sînt:

Euristica de ordonare a pasilor utilizată corespunde operatiei de modificare a planului promovare.

Acum, planul incomplet contine patru pasi partial ordonati si patru preconditii nesatisfăcute. Formula este nesatisfăcută deoarece blocul A nu este liber în starea initială. Formula este nesatisfăcută deoarece, desi blocul B este liber în starea initială, există pasul de plan , avînd postconditia , si acest pas s-ar putea să preceadă pasul de plan care are formula ca preconditie, deci pasul de plan . Pentru ca acest lucru să nu se întîmple, se introduce o altă restrictie de ordonare:

Rămîn în continuare nesatisfăcute scopurile ARMEMPTY (pentru ambii operatori PICKUP) si . Desi în starea initială preconditia ARMEMPTY este satisfăcută, fiecare operatie PICKUP are ca efect ~ARMEMPTY. Fiecare operatie PICKUP executată poate duce la imposibilitatea executării celeilalte operatii PICKUP. Se utilizează ordonarea pentru a realiza cel putin un pas PICKUP:

Deoarece în starea initială bratul robotului este liber si nici un pas de plan care precede pasul nu invalidează scopul ARMEMPTY, preconditiile pasului sînt satisfăcute. Pentru realizarea preconditiei ARMEMPTY a pasului se foloseste o a treia euristică corespunzatoare operatiei de modificare a planului eliminarea destructivitătii.

Pasul are ca efect infirmarea scopul ARMEMPTY, adică ~ARMEMPTY, dar dacă se poate introduce un alt pas de plan între pasii si , pas care va revalida scopul ARMEMPTY, afirmîndu-l, atunci preconditia pasului va fi satisfăcută. Acest lucru poate fi realizat cu ajutorul pasului care se restrictionează temporal astfel:

Se observă că s-a întîlnit o situatie în care pasul distruge preconditiile pasului , iar pasul elimină aceste distrugeri. În acest moment, singura preconditie care mai rămîne de îndeplinit este . Pentru satisfacerea acestei conditii se adaugă un nou pas de plan:

*ARMEMPTY

----- ----- ------------

----- ----- ------------

~ARMEMPTY

restrictiile temporale si planul devenind:

S-a introdus variabila x deorece singura postconditie care interesează este si nu contează care din blocuri este deasupra blocului A. Restrictiile de ordonare permit specificarea incompletă a planurilor din punct de vedere al ordinii pasilor, iar variabilele permit specificarea incompletă a planurilor prin instantierea partială a pasilor (operatorilor).

După introducerea pasului , există trei preconditii nesatisfăcute. Prima, , poate fi satisfăcută prin restrictia de instantiere a lui x la C, deci printr-o restrictie de codesemnare. Aceasta corespunde operatiei de modificare a planului numită legare simplă. În acest moment preconditiile devin , si ARMEMPTY. Preconditiile si ARMEMPTY pot fi invalidate de pasi din plan, dar acest lucru este împiedicat prin operatii de modificare a planului de tip promovare:

Dar pasul necesită îndeplinirea preconditiei ARMEMPTY care este invalidată de noul pas adăugat . Rezolvarea acestei probleme se realizează prin adăugarea unui nou pas de eliminare a destructivitătii:

----- ----- ---------

----- ----- ----------

ARMEMPTY

si a ordonării:

.

Deci s-au pus în evidentă două modalităti de eliminare a destructivitătii: una în care se foloseste un pas deja existent al planului, pasul , si alta în care este necesară introducerea unui nou pas, pasul . Din fericire, preconditiile pasului PUTDOWN sînt toate satisfăcute; preconditiile tuturor pasilor din plan sînt satisfăcute, deci se obtine planul complet:

1. UNSTACK (C,A)

2. PUTDOWN (C)

3. PICKUP (B)

4. STACK (B,C)

5. PICKUP (A)

6. STACK (A,B) }

Se observă că metoda de planificare neliniară din sistemul TWEAK a generat un plan eficient pentru rezolvarea problemei anomaliei lui Sussman, deci pentru o problemă în care satisfacerea subscopurilor interactionează.

6.4.3 Structura de control

Algoritmul de satisfacere a unui scop în sistemul TWEAK este următorul:

Algoritm: Planificare neliniară în TWEAK

1. Initializează

2. Initializează S cu multimea formulelor care definesc starea scop

3. cît timp execută

3.1. Alege si elimină o formulă F din S

3.2. dacă F nu este satisfăcută în starea curentă

atunci

3.2.1. Alege o operatie de modificare a planului

3.2.2. Aplică operatia si adaugă efectul ei în Plan

3.3. Verifică pentru toti pasii din Plan satisfacerea preconditiilor

3.4. pentru fiecare preconditie nesatisfăcută a unui pas din Plan execută

Adaugă preconditia la S

4. Generează ordinea totală a elmentelor din Plan pe baza relatiilor de ordine individuale

5. dacă planul Plan este partial

atunci

5.1. Instantiază variabilele planului

5.2. Transformă arbitrar ordinea partială în ordine totală

sfîrsit.

Algoritmul prezentat este evident nedeterminist. Caracterul nedeterminist este dat de pasii 3.1. si 3.2. Alegerea unui scop (formulă) ce trebuie satisfăcut în pasul 3.1. si alegerea unei operatii de modificare a planului implică un proces de căutare. De aceea, structura de control a sistemului TWEAK este o căutare în spatiul căilor generate de procedura de satisfacere a scopului. Strategia de căutare utilizată în TWEAK este căutarea în lătime cu utilizarea mecanismului de backtracking condus de dependente. La selectia operatiilor de modificare a planului se preferă adăugarea unei restrictii fată de adăugarea unui pas de plan. Acest lucru este justificat prin faptul că adăugarea de pasi conduce la generarea de noi preconditii, iar pasul adăugat poate distruge scopuri anterior îndeplinite. Din nefericire, aceste probleme sînt inevitabile si pot duce la cicluri infinite.

6.4.4 Modelul formal al planificării

În Sectiunea 6.4.1 s-a descris modalitatea de reprezentare a planului si restrictiile temporale si de codesemnare care pot fi utilizate pentru rafinarea planurilor incomplete. Plecînd de la aceste elemente, se prezintă în continuare modelul riguros al activitătii de planificare automată a sistemului TWEAK. Se reaminteste că stările problemei sînt numite situatii în acest sistem.

O formulă este adevărată într-o situatie dacă codesemnează cu o formulă care face parte din situatia respectivă. Deci formula F este adevărată în situatia S dacă există astfel încît F si G codesemnează. Un pas de plan afirmă o formulă în situatia sa de iesire dacă formula codesemnează cu o postconditie a pasului. Un pas de plan infirmă o formulă în situatia sa de iesire dacă afirmă negarea acelei formule.

Un pas de plan poate fi executat numai dacă toate preconditiile sale sînt adevărate în situatia sa de intrare. În acest caz, situatia de iesire a pasului de plan este situatia de intrare din care se sterg formulele infirmate de către pasul de plan si se adaugă formulele afirmate de pasul de plan. Ordinea de efectuare a operatiilor de stergere si adăugare este importantă.

Exemplu. Dacă formula R era adevărată în situatia de intrare a pasului de plan P si acesta afirmă formula ~R, atunci situatia de iesire a pasului P nu trebuie să contină nici formula R si nici formula ~R deoarece situatiile de intrare si de iesire ale pasilor trebuie să reprezinte multimi consistente de formule.

În timpul planificării, incompletitudinea planului introduce incertitudini cu privire la semnificatia planului. De exemplu, dacă x este variabilă, nu se poate spune dacă formula este adevărată sau falsă într-o anumită situatie, decît în cazul în care x codesemnează cu o constantă. Din acest motiv, se introduce un criteriu formal cu ajutorul căruia se poate decide dacă o formulă este necesar adevărată într-o anumită situatie: criteriul adevărului modal. Pentru a introduce criteriul adevărului modal este necesară prezentarea cîtorva notiuni pregătitoare.

O formulă F, i.e. o proprietate a stării curente, este necesar adevărată într-un plan incomplet dacă F este adevărată în toate planurile complete obtinute din planul incomplet. O formulă F este posibil adevărată dacă F este adevărată pentru cel putin un plan complet al planului incomplet.

Avînd în vedere definitiile date notiunilor de necesar si respectiv posibil, două formule dintr-un plan incomplet codesemnează necesar dacă codesemnează în toate completările planului, i.e. indiferent de restrictiile adăugate planului incomplet. Două formule care codesemnează posibil pot fi constrînse să codesemneze necesar prin adăugarea de restrictii care să conducă la codesemnarea elementelor componente. Două formule care nu codesemnează posibil pot fi constrînse să nu codesemneze necesar prin adăugarea unei restrictii de noncodesemnare a două elemente de acelasi rang din formule.

Exemplu. Formulele si pot fi constrînse să codesemneze necesar prin adăugarea restrictiei de codesemnare asupra variabilelor x si y. În acelasi mod, două formule pot fi constrînse să nu codesemneze necesar prin adăugarea restrictiei de noncodesemnare asupra variabilelor x si y.

Din cele arătate anterior se poate concluziona că o formulă este necesar adevărată într-o situatie S dacă este necesar afirmată în situatia S. Odată ce o formulă a fost afirmată într-o situatie, formula rămîne adevărată pînă la infirmarea sa.

Criteriul adevărului modal permite stabilirea caracterului de adevăr al unei formule din preconditiile sau postconditiile unui pas de plan, într-o situatie (stare) dată. Criteriul are două cazuri, corespunzătoare modalitătilor necesar si posibil: criteriul adevărului necesar si criteriul adevărului posibil.

Criteriul adevărului necesar

O formulă F este necesar adevărată într-o situatie S dacă si numai dacă se îndeplinesc următoarele două conditii:

(a) există o situatie T egală cu/sau necesar anterioară lui S în care F este necesar afirmată (adăugată);

(b) pentru fiecare pas C posibil de executat înaintea lui S si pentru fiecare formulă Q care poate codesemna cu F pe care C o infirmă, există un pas W necesar între C si S care afirmă R, R fiind o formulă pentru care R si F codesemnează ori de cîte ori F si Q codesemnează.

Criteriul adevărului posibil

O formulă F este posibil adevărată într-o situatie S dacă si numai dacă se îndeplinesc următoarele două conditii:

(a) există o situatie T egală cu/sau posibil anterioară lui S în care F este posibil afirmată (adăugată);

(b) pentru fiecare pas C necesar de executat înaintea lui S si pentru fiecare formulă Q care poate codesemna cu F pe care C o infirmă, există un pas W posibil între C si S care afirmă R, R fiind o formulă pentru care R si F codesemnează ori de cîte ori F si Q codesemnează.

Situatiile T, necesar anterioare situatiei S, care afirmă necesar formula F se numesc situatii de stabilire. Pasii C, posibil înaintea situatiei S, se numesc pasi de infirmare, iar pasii de tipul W care invalidează pasii ce altfel ar deveni pasi de distrugere se numesc pasi de eliminare a infirmării. Se observă introducerea cuantificării existentiale si universale a situatiilor si a pasilor de plan în criteriul adevărului modal.

Informal, criteriul adevărului modal spune că formula F este necesar adevărată dacă F a fost afirmată (adăugată) fie în situatia initială, fie de un pas anterior si că nu există nici un pas anterior destructiv pentru care să nu existe un pas de eliminare a destructivitătii. În Figura 6.6 se prezintă schematic ideea criteriului adevărului necesar. Liniile continue indică relatiile temporale necesare, iar liniile punctate relatiile temporale posibile. Pătratul format din linii punctate indică un pas de infirmare, iar pătratul format din puncte indică pasul care elimină consecintele pasului de infirmare.

Figura 6.6 Diagrama de reprezentare a criteriului adevărului necesar

Prin definitie, un scop în sistemul TWEAK este o formulă care trebuie să fie adevărată într-o anumită situatie. Sistemul urmăreste sinteza unui plan care rezolvă în mod necesar problema, deci îndeplineste scopul. În final, acest plan poate fi chiar incomplet, caz în care orice plan complet derivat poate fi ales pentru a fi executat. În concluzie, pentru o problemă definită printr-o situatie initială si o situatie finală, un plan are ca scopuri formulele din situatia finală a problemei, care trebuie să fie adevărate în situatia finală a planului, si preconditiile fiecărui pas al planului care trebuie să fie adevărate în situatiile de intrare ale respectivilor pasi.

Procesul de planificare constă în alegerea repetată a unui scop si dezvoltarea pasilor de plan necesari satisfacerii lui. Procedura de îndeplinire a unui scop în TWEAK este o procedură de interpretare nedeterministă a criteriului adevărului modal. Criteriul adevărului modal specifică toate metodele de obtinere a unei formule necesar adevărată într-un plan incomplet. Planificatorul va alege una din aceste metode si va modifica corespunzător planul prin adăugarea de restrictii temporale si de codesemnare. Deoarece multimea formulelor afirmate într-o situatie S nu poate fi schimbată, pentru a face o formulă F necesar adevărată în acea situatie, planificatorul va forta codesemnarea formulei F cu una din formulele afirmate în S. Există două modalităti de a instantia în mod nedeterminist o situatie cuantificată existential:

prin alegerea unei situatii existente în plan;

prin adăugarea unui nou pas de plan si stabilirea situatiei sale de iesire ca valoare a variabilei cuantificate existential.

Una din aceste două modalităti va fi aleasă în mod nedeterminist. Operatorii logici prezenti în criteriul adevărului modal sînt interpretati procedural în următorul mod:

cuantificatorul universal peste o multime este interpretat ca iteratie peste multimea respectivă;

cuantificatorul existential peste o multime este interpretat ca o alegere nedeterministă din multimea respectivă;

disjunctia este interpretată ca o alegere nedeterministă;

conjunctia este interpretată ca o multime de elemente care trebuie să fie toate adevărate.

Folosind notatiile si / pentru reprezentarea restrictiilor de codesemnare si, respectiv, noncodesemnare, < si pentru restrictiile temporale, si pentru reprezentarea criteriilor de necesar si respectiv posibil, criteriul adevărului modal se rescrie în următorul mod:

T T S este_afirmată(F,T)

S S C

Q ~este_afirmată(F,T)

Q / F

W C < W

W < S

R afirmă(W,R) F Q F R

Planificarea neliniară, bazîndu-se pe planuri incomplet specificate, ridică probleme din punct de vedere al stabilirii adevărului formulelor din preconditiile si postconditiile pasilor de plan. Modelul formal propus defineste aceste notiuni si permite demonstrarea corectitudinii planurilor sintetizate de sistemul TWEAK.

Relatia dintre cele cinci operatii de modificare a planului si criteriul adevărului modal este prezentată în Figura 6.6. În figură este reprezentat un arbore de derivare a criteriului pe baza căruia se vede cum se foloseste criteriul adevărului modal pentru a verifica dacă formula F este necesar adevărată în situatia S. reprezintă faptul că pasul (sau situatia) C precede în mod necesar pasul (sau situatia) C , iar reprezintă faptul că formulele F si Q codesemnează.

Figura 6.6 Relatia criteriului adevărului modal cu operatiile
de modificare a planului

Figura 6.6 ilustrează structura procedurii nedeterministe. În figură este reprezentat un arbore de derivare a criteriului adevărului modal modificat corespunzator interpretării procedurale a operatorilor logici. În figură simbolul OR are semnificatia "alege una din alternativele următoare", AND semnifică "execută toate alternativele următoare", are semnificatia "alege un/o", iar semnifică "aplică alternativa următoare tuturor". Nodurile frunză ale arborelui reprezintă restrictiile care trebuie adăugate planului. U reprezintă formulele necesar adevărate în situatia T, Q si R reprezintă postconditiile pasului C si, respectiv, W.

Adăugarea de pasi planului implică alegerea pasului de adăugat. Fiecare pas de plan trebuie să reprezinte o actiune posibilă în universul problemei. Pentru a îndeplini un scop F prin adăugarea unui pas de plan, pasul adăugat trebuie să afirme o formulă care codesemnează posibil cu F. În concluzie, operatia de modificare a planului adăugare de pasi se realizează prin alegerea unui pas care afirmă posibil scopul de satisfăcut din multimea pasilor posibili ai problemei.

Autorul sistemului TWEAK a demonstrat că cele cinci operatii de modificare a planului sînt suficiente pentru a rezolva orice problemă de planificare neliniară care admite solutie si care satisface conditiile impuse de sistem. Aceste conditii sînt:

nu sînt permise efecte laterale directe si indirecte ale pasilor de plan,

nu este permis ca efectul actiunilor să depindă de situatia în care acestea se aplică, si

toate efectele unei actiuni trebuie explicit reprezentate de postconditiile actiunii.

Această concluzie este exprimată de următoarea teoremă:

Teoremă. Corectitudinea/completitudinea sistemului TWEAK. Dacă pentru o problemă dată, programul TWEAK se termină si găseste solutii, atunci planul sintetizat rezolvă într-adevăr problema. Dacă programul TWEAK se opreste semnalînd insucces sau intră în buclă infinită, nu există solutie pentru acea problemă.

Se observă că cea de a treia conditie eludează problema ramificării. Conditiile impuse limitează sever puterea de reprezentare a universului problemei în sistemul TWEAK dar constituie suportul formalizării activitătii de planificare si a validitătii teoremei enuntate. În plus, autorul sistemului enuntă si demonstrează următoarea teoremă.

Teoremă. Orice masină Turing cu banda ei de intrare asociată poate fi codificată ca o problemă de planificare în reprezentarea sistemului TWEAK. În consecintă problemele de planificare neliniară sînt nedecidabile.

6.4 Exercitii si probleme

1. Se consideră problema dezvoltării un plan de călătorie între localitătile Paris si Bucuresti prezentată în Sectiunea 6.2. Să se exprime sub forma unei multimi de operatori STRIPS tabela de diferente din Figura 6.1.

2. Ce strategie de căutare foloseste implementarea sistemului STRIPS prezentată în Sectiunea 6.3.2. Justificati răspunsul.

3. Se consideră problema curăteniei într-o bucătărie. Trebuie curătate bufetele, frigiderul, chiuveta si pardoseala. Operatiile de curătare implică printre altele următoarele aspecte:

curătarea frigiderului murdăreste pardoseala

pentru a curăta pardoseala, aceasta trebuie mai întîi măturată si apoi spălată

înainte de a spăla pardoseala, gunoiul trebuie dus afară

curătarea frigiderului generează gunoi si murdăreste bufetele

spălatul bufetelor si al pardoselii murdăreste chiuveta

Se cere:

1. Să se proiecteze o multime de operatori cu ajutorul cărora sistemul STRIPS poate rezolva problema curăteniei într-o bucătărie. Să se scrie descrierea unei stări initiale în care totul este murdar în bucătărie si descrierea unei stări finale în care totul este curat.

2. Să se arate cum ar rezolva sistemul STRIPS această problemă.

4. Se consideră labirintul prezentat în Figura 6.8. Să se scrie o functie Lisp care generează operatorii STRIPS pentru găsirea unei căi între două puncte ale labirintului. Să se scrie o functie Lisp care găseste calea între două puncte ale labirintului.

Figura 6.8 Un exemplu de labirint

5. Să se scrie o functie Lisp care generează operatorii STRIPS de rezolvare a unei probleme de planificare în lumea blocurilor. Să se modifice programul prezentat în Sectiunea 6.3.2 pentru a putea rezolva o problemă de planificare în lumea blocurilor.

6. Să se proiecteze un algoritm de functionare a sistemului STRIPS care inspectează lista L a scopurilor rămase de satisfăcut la un moment dat, astfel încît sistemul să nu se blocheze dacă prin satisfacerea scopului curent cu operatorul O se elimină toate posibilitătile de satisfacere a unui scop din lista L. În caz de blocare algoritmul trebuie să considere un alt operator, dacă există, pentru satisfacerea scopului curent. Să se modifice programul prezentat în Sectiunea 6.3.2 pentru a implementa acest nou algoritm.

7. Să se proiecteze un algoritm de functionare a sistemului STRIPS care memorează atît scopurile rămase de satisfăcut pe calea curentă de căutare cît si scopurile care odată satisfăcute nu mai pot fi infirmate. Un scop este infirmat prin aplicarea unui operator care contine scopul în lista de eliminări. Să se modifice programul prezentat în Sectiunea 6.3.2 pentru a implementa algoritmul proiectat.

8. Utilizati functiile de unificare prezentate în Sectiunea 3.4.3 pentru a scrie o variantă a programului STRIPS care permite existenta variabilelor în structura operatorilor de rezolvare a problemei.

6.6 Rezolvări

4. Se consideră structura labirintului din Figura 6.9. Se defineste functia constructor-pereche care construieste perechea de operatori STRIPS pentru deplasarea între două pozitii adiacente. Functia constructor construieste operatorul de deplasare între două pozitii cu ajutorul constructorului standard al structurii operator. Cîmpurile preconditii, lista de adăugări si lista de eliminări ale operatorilor vor contine liste de forma (la <pozitie>) unde <pozitie> reprezintă o pozitie validă a labirintului, i.e. un număr cuprins între 1 si 25.

Figura 6.9 Structura unui labirint

(defun constructor-pereche (pereche)

(list (constructor (first pereche) (second pereche))

(constructor (second pereche) (first pereche))))

(defun constructor (de-la la)

(make-operator :actiune `(executa (muta de la ,de-la la ,la))

:preconditii `((la ,de-la))

:lista-adaugari `((la ,la))

:lista-eliminari `((la ,de-la))))

Operatorii de rezolvare a unei probleme de navigare în labirintul prezentat în Figura 6.8 se obtin prin apelul:

(defparameter *operatori-labirint*

(mappend #'constructor-pereche

'((1 2) (2 3) (3 4) (4 9) (9 14) (9 8) (8 7) (7 12) (12 13)

(12 11) (11 6) (11 16) (16 17) (17 22) (21 22) (22 23)

(23 18) (23 24) (24 19) (19 20) (20 15) (15 10) (10 5) (20 25))))

Functia gaseste-cale generează succesiunea de pozitii care trebuie parcurse pentru a ajunge din starea de-la în starea la. Pentru aceasta foloseste o variantă putin modificată a functiei strips prezentată în Sectiunea 6.3.2. Functiile filtreaza si destinatie sînt două functii auxiliare care realizează filtrarea elementelor unei secvente cu ajutorul unei functii de test si respectiv extragerea cîmpului destinatie din actiunea unui operator.

(defun gaseste-cale (de-la la)

(let ((cale (strips `((la ,de-la)) `((la ,la)))))

(when cale

(cons de-la (mapcar #'destinatie (remove '(start) cale :test #'equal))))))

(defun strips (stare scopuri &optional (*OPERATORI* *OPERATORI*))

(filtreaza #'executa-p (satisfacere-scopuri (cons '(start) stare) scopuri nil)))

(defun filtreaza (test-fn secventa)

(delete nil (mapcar #'(lambda (elem) (when (funcall test-fn elem) elem)) secventa)))

(defun destinatie (actiune)

(first (last (second actiune))))

5. Functia constructor primeste o listă de blocuri si construieste operatorii de lucru în lumea blocurilor pentru o problemă care contine blocurile specificate si masa. Functia operator-mutare construieste operatorul de mutare a blocului a aflat deasupra blocului b pe blocul c. Functia satisfacere scopuri este redefinită astfel încît să ia în consideratie mai multe ordonări posibile ale scopurilor, ordonări furnizate de functia ordonari. În varianta prezentată functia ordonari realizează numai două ordonări, cea directă si cea inversă, însă prin rescrierea functiei se pot genera toate ordonările de scopuri posibile cu penalizările de timp corespunzatoare. Functia operatori-potriviti întoarce lista sortată a operatorilor care pot satisface un scop într-o anumită stare. Sortarea se face în ordine crescatoare a numărului de preconditii nesatisfăcute. Celelalte functii au aceasi semnificatie cu a functiilor definite în Sectiunea 6.3.2.

(defun constructor (blocuri)

(let (operatori)

(dolist (a blocuri)

(dolist (b blocuri)

(unless (equal a b)

(dolist (c blocuri)

(unless (or (equal c a) (equal c b))

(push (operator-mutare a b c) operatori)))

(push (operator-mutare a 'masa b) operatori)

(push (operator-mutare a b 'masa) operatori))))

operatori))

(defun operator-mutare (a b c)

(make-operator :actiune `(executa (muta ,a de pe ,b pe ,c))

:preconditii `((liber ,a) (liber ,c) (,a pe ,b))

:lista-adaugari (mutare a b c)

:lista-eliminari (mutare a c b)))

(defun mutare (a b c)

(if (eq b 'masa) `((,a pe ,c)) `((,a pe ,c) (liber ,b))))

(defun satisfacere-scopuri (stare scopuri stiva)

(some #'(lambda (scopuri) (satisfacere stare scopuri stiva))

(ordonari scopuri)))

(defun satisfacere (stare scopuri stiva)

(let ((stare-curenta stare))

(when (and (every #'(lambda (g)

(setf stare-curenta (realizare-scop stare-curenta g stiva)))

scopuri)

(subsetp scopuri stare-curenta :test #'equal))

stare-curenta)))

(defun realizare-scop (stare scop stiva)

(cond ((member scop stare :test #'equal) stare)

((member scop stiva :test #'equal) nil)

(t (some #'(lambda (op) (aplica-operator stare scop op stiva))

(operatori-potriviti scop stare)))))

(defun operatori-potriviti (scop stare)

(sort (extrage scop *OPERATORI* #'potrivit-p)

#'<

:key #'(lambda (op)

(length (filtreaza #'(lambda (preconditie)

(not (member preconditie stare :test #'equal)))

(operator-preconditii op))))))

(defun ordonari (lista)

(if (> (length lista) 1) (list lista (reverse lista)) (list lista)))

Secventa de apeluri din continuare furnizează solutia problemei anomaliei lui Susmann prezentată în Sectiunea 6.3.1.

(utilizeaza (constructor '(a b c)))

(strips '((c pe a) (a pe masa) (b pe masa) (liber c) (liber b) (liber masa))

'((c pe masa) (b pe c) (a pe b)))

Capitolul 7

Rationament inductiv si învătare automată

Una dintre caracteristicile esentiale ale inteligentei umane este capacitatea de a învăta. Învătarea automată este domeniul cel mai provocator al inteligentei artificiale si, în acelasi timp, cel mai rezistent încercărilor de automatizare completă. S-au dat multe definitii ale procesului de învătare, una dintre cele mai adecvate definitii din punct de vedere al inteligentei artificiale fiind cea a lui Herbert Simon: "Orice schimbare într-un sistem, care permite sistemului îmbunătătirea performantelor în rezolvarea ulterioară a aceleiasi probleme sau a unei probleme similare, reprezintă un proces de învătare".

La baza procesului de învătare stau o serie de forme inferentiale nevalide cum ar fi: inductia, abductia sau analogia. O metodă de învătare poate folosi una sau mai multe astfel de forme de inferentă cît si forme de inferentă validă, cum ar fi deductia.

Capitolul de fată se ocupă de prezentarea unei metode de învătare automată numită învătare bazată pe explicatii. Această formă de învătare, intens investigată în ultimul timp de cercetătorii domeniului, este o metodă de învătare analitică în care sistemul învată pe baza unui singur exemplu semnificativ pe care îl explică în termenii cunostintelor generale ale domeniului problemei. Pentru a situa învătarea bazată pe explicatii în contextul general al metodelor de învătare în inteligenta artificială, prima sectiune a acestui capitol prezintă o clasificare a acestor metode.

7.1 Metode de învătare

Există două motive principale pentru care este interesant să se studieze procesul si metodele de învătare. Primul motiv, de ordin epistemologic, este acela de a întelege un comportament inteligent esential uman. Al doilea motiv, de ordin pragmatic si fundamental pentru cercetările de inteligentă artificială, este acela de a putea crea programe care să-si construiască singure baza de cunostinte si care, eventual, să poată sintetiza alte componente de program. În acest fel, se poate elimina una din marile limitări de eficientă ale dezvoltării sistemelor de inteligentă artificială, si anume procesul de achizitie a cunostintelor.

7.1.1 Reguli de inferentă utilizate în învătare

Regulile de inferentă valide (deductive), de tipul celor prezentate în Capitolul 3, reprezintă inferente care garantează adevărul formulei inferate dacă formulele asupra cărora se aplică regula sînt adevărate. În procesul de învătare se folosesc însă, preponderent, reguli de inferentă nevalide (nedeductive), care nu garantează validitatea formulei obtinute prin aplicarea lor. Cu toate acestea, inferentele nedeductive pot fi aplicate cu succes în numeroase cazuri pentru rezolvarea problemelor care includ componente de învătare. În continuare sînt prezentate cele mai importante reguli de inferentă nevalide.

Inferenta inductivă se bazează pe ideea că o proprietate adevărată pentru o submultime de obiecte dintr-o clasă este adevărată pentru toate obiectele din acea clasă. Inferenta inductivă are forma:

De exemplu, după ce se constată că cele mai multe lebede sînt albe, se poate infera prin inductie că toate lebedele sînt albe, desi există si lebede negre, cum ar fi unele dintre cele care cresc în Australia.

Inferenta inductivă se poate generaliza la sintetizarea unei întregi reguli de deductie pe baza exemplelor, astfel:

Inferenta abductivă se bazează pe utilizarea cunostintelor cauzale pentru a explica sau a justifica o concluzie, posibil invalidă. Inferenta abductivă are următoarea formă:

De exemplu, din formulele si se poate infera abductiv că iarba este udă deoarece a plouat peste ea. Cu toate acestea, abductia nu poate fi aplicată consistent în oricare caz. De exemplu, din formulele si , unde cea de a doua formulă exprimă faptul că toti pacientii internati în pavilionul 5 au gripă, nu se poate infera că Maria are gripă deoarece este internată acolo. Acest lucru se întîmplă deoarece inferenta abductivă poate fi aplicată pentru a genera explicatii numai atunci cînd implicatia indică o relatie cauzală.

Inferenta analogică este o formă de inferentă bazată pe experientă si se bazează pe ideea conform căreia situatii sau entităti care tind să fie asemănătoare sub anumite aspecte sînt asemănătoare în general. Inferenta analogică este de fapt o combinatie a celorlalte forme de inferentă: abductive, deductive si inductive. Inferenta analogică are forma:

7.1.2 Clasificarea tipurilor de învătare

Plecînd de la definitia învătării dată de H. Simon, se poate construi un model general al procesului de învătare, care permite si clasificarea principalelor tipuri de învătare automată. Clasificarea prezentată în această sectiune se bazează pe cea propusă de Feigenbaum si are ca scop situarea si reliefarea locului învătării bazate pe explicatii în contextul general al învătării automate.

Un sistem de învătare automată poate fi văzut ca fiind format din cinci componente principale, asa cum se prezintă în Figura 7.1. Modul de functionare al unui sisem de învătare automată este descris, pe scurt, în continuare. Mediul oferă stimuli sau informatie elementului de învătare care foloseste această informatie pentru a îmbunătăti cunostintele (explicite) din baza de cunostinte. Aceste cunostinte sînt utilizate de elementul de prelucrare în rezolvarea problemei. Elementul de prelucrare este de fapt motorul de inferentă al sistemului si formează împreună cu baza de cunostinte componenta de rezolvare a problemelor. Calitatea rezolvării problemei este analizată de componenta de evaluare a prelucrării (componenta critică) si rezultatele acestei analize sînt transmise elementului de învătare. Infomatia sintetizată în procesul de rezolvare a problemei poate servi ca reactie inversă pentru elementul de învătare. Mediul, baza de cunostinte si elementul de prelucrare determină natura problemei particulare de învătare si functiile particulare pe care elementul de învătare trebuie să le realizeze. În figură, săgetile indică directia predominantă a fluxului informational într-un sistemul de învătare automată.

Figura 7.1 Modelul conceptual al unui sistem de învătare automată

Mediul influentează procesul de învătare prin nivelul si calitatea informatiei oferite. Nivelul informatiei se referă la gradul de generalitate al acesteia. Rolul principal al elementului de învătare este acela de a reduce diferenta dintre nivelul informatiei transmise de mediu si nivelul informatiei utilizate de elementul de prelucrare în rezolvarea problemei. Dacă nivelul informatiei oferite de mediu elementului de învătare este abstract, acesta trebuie să detalieze informatia astfel încît elementul de prelucrare să o poată utiliza în rezolvarea unei probleme particulare. Dacă elementului de învătare îi sînt oferite informatii specifice despre o problemă particulară, el trebuie să generalizeze această informatie pentru a ghida elementul de prelucrare în rezolvarea unei clase mai largi de probleme. În timpul procesului de învătare, elementul de învătare formează ipoteze asupra modului în care trebuie redusă diferenta. Pentru a valida aceste ipoteze, el trebuie să primească o reactie pe baza căreia să evalueze ipotezele formulate. În functie de diferenta între nivelul informatiei oferite de mediu si cel al informatiei din baza de cunostinte, se pot identifica cele patru tipuri de învătare prezentate în continuare.

Învătarea prin memorare este caracterizată de faptul că nivelul informatiei oferite de mediu coincide cu nivelul informatiei utilizate de elementul de prelucrare, deci al problemei de rezolvat. În acest tip de învătare elementul de învătare nu trebuie să formuleze ipoteze, ci doar să memoreze informatia pentru a o utiliza ulterior. Un exemplu de sistem de învătare prin memorare este programul de jucat sah al lui Samuel [1967], care îsi îmbunătăteste performantele în jocul de sah prin memorarea fiecărei pozitii evaluate si a mutării considerate. Pozitiile anterior memorate sînt utilizate pentru cresterea vitezei si a numărului de mutări investigate în avans.

Învătarea prin instruire este caracterizată de nivelul abstract, general, al informatiei oferite de mediu, elementului de învătare revenindu-i sarcina de a formula ipoteze asupra detaliilor care lipsesc în rezolvarea problemei. Prin formularea ipotezelor, elementul de învătare transformă informatia primită într-o formă utilizabilă de elementul de prelucrare. Această transformare, care presupune întelegerea si interpretarea cunostintelor de nivel ridicat si corelarea lor cu informatiile existente deja în sistem, se numeste operationalizare. Exemple de astfel de sisteme sînt: programele de jucat cupe FOO si BAR [Mostow,1983], si programul TEIRESIAS care învată reguli de tipul celor existente în sistemul expert medical MYCIN. De exemplu, sistemul FOO trebuie să operationalizeze indicatii strategice de tipul "Evită să acumulezi puncte" în strategii specifice de tipul "Joacă o carte mai mică decît orice carte jucată pînă în acest moment".

Învătarea prin inductie (din exemple) este caracterizată prin nivelul scăzut al informatiei oferite de mediu. În acest tip de învătare, elementul de învătare trebuie să formuleze ipoteze de generalizare a exemplelor în reguli de nivel mai ridicat, reguli care pot fi aplicate în ghidarea elementului de prelucrare în rezolvarea unei clase mai largi de probleme. De exemplu, un program care învată conceptul de pereche într-un joc de cărti trebuie să sintetizeze din două exemple de tipul:

4 - 4 5 7

7 6 - 6 9

conceptul de descriere a unei perechi: două cărti de acelasi rang, indiferent de culoare si de valoarea celorlalte cărti. Învătarea prin inductie include mai multe instante ale învătării, cum ar fi învătarea conceptelor unice, învătarea conceptelor multiple, învătarea secventelor de operatori aplicati în timpul rezolvării problemelor. Învătarea bazată pe explicatii este tot o formă de învătare din exemple, dar care include si componente de învătare prin instruire, respectiv operationalizare.

Învătarea prin analogie este caracterizată prin faptul că informatia oferită de mediu este relevantă numai pentru probleme similare. Elementul de învătare trebuie să descopere analogia si să formuleze ipoteze despre reguli similare aplicabile problemei curente. Învătarea prin analogie, putin studiată pînă în prezent, ridică probleme conceptuale deosebite, de exemplu: ce este analogia, cum sînt recunoscute analogiile, cum se transferă cunostintele relevante, etc. Se consideră exemplul unui sistem de învătare prin analogie confruntat cu o problemă de hidraulică care cere să se calculeze debitul printr-o conductă de iesire QC, aflată la jonctiunea (de tip Y) a două conducte de intrare QA si QB. Baza de cunostinte a sistemului nu contine cunostinte de hidraulică dar contine cunostinte de electrotehnică. În procesul de învătare prin analogie se indică sistemului faptul că "debitul este analog curentului electric". Această analogie sugerează că se pot folosi anumite cunostinte despre curentul electric pentru a genera (învăta) reguli utile în rezolvarea problemei debitului. În particular, sistemul poate folosi ca punct de plecare în rezolvarea problemei de hidraulică, prima lege a lui Kirchhoff care statuează că pentru o jonctiune electrică de tip Y, intensitatea curentului de iesire printr-o ramură IC este egală cu suma intensitătilor curentilor IA si IB de intrare în jonctiune (nod). Prin analogie, sistemul poate învăta o regulă de calcul a debitului prin conducta de iesire: .

Structura si functiile elementului de prelucrare depind de complexitatea tipului problemei de rezolvat: clasificare sau predictie pe baza unui singur concept, sinteza conceptelor multiple, planificare prin sinteza unor secvente de actiuni. O componentă importantă care influentează elementul de prelucrare este componenta de evaluare a prelucrării deoarece elementul de prelucrare trebuie să aibă o posibilitate de a valida sau corecta ipotezele făcute. Anumite sisteme de învătare au cunostinte separate pentru evaluare, în timp ce alte sisteme asteaptă de la mediu sau profesor un standard de evaluare pentru a valida ipoteza curentă. De exemplu, în sistemele de învătare din exemple standardul de evaluare, oferit de profesor, este clasificarea corectă a fiecărei noi instante a problemei.

7.2 Învătarea bazată pe explicatii

Sistemele de învătare inductivă se bazează pe abstractizarea caracteristicilor comune ale exemplelor, instante pozitive sau instante negative ale unui concept, pentru a sintetiza descrierea generală a unui concept. În ultimul timp, cercetările în domeniul învătării din exemple s-au orientat si spre metode analitice, conform cărora instantele unui concept reprezintă mai mult decît o multime independentă de caracteristici. Una dintre aceste metode analitice, intens investigată recent, este învătarea bazată pe explicatii. Învătarea bazată pe explicatii este o formă a învătării din exemple în care sistemul învată un concept general pornind de la o singură instantă a conceptului. Generalizarea conceptului pe baza exemplului se face utilizînd o cantitate semnificativă de cunostinte despre domeniul problemei de rezolvat.

Metoda învătării bazate pe explicatii poate generaliza, pornind de la un singur exemplu, prin analiza motivelor pentru care exemplul este o instantă a conceptului. Explicatia identifică caracteristicile relevante ale exemplului, care constituie conditii suficiente pentru descrierea conceptului, apoi această explicatie este transformată în reguli operationale de recunoastere a conceptului. Puterea acestei metode izvorăste din utilizarea teoriei domeniului pentru a ghida procesul de căutare [Minton,s.a.,1989].

Abordarea traditională a învătării inductive, cunoscută si sub numele de învătare empirică sau învătare bazată pe similitudini, necesită investigarea a numeroase exemple ale unui concept pentru a determina caracteristicile lor comune. Cercetătorii care au studiat această perspectivă a învătării au presupus că sistemul poate învăta din exemple, fără a se baza pe o cantitate semnificativă de cunostinte ale domeniului. Abordarea alternativă a învătării bazate pe explicatii generalizează exemplul unic, utilizînd cunostinte extinse despre domeniu. Din acest motiv, învătarea bazată pe explicatii este analitică si intensivă din punct de vedere al utilizării cunostintelor, în timp ce metodele inductive sînt slabe în raport cu exploatarea cunostintelor.

7.2.1 Tipuri de învătare bazată pe explicatii

Învătarea bazată pe explicatii a fost identificată ca metodă distinctă de învătare abia la începutul anilor ­'80 de DeJong si Mitchell, DeJong [1981] fiind cel care a dat numele metodei. Dezvoltarea metodei a început însă înaintea acestei perioade prin programele de învătare analitică: STRIPS [Fikes,Nilson,1972], HACKER [Sussman,1975] si programul de jucat poker al lui Waterman [1970], programe care îsi îmbunătătesc comportarea pe baza experientei acumulate în rezolvarea problemelor.

Notiunea de învătare bazată pe explicatii a fost utilizată pentru a caracteriza diverse abordări ale învătării. Cu toate acestea, cele mai multe abordări pot fi întelese în termenii unei proceduri care contine două etape de bază. În prima etapă se construieste o explicatie a functionării sau a caracteristicilor exemplului dat, în termenii cunostintelor domeniului. Această explicatie trebuie să surprindă principiile generale exprimate de exemplu. Cea de a doua etapă constă în analiza explicatiei si a exemplului în scopul construirii conceptului general sau a regulii generale. Caracteristicile si restrictiile exemplului sînt generalizate cît mai mult posibil, atît timp cît acestea rămîn consistente cu explicatia. Generalizarea va include si alte exemple (necunoscute) care pot fi întelese utilizînd aceeasi explicatie si care au aceleasi principii sau caracteristici. În concluzie, metoda utilizează cunostintele domeniului problemei pentru a determina ce caracteristici si restrictii ale unui exemplu pot fi generalizate, generalizarea fiind justificată.

Desi învătarea bazată pe explicatii este privită, preponderent, ca o metodă de realizare a generalizării, ea poate fi văzută si din alte puncte de vedere. Astfel, învătarea bazată pe explicatii poate fi considerată din patru perspective [Ellman,1989]: generalizare explicată, grupare, operationalizare si analogie justificată. Aceste patru perspective permit clasificarea diverselor sisteme care utilizează metoda.

Generalizarea explicată este abordarea care urmăreste îndeaproape cele două etape ale procedurii de învătare bazată pe explicatii. Sistemele GENESIS [DeJong,1983;Mooney,DeJong, 1985] si LEX-II [Mitchell,s.a.,1983] sînt exemple de programe care realizează generalizare explicată si vor fi prezentate în Sectiunea 7.3. Tot în aceeasi sectiune se prezintă o abordare unitară a generalizării explicate si a învătării bazate pe explicatii, datorată lui Mitchell, Keller si Kedar-Cabelli [1986].

Învătarea prin grupare este o metodă de învătare în timpul rezolvării problemelor în care o secventă liniară sau arborescentă de operatori, capabilă să transforme o stare initială într-o stare finală a problemei, este "compilată" într-un singur operator care are acelasi efect ca întreaga secventă. Componenta de învătare din sistemul STRIPS [Fikes,Nilson,1972], prezentată în Sectiunea 7.2.3, si sistemul SOAR [Laird,s.a.,1987] sînt exemple de programe care utilizează învătarea prin grupare.

Învătarea prin operationalizare, care poate fi considerată atît o formă a învătării prin instruire cît si învătare bazată pe explicatii, constă într-un proces de transformare a unei reguli neoperationale, sau a unui concept neoperational, într-o regulă operatională, respectiv concept operational. Conceptele sau regulile sînt considerate a fi operationale în raport cu baza de cunostinte a sistemului, dacă sînt exprimate în termenii actiunilor si faptelor cunoscute de sistem. Sistemul FOO [Mostow,1983] este un exemplu de program care realizează operationalizarea si va fi prezentat pe scurt în sectiunea următoare.

Învătarea prin analogie justificată constă în găsirea unei proceduri de rationament analogic pe baza exemplelor. Fiind dată o bază de cunostinte BC, un exemplu X si un exemplu analog Y, trebuie găsită o caracteristică C astfel încît, dacă C(X) este adevărată, se poate infera si C(Y) adevărată. Cea mai semnificativă abordare a metodei este analogia derivatională [Carbonell,1983] în care se utilizează derivarea conceptului din exemplu pentru a ghida rationamentul analogic într-o manieră similară cu cea în care explicatia este folosită pentru a ghida generalizarea.

7.2.2 Învătare prin operationalizare

Tremenul de operationalizare poate fi definit ca procesul de traducere a unei expresii neoperationale într-una operatională, din punct de vedere al informatiei continute în baza de cunostinte a unui program. Programul FOO [Mostow,1983], cu succesorul său BAR, dezvoltate de Mostow, au fost construite în intentia de a operationaliza sfaturile în jocul de cupe. Pe scurt, jocul de cupe contine următoarele reguli: fiecare jucător are 13 cărti; la fiecare levată trebuie jucată o carte de aceeasi culoare cu cea jucată de primul jucător; jucătorul care a jucat cartea cea mai mare pentru o culoare cîstigă levata; fiecare carte de cupă reprezintă un punct si jocul este cîstigat de jucătorul care acumulează un număr minim de puncte.

Pentru a explica metoda de învătare utilizată de programul FOO, se consideră exemplul sfatului "Evită să acumulezi puncte". Acest sfat este considerat neoperational deoarece nu este exprimat în termenii actiunilor pe care le poate executa un jucător; regulile jocului nu permit unui jucător să refuze cîstigarea unei levate numai datorită faptului că aceasta contine puncte. Un alt exemplu de sfat neoperational este "Nu ataca o carte de o culoare inexistentă la un alt jucător"; acest sfat este neoperational deoarece necesită cunoasterea continutului cărtilor nejucate ale celorlalti jucători, lucru de asemenea interzis de regulile jocului.

Un student care doreste să învete acest joc si să operationalizeze sfatul "Evită să acumulezi puncte" poate proceda după cum urmează, privind exemplul unui joc si cărtile unui jucător, considerat profesor. Atacantul levatei curente a jucat 8, iar profesorul, care este al doilea jucător, are în acest moment următoarele cărti:

J 7 Q 7 4 2 A 10 J 9

Profesorul poate juca una din cele patru cărti de cupă si el alege 7. Studentul poate explica alegerea profesorului prin următorul rationament:

Levata contine cupe. Cîstigătorul levatei va acumula puncte nedorite. De aceea este bine să se joace o carte care nu cîstigă levata.

Jucarea unei cărti mari va minimiza sansele de a cîstiga levatele ulterioare.

Profesorul a ales 7 deoarece este cea mai mare carte de cupă care garantează pierderea levatei.

După explicarea exemplului, studentul poate să realizeze că aceeasi linie de rationament poate fi aplicată si altor situatii. Explicatia poate fi generalizată pentru orice secventă de cărti de cupă. Generalizînd explicatia prin eliminarea faptelor nerelevante, studentul poate sintetiza regula "Într-o levată care contine cupe, joacă cea mai mare carte de cupă care garantează pierderea levatei". Utilizînd această regulă, studentul poate alege cartea care trebuie jucată într-o nouă levată. Se observă că modul de învătare aplicat de student este asemănător procedurii cu două etape din învătarea bazată pe explicatii. Ca rezultat, se obtine o regulă operatională a sfatului "Evită să acumulezi puncte".

Programul FOO aplică aceeasi metodă de învătare. Pentru a transforma un sfat într-o regulă operatională, programul foloseste diverse tipuri de cunostinte. O parte a bazei de cunostinte contine o multime de reguli de transformare a problemei, independente de domeniu. Fiecare regulă are o componentă actiune (partea dreaptă a regulii) care specifică cum trebuie rescrisă o expresie ce reprezintă un sfat, si o componentă care indică conditiile de aplicare a regulii (partea stîngă a regulii). Exemple de astfel de reguli sînt:

Explicitarea definitiei conceptului. Dacă F este un concept definit ca atunci înlocuieste expresia cu rezultatul substitutiei lui cu pentru orice aparitie din e.

Aproximarea 1 a unui predicat. Fiind dată o expresie ce contine , unde P este un predicat, înlocuieste cu expresia .

Aproximarea 2 a unui predicat. Fiind dată o expresie ce contine , unde P este un predicat, înlocuieste cu expresia , unde este adevărată, cu exceptia cazului în care se stie că este falsă.

Regulile de transformare sînt aplicate sfatului initial, acesta fiind transformat progresiv într-o formă care satisface conditia de a fi operatională. Baza de cunostinte contine, de asemenea, definitii de concepte specifice domeniului, de exemplu:

point-cards = (lambda ( ) (set-of C (cards) (has-points C)))

avoid = (lambda (E S) (achieve (not (during S E))))

trick = (lambda ( ) (scenario (each P (players) (play-card P)) (take-trick (trick-winner))))

De exemplu, sfatul "Evită să acumulezi puncte" este reprezentat initial prin expresia:

(avoid (take-points me) (trick))

care poate fi interpretată astfel: evită o situatie în care jucătorul acumulează puncte în timpul levatei curente. Pentru a traduce această expresie, programul FOO utilizează regula de explicitare a definitiei conceptului si definitiile conceptelor avoid si trick. Apoi programul aplică diverse transformări si obtine expresia intermediară:

(achieve (not (and (= (trick-winner me) (trick-has-points)))))

Această expresie are următoarea semnificatie: "Încearcă să nu cîstigi o levată care contine cărti ce au asociate puncte". Transformînd în continuare expresia, sistemul obtine forma finală, operatională a expresiei:

(achieve (=> (and (in-suit-led (card-of me))

(possible (trick-has-points)))

(low (card-of me))))

Expresia are semnificatia: "Joacă o carte mică de culoarea jucată într-o levată care poate contine cărti cu puncte".

Programele FOO si BAR diferă prin strategia de control utilizată la alegerea regulilor de transformare a sfaturilor. Programul FOO lasă utilizatorul să aleagă regulile de transformare adecvate, în timp ce programul BAR aplică strategia analizei bazate pe modalităti pentru a determina secventa de reguli de aplicat, dar necesită din cînd în cînd interventia utilizatorului.

7.2.3 Învătare utilizînd macrooperatorii

Sistemul de planificare automată STRIPS [Fikes,Nilsson,1971], prezentat în Sectiunea 6.3, este cel mai important precursor al metodei de învătare bazată pe explicatii. În sistemul STRIPS, după rezolvarea unei probleme, componenta de învătare preia planul sintetizat si îl memorează sub forma unui macrooperator. Un macrooperator specifică o secventă de operatori care poate fi văzută ca un singur operator generalizat. Preconditiile macrooperatorului sînt reprezentate de starea initială a problemei, iar postconditiile lui reprezintă starea scop satisfăcută prin executarea planului, deci prin rezolvarea problemei. La întîlnirea unei noi probleme de planificare pentru care apare necesitatea realizării unui scop sau subscop similar cu cel îndeplinit de macrooperator se poate aplica direct macrooperatorul sintetizat, pentru care lista preconditiilor este satisfăcută. Se evită asttfel reluarea procesului de căutare pentru satisfacerea scopului sau subscopului. În acest fel, sistemul STRIPS include o componentă de învătare în timpul rezolvării problemelor.

Se consideră sistemul STRIPS, cu specificatiile de functionare si multimea de operatori prezentati în Sectiunea 6.3, si problema de planificare definită în Figura 7.2.

ARMEMPTY

Figura 7.2 Problemă de planificare utilizată în sinteza unui macrooperator

Planul sintetizat de sistemul STRIPS pentru rezolvarea acestei probleme este:

După rezolvare, pe baza planului Plan, componenta de învătare a sistemului construieste macrooperatorul:

MACROOP1 LP:

LE:

LA:

Acest macrooperator nu este însă deosebit de util, deoarece este putin probabil ca sistemul să întîlnească exact aceeasi stare initială si stare finală, pentru care să poată aplica macrooperatorul sintetizat. Din acest motiv sistemul generalizează macrooperatorul prin înlocuirea constantelor cu variabile. Pentru exemplul anterior, macrooperatorul generalizat este format din operatorii:

unde x , x si x sînt variabile. Macrooperatorul generalizat poate fi descris astfel

MACROGEN1 LP:

LE:

LA:

Generalizarea prin înlocuirea constantelor cu variabile poate duce însă la suprageneralizare. Desi în cele mai multe cazuri generalizarea se face prin înlocuirea constantelor cu variabile, există cazuri în care anumite constante nu trebuie să fie înlocuite cu variabile, ci trebuie să rămînă constante în macrooperator. Pentru a ilustra această situatie, se consideră rezolvarea problemei anterioare, în conditiile în care se adaugă operatorul specific care asează un bloc oarecare x deasupra blocului B. Acest operator se defineste astfel:

LP:

LE:

LA:

În aceste conditii, sistemul sintetizează, de exemplu, planul

Generalizînd acest plan, planul generalizat si macrooperatorul obtinut sînt:

MACROGEN2 LP:

LE:

LA:

Cum se comportă sistemul care are la dispozitie acest macrooperator în cazul în care trebuie să rezolve problema descrisă în Figura 7.3?

Macrooperatorul MACROGEN2, memorat anterior, pare foarte potrivit pentru a rezolva această problemă, cu instantierile , , . Deoarece preconditiile lui sînt satisfăcute, se construieste planul

ARMEMPTY

Figura 7.3 Problemă pentru care nu se poate aplica
macrooperatorul MACROGEN2

Dar acest plan nu se poate executa. Primii trei pasi sînt posibili, dar nu poate fi executat, deoarece este o preconditie a operatorului STACKONB care nu este îndeplinită. Chiar dacă blocul B ar fi liber si planul s-ar putea executa, efectul lui nu este cel dorit. Această comportare apare datorită faptului că postconditiile macrooperatorului au fost suprageneralizate. Operatorul MACROGEN2 este capabil să aseze blocuri numai peste blocul B, deci transformarea constantei B în variabila x a condus la o suprageneralizare.

În realitate, procedura de generalizare a macrooperatorilor sintetizati de sistemul STRIPS este mai complicată decît simpla înlocuire a constantelor cu variabile. Sistemul trebuie să analizeze utilitatea fiecărui pas de plan generalizat si să verifice preconditiile operatorilor generalizati de componenta de învătare [Ellman,1989].

După sintetizarea unui plan de satisfacere a scopului dat, sistemul STRIPS construieste o structură de date numită tabela triunghiulară. Tabela triunghiulară descrie structura planului într-un format adecvat procedurii de generalizare, i.e. de învătare. Această tabelă este utilă deoarece arată dependenta preconditiilor operatorilor de efectul altor operatori si de faptele existente în starea initială. Formulele marcate cu simbolul * într-o astfel de tabelă indică o astfel de dependentă. Procedura de construire a acestei tabele pentru o secventă de operatori P, de lungime N, este cea descrisă în continuare, tabela triunghiulară fiind notată TABT.

Algoritm: Construirea tabelei triunghiulare în sistemul STRIPS

1. Numerotează liniile tabelei de la 1 la si coloanele tabelei de la 0 la N

2. pentru pînă la N execută

3. pentru pînă la N execută

Plasează în toate faptele din starea initială care sînt adevărate înaintea aplicării operatorului i

4. Plasează în faptele din starea initială care rămîn adevărate în starea finală

5. pentru pînă la execută

pentru pînă la N execută

Plasează în faptele adăugate de operatorul care sînt adevărate înaintea aplicării operatorului

6. pentru pînă la N execută

Plasează în faptele adăugate de operatorul care rămîn adevărate în starea finală

7. pentru pînă la N execută

Marchează cu * fiecare fapt din linia i a tabelei TABT care a fost utilizat în demonstrarea preconditiilor operatorului

sfîrsit.

Pentru problema de planificare descrisă în Figura 7.4 (a), tabela triunghiulară construită de sistem este cea din Figura 7.4 (b). Faptul din , marcat cu *, indică dependenta preconditiilor operatorului de faptele adăugate de operatorul . Faptul din , marcat cu *, indică dependenta preconditiilor operatorului de faptele din starea initială.

ARMEMPTY

Figura 7.4 (a) Planul pentru care se construieste tabela triunghiulară

1

1.

*ARMEMPTY

2

2.

3

ARMEMPTY

0

1

2

Figura 7.4 (b) Tabela triunghiulară asociată unui plan

Există două criterii utilizate în generalizarea planului reprezentat printr-o tabelă triunghiulară. Primul criteriu implică mentinerea dependentelor între operatori. Operatorul i va adăuga un fapt în tabela generalizată care va permite aplicarea operatorului j, dacă si numai dacă există aceeasi dependentă între operatorii i si j în tabela originală. Cel de al doilea criteriu cere ca preconditiile operatorilor din tabela generalizată să poată fi dovedite ca adevărate folosind aceleasi demonstratii de verificare a preconditiilor din planul original. Algoritmul de generalizare a planului folosit în sistemul STRIPS este prezentat în continuare.

Algoritm: Generalizarea planului în sistemul STRIPS

1. Generalizează tabela triunghiulară

1.1. Înlocuieste fiecare constantă distinctă din coloana 0 a tabelei TABT cu o variabilă distinctă

1.2. pentru pînă la N execută

Înlocuieste fiecare formulă din coloana i a tabelei TABT cu formula (neinstantiată) corespunzătoare din lista adăugărilor operatorului i

1.3. Redenumeste variabilele astfel încît formulele obtinute prin aplicarea operatorilor distincti să contină variabile cu nume diferite

2. Execută din nou validarea preconditiilor utilizînd demonstratii similare cu cele ale planului original

2.1. Fiecare nouă validare a unei preconditii se va face pe baza formulelor generalizate marcate cu *

2.2. Fiecare nouă demonstratie consideră aceleasi perechi de formule în rezolutie si aceleasi perechi de literali în unificare

2.3. Substitutiile generate în timpul unificării sînt aplicate întregii tabele

sfîrsit.

Algoritmul de generalizare a planului foloseste atît tabela triunghiulară cît si demonstratiile preconditiilor operatorilor făcute în timpul sintezei planului initial. Pasul 1 al algoritmului înlocuieste constantele cu variabile, putînd duce la suprageneralizare. Pasul 2 restrictionează tabela generalizată în functie de cele două criterii mentionate anterior, eliminînd astfel anomalii de genul celei prezentate în Figura 7.3. Aplicarea acestui algoritm pentru tabela triunghiulară din Figura 7.4 (b) va genera tabela generalizată din Figura 7.5. Exemple suplimentare de aplicare a algoritmului sînt date în Sectiunea 7.4.

1

1.

*ARMEMPTY

2

2.

3

ARMEMPTY

0

1

2

Figura 7.5 Tabela triunghiulară generalizată

După ce s-a obtinut tabela generalizată a unui plan, se poate construi macrooperatorul corespunzător, avînd ca preconditii starea initială a problemei date. Lista eliminărilor acestui macrooperator se obtine făcînd diferenta între continutul celulelor si din tabela generalizată, iar lista adăugărilor se obtine prin cumularea continutului celulelor , . Sistemul mentine tabela triunghiulară asociată unui macrooperator, memorînd astfel faptul că acest operator nu poate fi executat printr-un singur pas de plan. Avantajul evident al utilizării macrooperatorilor este reducerea spatiului de căutare al rezolvării problemei de planificare.

Folosirea macrooperatorilor poate fi utilă si în cazul în care se rezolvă o problemă de planificare neliniară. Un macrooperator poate contine operatori care, luati în parte, pot duce la distrugerea unor scopuri anterior îndeplinite, dar tot acelasi macrooperator poate contine alti operatori ce elimină distrugerile. Văzut din punct de vedere global macrooperatorul nu afectează scopurile anterior satisfăcute.

Se consideră, de exemplu, problema mozaicului de 9 piese. După asezarea primelor patru piese în pozitiile finale, asezarea celei de a cincea piese nu se poate face fără a distruge temporar asezarea primelor patru. Dacă în timpul căutării algoritmul foloseste o euristică bazată pe distanta pînă la scop, alegerea unui operator care modifică asezările finale va fi evaluată ca mai putin interesantă. Existenta unui macrooperator care asează cea de a cincea piesă la locul ei, nemodificînd pozitiile primelor patru, va implica alegerea preferentială a acestui macrooperator de către functia euristică de evaluare. Aceeasi situatie se întîlneste si în rezolvarea problemei cubului lui Rubik.

Din punct de vedere al perspectivei învătării bazate pe explicatii, sinteza si memorarea unui macrooperator (plan) pentru realizarea unui scop explică de ce scopul respectiv poate fi satisfăcut. Conceptul general care este învătat este clasa situatiilor în care postconditiile macrooperatorului pot fi satisfăcute. Formarea macrooperatorilor determină conditiile suficiente, sub forma preconditiilor macrooperatorului, pentru care o situatie dată (instantă) face parte din această clasă. Astfel, spre deosebire de tehnicile inductive, sistemul STRIPS învată dintr-un singur exemplu.

7.3 Învătarea prin generalizare explicată

Aceasta sectiune începe prin prezentarea unei scheme generale de învătare prin generalizare explicată, care pune în evidentă caracteristicile esentiale ale metodei. Apoi sînt prezentate două sisteme care folosesc această abordare, sistemul GENESIS [DeJong,1983;Mooney,Dejong,1985] si sistemul LEX-II [Mitchell,1983].

7.3.1 Generalizarea bazată pe explicatii

Mitchell, Keller si Kedar-Cabelli [1986] prezintă o abordare unitară a învătării bazate pe explicatii, abordare numită generalizare bazată pe explicatii, cu prescurtarea din limba engleză EBG. Formalismul generalizării bazate pe explicatii încearcă să sintetizeze elementele esentiale ale celor mai multe sisteme de învătare bazată pe explicatii, într-o formă potrivită aplicării în orice domeniu. Mitchell descrie acest formalism ca "o metodă independentă de domeniu ... pentru utilizarea cunostintelor specifice domeniului în ghidarea generalizării". În această abordare, explicatiile sînt identificate cu demonstratiile scopurilor de rezolvat, ceea ce stabileste un înteles precis al termenului explicatie. Formalismul este format din două părti: problema EBG si metoda EBG. Problema EBG este definită în termenii a patru parametri necesari sistemului de învătare, parametri descrisi în continuare.

Conceptul scop este o definitie care descrie conceptul ce se învată si care reprezintă scopul sistemului de învătare. Se presupune că această definitie nu satisface criteriul de operationalitate, deci nu poate fi utilizată pentru a recunoaste instante ale conceptului.

Exemplul de învătare este un exemplu al conceptului scop care se învată, i.e. o instantă a acestui concept.

Teoria domeniului este o multime de reguli si fapte care descriu domeniul exemplului si al conceptului de învătat.

Criteriul de operationalitate indică ce fel de descrieri ale conceptului sînt considerate operationale, deci în ce formă trebuie exprimat conceptul învătat.

În formalismul lui Mitchell, conceptul scop este reprezentat ca o formulă în logica cu predicate de ordinul I, formulă care poate contine atît variabile legate cît si variabile libere. Criteriul de operationalitate este exprimat sub forma unei multimi de predicate observabile sau usor de evaluat, care apartin teoriei domeniului sau care sînt predicate generale. Descrierea unui concept este considerată operatională dacă si numai dacă este în întregime exprimată în termenii predicatelor acestei multimi. Exemplul de învătare este descris în termeni operationali, i.e. folosind predicate din multimea criteriului de operationalitate. Regulile si faptele din teoria domeniului sînt folosite pentru a explica de ce exemplul de învătare este o instantă a conceptului scop. Teoria domeniului este reprezentată printr-o multime de clauze Horn.

Sistemul de învătare trebuie să reformuleze conceptul scop în termenii unei noi descrieri care satisface următoarele conditii:

este o generalizare a exemplului de învătare;

este o conditie suficientă pentru caracterizarea conceptului scop;

satisface criteriul de operationalitate.

Reexprimarea descrierii conceptului scop în termenii criteriului de operationalitate va face conceptul operational din punctul de vedere al recunoasterii instantelor scopului. Noua descriere a conceptului nu este necesar identică cu conceptul scop, ci poate fi o specializare a conceptului scop si/sau o generalizare a exemplului de învătare. Pentru a crea o astfel de descriere, sistemul de învătare aplică metoda EBG care, similar procedurii generale de învătare bazată pe explicatii, contine două etape:

(1) Explicare. În această etapă sistemul foloseste teoria domeniului pentru a construi o explicatie, sub forma unui arbore de deductie care arată cum satisface exemplul de învătare definitia conceptului scop. Această explicatie trebuie construită astfel încît fiecare ramură a structurii explicative să se termine cu o expresie din multimea criteriului de operationalitate. Explicatia demonstrează faptul că exemplul de învătare este într-adevăr o instantă a conceptului scop.

(2) Generalizare. Această etapă se realizează prin regresia conceptului scop prin structura explicativă pentru obtinerea unei descrieri operationale a conceptului la nivelul frunzelor arborelui de explicare. În acest fel, se determină multimea conditiilor suficiente pentru care explicatia este valabilă, conditii exprimate în termenii criteriului de operationalitate.

Procedura de generalizare propusă, numită regresia modificată a scopului, este o versiune a tehnicii de regresie propusă de Nilson [1980] si îndeplineste conceptual acelasi rol ca generalizarea planului în sistemul STRIPS sau generalizarea explicatiilor în sistemul GENESIS. Procedura regresiei modificate a scopului identifică conceptul scop cu rădăcina arborelui de deductie, înlocuind constantele cu variabile, si continuă identificarea la nivelele următoare ale arborelui, păstrînd substitutiile efectuate.

Fie exemplul definirii conceptului scop , care indică o pereche de obiecte astfel încît x poate fi asezat în conditii de sigurantă peste y. În acest caz, problema se defineste astfel:

Conceptul scop

Exemplul de învătare

.

Teoria domeniului

Criteriul de operationalitate

Predicate specifice domeniului: , , , .

Predicate generale: , care sînt adevărate dacă , respectiv .

Pentru a aplica metoda generalizării bazată pe explicatii, sistemul trebuie să construiască întîi explicatia care justifică (demonstrează) faptul că exemplul de învătare sastisface conceptul scop. Pentru aceasta, sistemul trebuie să demonstreze conceptul scop în termenii teoriei domeniului si ai specificatiilor exemplului, construind un arbore de deductie care să satisfacă criteriul de operationalitate la nivelul frunzelor. Acest arbore este prezentat în Figura 7.6.

Figura 7.6 Arbore de explicare a exemplului în termenii conceptului scop

Conceptul scop este apoi supus procesului de regresie în structura explicativă, începînd de la rădăcina arborelui. Procedeul de regresie este rezumat în Figura 7.7 în care expresiile subliniate sînt rezultatul pasilor de regresie executati. În acest fel, se obtine prin generalizare următoarea descriere operatională a conceptului scop:

Figura 7.7 Generalizare prin regresia scopului în structura explicativă

Această descriere specifică faptul că x poate fi asezat în conditii de sigurantă peste y, dacă y este masă si dacă produsul dintre volumul si densitatea lui x este mai mic ca 500 sau, altfel spus, orice obiect mai usor de 500 poate fi asezat pe masă. Această descriere satisface criteriul de operationalitate si este justificată de explicatie.

Se pot pune următoarele două probleme. În primul rînd, în ce măsură poate fi considerată această metodă un proces de învătare, din moment ce algoritmul se bazează pe o definitie a conceptului. Avînd în vedere defintia învătării dată de Herbert Simon, conform căreia învătarea este îmbunătătirea capacitătii de rezolvare a problemelor, această metodă poate fi considerată o metodă de învatare. Definitia conceptului primită de sistem este neoperatională, ceea ce înseamnă că este complex computatională, dacă nu imposibil de aplicat pentru recunoasterea instantelor conceptului. Generalizarea bazată pe explicatii este văzută ca o operationalizare a definitiei conceptului, adică transformarea acestei definitii într-o formă ce poate fi utilizată eficient în recunoastere.

În al doilea rînd se pune problema rolului jucat de exemplul de învătare. În principiu, fiind dată o teorie completă a domeniului, definitia conceptului ar putea fi operationalizată fără a folosi exemplul. Cu toate acestea, exemplul are două roluri. Primul este acela de a ghida căutarea pentru găsirea definitiei operationale, reducînd astfel spatiul de căutare. Dacă algoritmul s-ar aplica fără a utiliza exemplul de învătare, cea de a doua etapă devine inutilă deoarece nu mai este nevoie să se generalizeze caracteristicile particulare apărute în explicatie datorită exemplului de învătare. În aceste conditii însă, spatiul de căutare parcurs poate fi mult mai mare. Al doilea rol al exemplului de învătare este acela de a impune conditiile suficiente ale descrierii conceptului, în măsura în care exemplul de învătare este reprezentativ pentru concept.

Pentru a ilustra aceste idei, se consideră implementarea algoritmului de generalizare bazată pe explicatii, în limbajul Prolog. Alegerea limbajului Prolog s-a făcut deoarece caracterul logic si facilitătile de unificare din limbaj permit exprimarea usoară atît a problemei EBG, cît si a metodei EBG. Implementarea Prolog, în loc să construiască întîi structura explicativă si să realizeze ulterior generalizarea, construieste simultan atît arborele de deductie al exemplului de învătat cît si arborele de deductie generalizat. Deductia unui predicat operational este imediată, predicatul fiind o frunză a arborelui. Deductia unui predicat neoperational se face pe baza regulii ce îl referă în concluzie, iar deductia unei conjunctii de scopuri se face pe baza deductiei fiecărui scop în parte. Se propun în continuare două versiuni ale implementării în limbajul Prolog a algoritmului de generalizare bazată pe explicatii [Harmelen,1988]. Prima versiune este următoarea:

gbe (Frunza, FrGen, FrGen) :-

operational (Frunza), !,

call (Frunza).

gbe ((Scop1, Scop2), (Scop1Gen, Scop2Gen), (Frunze1, Frunze2)) :-

gbe (Scop1, Scop1Gen, Frunze1),

gbe (Scop2, Scop2Gen, Frunze2).

gbe (Scop, ScopGen, Frunze) :-

clause (ScopGen, ClauzaGen),

copiere ((ScopGen :- ClauzaGen), (Scop :- Clauza)),

gbe (Clauza, ClauzaGen, Frunze).

Predicatul Prolog sintetizează în argumentul Reformulare, pe baza exemplului dat în Exemplu, o descriere operatională a conceptului (neoperational) Concept. Efectul predicatului este instantierea argumentului Reformulare la o listă de predicate operationale care formează frunzele arborelui de deductie a conceptului scop. Predicatul copiere ajută la construirea arborelui de deductie generalizat, prin crearea unei copii a primului argument, i.e. regula , în cel de al doilea argument .

Considerînd exemplul precedent, specificarea problemei în limbajul Prolog se face astfel:

%% Conceptul scop

sigur_peste(X, Y) :- mai_usor(X, Y).

%% Exemplu de invatare

peste(cub1, masa1).

volum(cub1, 10).

isa(cub1, cub).

isa(masa1, masa).

culoare(cub1, rosie).

culoare(masa1, alba).

densitate(cub1, 10).

%% Teoria domeniului

mai_usor(X, Y) :-

greutate(X, W1),

greutate(Y, W2),

mai_mic(W1, W2).

greutate(X, 500) :- isa(X, masa).

greutate(X, Y) :-

volum(X, V),

densitate(X, D),

inm(V, D, Y).

%% Criteriul de operationalitate

operational (Scop) :-

member (Scop, [inm(_,_,_), mai_mic(_,_), peste(_,_), volum(_,_), isa(_,_), culoare(_,_), densitate (_,_)]).

Rezolvarea problemei de învătare se face prin următorul apel al scopului gbe:

?- gbe (sigur_peste (cub1, masa1), sigur_peste (X, Y), Reformulare)

Reformulare = (volum (X, VX), densitate (X, DX),

inm (VX, DX, MX), isa (Y, masa), mai_mic (MX, 500))

reformularea indicînd faptul că orice obiect mai usor de 500 poate fi asezat în conditii de sigurantă pe masă.

Cea de a doua variantă de implementare nu mai ia în considerare exemplul de învătare si operationalizarea conceptului se face numai pe baza teoriei domeniului. Predicatul care implementează această variantă este definit după cum urmează.

gbe1 (Frunza, Frunza) :-

operational (Frunza), !, call (Frunza).

gbe1 ((Scop1Gen, Scop2Gen), (Frunze1, Frunze2)) :-

gbe1 (Scop1Gen, Frunze1),

gbe1 (Scop2Gen, Frunze2).

gbe1 (ScopGen, Frunze) :-

clause (ScopGen, Clauza),

gbe1 (Clauza, Frunze).

Predicatul gbe1 contine numai două argumente: conceptul scop si reformularea conceptului în termeni operationali. Spre deosebire de predicatul gbe, care construia două versiuni ale arborelui de deductie, una specifică si alta generalizată, cu ajutorul predicatului copiere, predicatul gbe1 construieste numai arborele de deductie generalizat, deci nu mai are nevoie de apelul predicatului copiere. Acest comportament se datorează faptului că învătarea nu se mai face ghidată de exemplu. Există si o altă diferentă a predicatului gbe1 fată de gbe. Predicatul gbe1 include în reformularea conceptului unificările cu predicatele operationale, restrictionînd astfel reformularea conceptului scop. Predicatul gbe nu include aceste unificări în multimea rezultantă de frunze, deci în reformulare. Această diferentă poate fi eliminată, în sensul că predicatul gbe1 poate fi modificat astfel încît să nu includă unificările cu predicatele operationale. Efectul dorit este realizat prin înlocuirea primei clauze a predicatului gbe1 cu clauza:

gbe1 (Frunza, Frunza) :-

operational (Frunza), !,

not not call (Frunza).

În aceste conditii, învătarea conceptului se poate face prin următorul apel al predicatului gbe1, care va avea solutiile indicate în continuare.

?- gbe1 (sigur_peste (X, Y), Reformulare)

Reformulare = (volum (X, VX), densitate (X, DX),

inm (VX, DX, MX), isa (Y, masa), mai_mic (MX, 500))

Reformulare = (isa (X, masa), volum (Y, VY), densitate (Y, DY),

inm (VY, DY, MY), mai_mic (500, MY))

cu semnificatia că o masă poate fi asezată în conditii de sigurantă peste orice obiect cu greutatea mai mare de 500.

Reformulare = (volum (X, VX), densitate (X, DX),

inm (VX, DX, MX), volum (Y, VY), densitate (Y, DY),

inm (VY, DY, MY), mai_mic (MX, MY))

cu semnificatia că orice obiect poate fi asezat în conditii de sigurantă peste orice alt obiect, dacă este mai usor decît obiectul peste care este asezat.

De fapt există patru reformulări posibile ale conceptului scop, dintre care una, corespunzătoare asezării a două mese una peste alta, este eliminată datorită faptului că ambele mese au aceeasi greutate, 500. Se observă că cele patru reformulări sintetizate de predicatul gbe1 reprezintă de fapt cele patru multimi de frunze ale celor patru arbori de derivare posibili pentru conceptul scop. În predicatul gbe, căutarea este ghidată de exemplul de învătare, ceea ce determină sinteza unei singure reformulări a conceptului în termeni operationali.

7.3.2 Achizitia schemelor explicative

Unul din principalele eforturi făcute în investigarea învătării bazate pe explicatii sub forma generalizării explicate este sistemul GENESIS [DeJong,1983;Mooney,DeJong,1985] de întelegere a povestirilor exprimate în limbaj natural. Sistemul analizează o povestire care descrie personaje si planuri de actiune ale acestora în vederea realizării anumitor scopuri. Analiza are rolul de a construi scheme de descriere a unor planuri generale, scheme care sînt utilizate în întelegerea unor povestiri similare.

Procesul de întelegere si analiză a planului în sistemul GENESIS se face pe baza cunostintelor despre domeniul discursului, cunostinte care se referă la scopurile tipice ale actiunilor umane si la motivatiile acestora. Reprezentarea cunostintelor se face pe baza schemelor, un model combinat de cunostinte structurate si scenarii [Rich,Knight,1991; Florea,1993], organizate într-o structură ierarhică. Schemele descriu actiuni, stări si obiecte. Actiunile sînt reprezentate într-o formă similară formei operatorilor din sistemul STRIPS. Structura de control a sistemului foloseste o combinatie a mecanismelor de control specifice scenariilor cu acelea caracteristice rezolvării problemelor de planificare. Metodele specifice scenariilor instantiază schemele generale în urma identificării cu obiectele si actiunile povestirii, iar metodele specifice planificării conduc căutarea în spatiul planurilor posibile pentru găsirea planurilor care justifică scopurile personajelor din povestire.

Fie următoarea povestire despre producerea unei răpiri: "Florin este tatăl Mariei si Florin este bogat. Radu se împrieteneste cu Maria. Maria poartă pantaloni. Radu îndreaptă un pistol spre Maria si o obligă să se urce în masina lui. Apoi o încuie în camera lui de hotel. Radu telefonează lui Florin si îi spune că Radu o are pe Maria captivă. Radu îi spune lui Florin că dacă Florin îi plăteste 10.000.000 lei la Cluj, atunci Radu o eliberează pe Maria. Florin dă banii lui Radu si Radu o eliberează pe Maria".

Utilizînd acest unic exemplu si cunostintele din baza de cunostinte, sistemul GENESIS generalizează exemplul construind o schemă care descrie un plan general al răpirilor în scopul obtinerii unei răscumpărări. Schema contine numai acele elemente ale povestirii care sînt necesare îndeplinirii planului, eliminînd detaliile nesemnificative. De exemplu, schema necesită ca victima să fie o rudă apropiată a unei persoane bogate pentru a putea obtine răscumpărarea, dar nu necesită existenta informatiei despre pantalonii purtati de victimă si nici faptul că banii trebuie să fie plătiti la Cluj, deoarece aceste elemente nu sînt esentiale în realizarea planului.

Pentru a generaliza povestirea, sistemul GENESIS construieste o explicatie cauzală completă a evenimentelor descrise. Desi povestirea istoriseste o secventă de evenimente, nu se indică legăturile cauzale între aceste evenimente. Sistemul trebuie să infere toate aceste legături cauzale. În timpul construirii explicatiei, se fac diverse tipuri de inferente care instantiază schemele generale existente în baza de cunostinte. De exemplu, se inferă faptul că apelul telefonic este o preconditie a întelegerii între Radu si Florin. De asemenea, sistemul inferă că personajele povestirii au anumite scopuri si anumite priorităti ale scopurilor, cum ar fi faptul că Florin doreste să o recapete pe Maria mai mult decît doreste să păstreze cei 10.000.000 lei. În plus, sistemul deduce că anumite actiuni ale povestirii sînt componente ale unui plan mai cuprinzător. De exemplu, "Radu îndreaptă un pistol spre Maria" este o parte a unui plan de amenintare care, la rîndul său, este o parte a unui plan de capturare. Explicatia construită de sistem trebuie să fie completă, în sensul că toate actele volitive trebuie să fie motivate de scopurile umane existente în sistem. Fiecare actiune trebuie să motiveze realizarea unui scop sau să fie o parte a unui plan care conduce la îndeplinirea unui scop.

Procesul de generalizare din sistemul GENESIS trebuie să construiască o schemă pentru mai multe posibile povestiri. În acest scop, sistemul analizează explicatia povestirii pentru a determina aspectele relevante si, respectiv, nerelevante ale planului . Generalizarea elimină detaliile povestirii atît timp cît explicatia succesului planului rămîne validă. Dacă explicatia rămîne validă, planul generalizat va fi de asemenea îndeplinit cu succes. Din această cauză, abordarea din sistemul GENESIS poate fi considerată o învătare prin generalizare explicată.

Primul pas al procedurii de generalizare elimină din schemă portiunile retelei de dependente conceptuale care nu fac parte din explicatia povestirii. În particular sînt eliminate actiunile si asertiunile care nu sînt legate prin relatii de tipul "component" sau "motivatie" de structura planului care justifică scopul principal. Aceste asertiuni sînt eliminate deoarece nu contribuie la succesul planului. De exemplu, nodul asociat asertiunii "Maria poartă pantaloni" este eliminat din acest motiv. Al doilea pas al procedurii de generalizare elimină actiunile care reprezintă instante nominale ale planurilor complexe. Astfel, actiunile de îndreptare a pistolului spre Maria si de amenintare sînt eliminate, deoarece fac parte din planul compus de capturare. Cel de al treilea pas al procedurii de generalizare se face pe baza ierarhiei de obiecte din sistem, în particular pe baza relatiilor de tip ISA. Toate inferentele de tipul "Schema A este o instantă a schemei B", deci A ISA B, sînt eliminate (prin eliminarea schemei A si a legăturii spre schema B). De exemplu, dacă obiectul tată este legat printr-o relatie ISA de obiectul părinte, nodul asociat tatălui si legătura spre părinte sînt eliminate. Această eliminare este consistentă deoarece schema asociată scopului prioritar "Florin doreste să o recapete pe Maria mai mult decît doreste să păstreze cei 10.000.000 lei" a fost construită pe baza instantierii unei reguli de inferentă generale în care relatia dintre victimă si plătitor este o relatie de rudenie apropiată si nu neapărat aceea de fiică-tată.

Rezultatele procesului de învătare din sistemul GENESIS pot fi evaluate în termenii capacitătii sistemului de a răspunde la întrebări. Utilizînd schema învătată, sistemul GENESIS poate întelege si răspunde la întrebări despre alte povestiri cu răpiri, cum ar fi povestirea: "Tudor este sotul Anei. Tudor cîstigă 5.000.000 lei la LOTO. Dan o încuie pe Ana în subsolul casei sale si telefonează lui Tudor. Dan primeste 5.000.000 lei si o eliberează pe Ana". Această povestire nu ar fi putut fi înteleasă dacă sistemul nu ar fi sintetizat anterior, prin învătare, schema generală a răpirilor. Trebuie observat că cea de a doua povestire nu specifică explicit lucruri ca: cum a reusit Dan să o încuie pe Ana, de ce primeste Dan bani de la Tudor si în ce conditii Dan o eliberează pe Ana. Fără o schemă cauzală generală obtinută anterior, inferentele posibil de executat pentru întelegerea celei de a doua povestiri ar fi fost explozive combinational.

7.3.3 Învătarea euristicilor de control

Prezentarea acestei abordări a învătării prin generalizare explicată se va face pe baza discutării sistemului LEX-II [Mitchell,1982;Mitchell,1983]. LEX-II este un sistem de învătare a euristicilor de control în domeniul integrării simbolice automate. El a fost construit ca o extensie a sistemului LEX-I care utiliza o metodă de învătare inductivă, deci slabă, pentru învătarea conceptelor din exemple multiple. Sistemul LEX-II a combinat algoritmul de învătare din sistemul LEX-I, similar cu algoritmul de eliminare a candidatilor propus de Mitchell [1977], cu metoda învătării bazate pe explicatii care generalizează pe baza unui singur exemplu sau tip de exemplu. Scopul sistemului este acela de a învăta euristici care îmbunătătesc eficienta procesului de rezolvare a problemelor de integrare simbolică.

Sistemul LEX-II este format din patru componente de bază: generatorul de probleme, componenta de rezolvare a problemelor, componenta critică si componenta de generalizare, prezentate în Figura 7.8. Se observă similitudinea arhitecturii sistemului cu cea a unui sistem general de învătare (Sectiunea 7.1.2).

Figura 7.8 Arhitectura sistemului LEX-II

Componenta de rezolvare a problemelor are la dispozitie o multime de operatori de reducere a problemei în subprobleme (aproximativ 40), numiti si reguli de descriere. Exemple de astfel de reguli de rescriere sînt:

OP1. /* f(x) este orice functie reală */

OP2. /* r este orice număr real */

OP3.

OP4.

OP5.

OP6. /* integrare prin părti */

Fiecare operator are o conditie care specifică clasa de stări a problemei pentru care operatorul poate fi aplicat, deci pentru care operatorul este valid, si stările care pot rezulta prin aplicarea acestui operator. De exemplu, înainte de a putea aplica operatorul OP6, forma generală a integrantului trebuie să fie produsul a două functii reale, i.e. să fie de forma . Aplicarea operatorului OP6 poate conduce la obtinerea a două stări, fiecare stare corespunzînd unei instantieri diferite a variabilelor u cu si dv cu sau invers.

Regulile de aplicare a operatorilor în sistemul LEX-II sînt de forma:

dacă sablonul de integrat este P

atunci aplică OPm cu instantierea B

De exemplu, o regulă de rescriere tipică pentru operatorul OP6 ar fi:

R6.1: dacă sablonul de integrat este

atunci aplică OP6 cu instantierea si

Regulile de rescriere reprezintă euristici generale de aplicare a operatorilor. Învătarea în sistemul LEX-II constă în rafinarea regulilor de rescriere existente sau crearea unor reguli noi în scopul cresterii specificitătii de aplicare a acestora, si deci al reducerii spatiului de căutare. Astfel, modulul de învătare trebuie să găsească conditii mai restrictive de aplicare a operatorilor. Pentru fiecare operator, sistemul încearcă să învete un concept care descrie multimea de stări în care operatorul poate fi "util" aplicat. Stările în care un operator poate fi util aplicat sînt de obicei o submultime a stărilor în care operatorul poate fi valid aplicat.

Procesul de învătare începe în momentul în care generatorul de probleme selectează si generează probleme de integrare pentru a fi rezolvate de componenta de rezolvare a problemelor. Componenta de rezolvare a problemelor încearcă să rezolve problemele propuse de generator, prin metoda reducerii problemei la subprobleme, folosind regulile si operatorii sistemului. Se consideră că sistemul a găsit o solutie atunci cînd produce o expresie care nu contine integrale, expresiile care nu contin integrale reprezentînd probleme elementare. Componenta de rezolvare produce o solutie a problemei si o urmă completă a procesului de căutare, reprezentată sub forma unui arbore ȘI/SAU, asa cum se prezintă în Figura 7.9.

Figura 7.9 Parte a arborelui ȘI/SAU generat de componenta de rezolvare

Alegerea unei descompuneri (reguli) sau alta poate duce fie la solutia optimă, din punct de vedere al numărului de reguli generate, fie la o solutie mai putin bună fie, chiar, la căi de căutare care se blochează prin generarea de probleme neelementare care nu mai pot fi descompuse.

Urma completă a procesului de căutare a solutiei este transmisă componentei critice care etichetează aplicarea operatorilor din arbore ca fiind "utilă" sau "neutilă". Aplicarea unui operator de-a lungul căii spre solutie este considerată utilă, în timp ce aplicarea unui operator pe o altă cale de căutare este considerată neutilă. Această clasificare generează o multime de instante pozitive si negative ale aplicării fiecărui operator. Aceste exemple sînt folosite de componenta de generalizare pentru a învăta conditii mai restrictive de aplicare a operatorilor.

În sistemul LEX-I instantele clasificate ale aplicării operatorilor sînt prelucrate utilizînd algoritmul de eliminare a candidatilor pentru învătarea conceptelor din exemple, algoritm propus de Mitchell [1977]. Acest algoritm caută într-un spatiu al versiunilor care contine o multime initială de descrieri candidate ale conceptului de învătat. Descrierile candidatilor sînt legate prin relatii de generalizare si specializare care definesc o latice. Generalizarea se face pe baza exemplelor pozitive, iar specializarea pe baza celor negative. Componenta de generalizare a sistemului LEX-I generalizează si specializează pe baza unui arbore taxonomic de descrieri. O parte din acest arbore este prezentată în Figura 7.10. Astfel, dacă o regulă se aplică pentru mai multe functii trigonometrice, de exemplu sin si cos, regula poate fi generalizată specificînd functia trig.

Figura 7.10 Un segment din arborele de generalizare

Descrierile candidatilor sînt reprezentate prin conditiile de aplicare ale operatorilor. Fiecare operator are asociat, în spatiul versiunilor o multime de descrieri euristice caracteristice. Această multime este reprezentată sub forma a două descrieri limită: o descriere G care specifică cele mai generale conditii de aplicare a operatorului si o descriere S care specifică conditiile particulare de aplicare a operatorului. În timp ce sistemul învată, descrierea S este generalizată astfel încît să includă toate exemplele pozitive prezentate de componenta critică, în timp ce descrierea G este specializată pentru a exclude exemplele negative. Dacă componenta de generalizare consideră un număr suficient de exemple, descrierile S si G devin identice si se consideră că sistemul a învătat o euristică corectă.

Pentru a exemplifica acest proces, se consideră rafinarea descrierilor euristice ale operatorului OP6. Se presupune că generatorul de probleme a generat următoarele două probleme: si . În spatiul versiunilor, descrierile G si S asociate operatorului OP6 au forma prezentată în Figura 7.11.

Figura 7.11 Spatiul versiunilor cu limitele G si S

Functiile si sînt orice functii reale de o variabilă x, iar descrierea S este initializată cu prima problemă de rezolvat. Pentru prima problemă, componenta de rezolvare alege operatorul OP6 ca operator valid aplicabil. Pentru acest operator sînt posibile două instantieri diferite:

(a)

(b)

Dacă se foloseste instantierea (a), aplicarea operatorului OP6 produce expresia care poate fi redusă în continuare, folosind operatorii OP2, OP4 si alti operatori, la solutia corectă . Pentru această legare, componenta critică va considera această instantă ca un exemplu pozitiv.

Dacă se foloseste instantierea (b), aplicarea operatorului OP6 produce expresia mai complexă . În acest caz, componenta critică va considera această instantă ca un exemplu negativ. Exemplul negativ va fi folosit pentru a specializa descrierea G la sau la , cu legările corespunzătoare:

(a)

(b)

ambele legări excluzînd exemplul negativ.

Semnificatia acestei specializări este: se foloseste operatorul OP6 fie atunci cînd u este o functie polinomială, fie atunci cînd dv este o functie transcendentă. După găsirea solutiei si pentru , componenta critică consideră instantierea , tot ca un exemplu pozitiv. Dar acest exemplu nu este inclus în spatiul conceptului. În consecintă, descrierea S trebuie generalizată pentru a include si această instantă. Generalizarea se face prin căutarea în arborele taxonomic a functiei ce include atît sin(x) cît si cos(x). Această generalizare produce descrierea:

G

S

Prin rezolvări repetate ale problemelor de acest tip, sistemul LEX-I poate crea si rafina regulile euristice ale operatorilor.

Sistemul LEX-II a fost dezvoltat din sistemul LEX-I prin introducerea unor cunostinte suplimentare în modulul de învătare (componenta critică si componenta de generalizare) care să crească eficienta procesului de rafinare a regulilor euristice. În particular, sistemul LEX-II posedă o descriere a scopului procesului de învătare. Sitemul contine reguli care oferă o definitie abstractă a instantelor pozitive ale unui predicat, InstPoz, descrise în continuare.

Aceste reguli oferă definitii pentru o întreagă colectie de concepte, fiecare concept avînd asociat un operator. De exemplu, dacă regulile sînt instantiate prin legarea variabilei op la operatorul OP6, ele definesc conceptul care include toate stările ce satisfac predicatul . Parafrazînd aceste reguli, o stare s este o instantă pozitivă a operatorului op, dacă starea s nu este deja rezolvată si dacă aplicarea operatorului op stării s conduce la o stare care este fie rezolvată, fie rezolvabilă prin aplicări ulterioare ale altor operatori.

Organizarea modulului de învătare din sistemul LEX-II este prezentată în Figura 7.12. Sistemul prelucrează exemplele pozitive si negative în mod diferit. Exemplele pozitive sînt transmise unei proceduri de învătare bazată pe explicatii. Procedura generalizează instante pozitive unice prin utilizarea regulilor ce definesc predicatul InstPoz. Instantele pozitive generalizate sînt prezentate algoritmului de eliminare a candidatilor. Instantele negative sînt prezentate direct acestui algoritm, la fel ca în sistemul LEX-I.

Figura 7.12 Organizarea modulului de învătare în sistemul LEX-II

Procedura de învătare prin generalizare explicată primeste ca date de intrare o pereche , unde OP este operatorul aplicat în starea S si etichetat ca instantă pozitivă de componenta critică. Procedura de învătare bazată pe explicatii trebuie să găsească o generalizare a stării S, care să reprezinte o multime de stări pentru care operatorul OP este util. Învătarea se face utilizînd o procedură în doi pasi, similară cu cea din sistemul GENESIS: sistemul explică întîi de ce exemplul este o instantă pozitivă apoi generalizează exemplul analizînd această explicatie. În primul pas al procedurii se construieste o explicatie, sub forma unui arbore ȘI/SAU, care arată de ce perechea satisface definitia predicatului InstPoz. În cel de al doilea pas se analizează explicatia pentru a obtine o multime de conditii suficiente pentru ca orice stare s să satisfacă predicatul astfel:

se modifică constanta S într-o variabilă cuantificată universal s;

se extrage o multime de conditii care satisfac arborele ȘI/SAU ce reprezintă explicatia;

se traduc aceste conditii într-o formă generalizată prin exprimarea conditiilor în termenii restrictiilor stărilor din arborele solutie si propagarea acestor restrictii prin arborele solutie pentru a obtine restrictiile echivalente referitoare la starea s.

Se observă că procedura de învătare din sistemul LEX-II, la fel ca si cea din sistemul GENESIS, urmăreste aceleasi două etape ale procedurii de învătare prin generalizare explicată, procedură prezentată în Sectiunea 7.3.1. Cititorul îsi poate da seama în acest moment de meritele abordării unitare propuse de Mitchell, Keller si Kedar-Cabelli.

7.4 Exercitii si probleme

1. Se consideră sistemul STRIPS si problema de planificare descrisă în Figura 7.2.

(a) Să se construiască tabela de diferente generată de sistem după sinteza planului de rezolvare a acestei probleme (Sectiunea 7.2.3).

(b) Să se aplice algoritmul de învătare a macrooperatorilor si să se indice tabela de diferente generalizată construită de sistem pe baza tabelei de la punctul (a).

2. Se consideră următorii operatori în sistemul STRIPS, unde Robot este o constantă, iar u, c , c si b sînt variabile:

LP:

LE:

LA:

LP:

LE:

LA:

axioma domeniului si stările initială si finală ale unei probleme de planificare:

Si: Sf:

(a) Să se construiască planul de rezolvare a acestei probleme si tabela de diferente asociată.

(b) Să se aplice algoritmul de învătare a macrooperatorilor si să se construiască tabela de diferente generalizată.

3. Se consideră următoarea descriere a conceptului scop CEAȘCĂ(x):

Concept scop

Exemplul de învătare

Teoria domeniului

Criteriul de operationalitate

, , , ,

Să se aplice procedura de generalizare bazată pe explicatii pentru operationalizarea conceptului si să se descrie regresia modificată a scopului în acest caz.

7.5 Rezolvări

1. (a) Planul care rezolvă problema indicată este:

Tabela de diferente asociată acestui plan este prezentată în continuare.

*ARMEMPTY

1.

2.

3.

*ARMEMPTY

4.

ARMEMPTY

0

1

2

3

4

În cazul în care anumite preconditii ale operatorilor se demonstrează si pe baza unor axiome ale domeniului, aceste axiome se introduc de asemenea în tabela de diferente, urmînd regulile de introducere specificate pentru fapte. De exemplu, dacă formula nu apare în starea initială, dar există o axiomă pe baza căreia se deduce că un bloc este liber dacă nu există nici un bloc deasupra lui, atunci această axiomă trebuie introdusă în tabela de diferente în locul preconditiei .


Document Info


Accesari: 5491
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )