Documente Academic
Documente Profesional
Documente Cultură
Cap 09
Cap 09
80
numete ciclu. n graful din figura 1 [1, 2, 4, 5 ,1] este un ciclu elementar, iar [ 2, 1, 5 , 4, 2, 6, 3, 2] este ciclu (care nu este elementar). Un vrf care este extremitatea unei singure muchii se numete vrf terminal. Dou vrfuri unite printr-o muchie se numesc vrfuri adiacente. Un graf neorientat se numete conex dac oricare dou vrfuri diferite sunt unite ale sale prin cel pu in un lan . Graful din figura 1 nu este conex (de exemplu, vrfurile 1 i 7 nu sunt unite prin nici un lan ). n cazul unui graf neconex se pune problema determinrii componentelor sale conexe; o component conex este un subgraf conex maximal, i.e. un subgraf n care nici un vrf al su nu este unit cu nici un vrf din afara subgrafului printr-o muchie. Se observ c mpr ire unui subgraf n componenetele sale conexe determin o parti ie a mul imii vrfurilor. De exemplu, pentru graful din figura 1 se ob ine X = {1,2,3,4,5,6} {7,8}. Un graf orientat este o pereche ordonat G = (X,U), unde X este o mul ime finit i nevid de elemente numite noduri (sau vrfuri), iar U este o mul ime de perechi ordonate de elemente distincte ale lui X, numite arce. Un arc avnd vrfurile i i j (numite extremit ile sale) se noteaz prin (i, j). Deci, deosebirea fa de grafurile neorientate const n faptul c fiecare arc (i, j) are un sens de parcurgere i anume de la extremitatea sa ini ial la extremitatea sa final. Exemplu 2. Graful orientat G = (X = {1,2,3,4,5,6,7,8}, U={(1,2), (5,1), (2,3), (2,4), (6,2), (3,6), (4,5), (8,7)}) poate fi reprezentat grafic ca n figura 2. 7 8 5 Figura 2 n cazul grafurilor orientate, no iunile de lan i ciclu i au corespondentul n no iunile de drum i circuit. Astfel n graful din figura 2: (1,2,3,6,2,4) este un drum (1,2,3,6) este un drum elementar (1,2,3,6,2,4,5,1) este un circuit (1,2,4,5,1) este un circuit elementar 1 2 4 6 3
81
n cele ce urmeaz vom considera problema aflrii drumurilor elementare dintre dou vrfuri i a circuitelor elementare dintre dou vrfuri. Mul imea vrfurilor grafului se poate defini cu ajutorul predicatului multime_varfuri([lista de vfuri]), iar un arc de la i la j cu ajutorul predicatului arc1(i,j). forma: predicates arc1(varf,varf) multime_varfuri(lista_varfuri) i s con in n sec iunea clauses faptele care definesc mul imea de vrfuri i arcele grafului considerat. n programul urmtor se presupune c graful este definit n fiierul graf.dat. Acest fiier trebuie s con in declara ia predicatelor multime_varfuri i arc1 sub
domains varf=symbol lista_varfuri=varf* include "graf.dat" predicates apartine(varf,lista_varfuri) nr_elem(lista_varfuri,integer) invers(lista_varfuri,lista_varfuri) inv(lista_varfuri,lista_varfuri,lista_varfuri) afis(lista_varfuri) nod_graf(varf) nod_initial(varf) extremitati(varf,varf) drum(varf,varf,lista_varfuri,lista_varfuri) drum_elem(varf,varf,lista_varfuri) circuit_elem(varf,lista_varfuri) fer meniu selectie(char)
82
start clauses apartine(X,[X|_]). apartine(X,[_|Y]):-apartine(X,Y). nr_elem([],0). nr_elem([_|X],N):-nr_elem(X,N1),N=N1+1. invers(X,Y):-inv(X,[],Y). inv([],X,X). inv([H|X],Y,Z):-inv(X,[H|Y],Z). afis([X]):-write(X),!. afis([H|X]):-write(H," -> "),afis(X). fer:-makewindow(1,113,36,"Drumuri si circuite elementare",0,0,25,80). nod_graf(X):-multime_varfuri(L),apartine(X,L). extremitati(X,Y):-write("Nodul initial = "), readln(X), write("Nodul final = "), readln(Y), write("\nDrumurile elementare de la ",X," la ",Y, ":\n"). nod_initial(X):-write("Nodul initial = "),readln(X), write("\nCircuitele elementare cu nodul initial (si final) ",X,":\n"). drum(X,X,Y,Z):-invers(Y,Z). drum(X,Z,L,P):-arc1(X,Y),not(apartine(Y,L)),drum(Y,Z,[Y|L],P). drum_elem(X,Y,L):-drum(X,Y,[X],L). circuit_elem(X,[X|L]):-drum(X,X,[],L),nr_elem(L,N),N>1. meniu:-cursor(5,10), write("t --> pentru afisarea tuturor drumurilor elementare"), cursor(7,10), write("d --> pentru afisarea drumurilor elementare dintre doua noduri"), cursor(9,10), write("z --> pentru afisarea tuturor circuitelor elementare"), cursor(11,10), write("c --> pentru afisarea circuitelor elementare cu nod initial fixat"), cursor(13,10), write("e --> pentru iesire "),
Dezvoltarea sistemelor expert n PROLOG readchar(X),clearwindow,X<>'e',selectie(X),meniu. meniu. selectie('t'):- write("Drumuri elementare:\n"), nod_graf(X),nod_graf(Y), write("apasati orice tasta...\n\n"),readchar(_), write("Drumuri elementare de la ",X, " la ",Y,":\n"), drum_elem(X,Y,L),afis(L), write("\n"),fail. selectie('t'):-clearwindow. selectie('d'):-extremitati(X,Y),drum_elem(X,Y,L),afis(L),write("\n"),fail. selectie('d'):-write("\n\n selectie('c'):-write("\n\n apasati orice tasta..."),readchar(_),clearwindow. apasati orice tasta..."),readchar(_),clearwindow. selectie('c'):-nod_initial(X),circuit_elem(X,L),afis(L),write("\n"),fail. selectie('z'):- write("Circuite elementare:\n"), nod_graf(X),write("apasati orice tasta...\n\n"),readchar(_), write("Circuite elementare cu nodul initial (si final) ", X, ":\n"), circuit_elem(X,L),afis(L), write("\n") ,fail. selectie('z'):-clearwindow. start:-fer,meniu,removewindow.
83
Predicatul drum_elem(X,Y,L) are urmtoarea semnifica ie: L este lista vrfurilor din drumul elementar care leag X de Y; X i Y sunt argumente de intrare iar L argument de ieire. Predicatul circuit_elem(X,L) are dou argumente: X este argument de intrare i reprezint nodul ini ial (deci i final), i L este lista nodurilor prin care trece circuitul. Predicatele invers, inv, nr_elem, i apartine au fost explicate n capitolul n care s-a prezentat prelucrarea listelor. Un exemplu de fiier graf.dat este urmtorul: predicates arc1(varf,varf) multime_varfuri(lista_varfuri) clauses
84
multime_varfuri([a,b,c,d,e,f,g,h,i]). arc1(a,b). arc1(b,c). arc1(b,e). arc1(c,d). arc1(c,f). arc1(d,e). arc1(e,a). arc1(e,c). arc1(f,b). arc1(f,a). arc1(g,h). arc1(h,i). arc1(i,g). Programul anterior poate fi folosit i pentru aflarea lan urilor elementare i a ciclurilor elementare ntr-un graf neorientat, dac pentru fiecare fapt de forma arc1(i,j), din fiierul graf.dat, se adaug faptul arc1(j,i). Arborele este un graf neorientat conex i fr cicluri. Un exemplu de arbore apare n figura 3. 1 2 3 4 9 7 8 10 Figura 3 n multe aplica ii, arborele este nso it de punerea n eviden a unui vrf numit rdcin. Acest lucru are urmtoarele consecin e: putem aeza arborele pe nivele astfel se plaseaz rdcina pe nivelul 1; se plaseaz pe fiecare nivel i 2 vrfurile pentru care lungimea lan urilor care le leag de rdcin este i 1; se traseaz muchiile grafului. 5 6
85
arborele devine graf orientat, stabilindu-se pentru fiecare muchie un sens de parcurgere i anume de la nivelul superior (cu numr de ordine mai mic) la nivelul imediat inferior (cu numr de ordine mai mic cu o unitate). De exemplu pentru arborele din figura 3 alegndu-se drept rdcin vrful 4 ob inem arborele aezat pe nivele din figura 4 1 2 3 4 1 3 2 6 7 Figura 4 Graful orientat ob inut este urmtorul: 4 2 1 3 6 7 Figura 5 Cele de mai sus justific urmtoarele denumiri pentru arborii aeza i pe nivele nivelul cu numr de ordine maxim se numete nl imea arborelui; vrfurile de un nivel i 2 legate de acelai vrf k de pe nivelul i-1 se numesc succesorii (sau descenden ii direc i, sau fiii ) vrfului k, iar k poart numele de ascendent direct (sau tat) al acestor vrfuri; numrul de descenden i direc i ai unui vrf se numete gradul vrfului; vrfurile cu grad zero se numesc vrfuri frunz (sau terminale); celelalte vrfuri se numesc vrfuri interne (sau neterminale); 5 8 9 10 4 5 8 9 10
86
dac exist un drum de la vrful i de pe nivelul m la un vrf j de pe nivelul n m+1, atunci i se numete ascendent al lui j, iar j descendent al lui i; Un arbore se numete arbore n-ar dac valoarea maxim a gradului vrfurilor sale este n. Dac toate vrfurile sale au acelai grad, n, arborele se numete arbore n-ar strict. n cazul n = 2 arborele se numete binar, respectiv binar strict.
87
unde pentru fiecare arc (N, X), cu N A i X D, p(X) reprezint probabilitatea ataat arcului (N, X), iar pentru un nod X D A, Succ(X) reprezint mul imea succesorilor (descenden ilor direc i) ai lui X. Pentru fiecare nod decizional speran a matematic indic nivelul de importan al deciziei optime din nodul N. Metoda arborilor de decizie presupune reprezentarea situa iei decizionale printr-un arbore, i determinarea apoi a nivelului de importan al variantelor decizionale prin calculul speran ei matematice.
88
decizia optim, n cazul n care X este nod decizional (dac X nu este nod decizional Z = n); X este argument de intrare, Y i Z sunt argumente de ieire. Fiierul arbore.dat trebuie s con in declara iile urmtoarelor predicate:
domains nod_decizie=nd(symbol) nod_aleator=na(symbol) nod_con_ec=nc(real) nod=nd(symbol);na(symbol);nc(real) nod_decizie_sau_consecinta=nd(symbol);nc(real) decizie=symbol caz=symbol probabilitate=real nod_decizie_succ=dn(decizie,nod_aleator) nod_aleator_succ=cpn(caz,probabilitate,nod_decizie_sau_consecinta) lista_succesori_nod_decizie=nod_decizie_succ* lista_succesori_nod_aleator=nod_aleator_succ* include "arbore.dat" predicates max(lista_succesori_nod_decizie,real,decizie) medie(lista_succesori_nod_aleator,real) speranta(nod,real,decizie) meniu selectie(char) start
89
90
shiftwindow(3), write("\n\n Speranta pentru nodul decizie: ",X," este ",Y,"\n"), write("\n Decizia ce trebuie luata este ", Z, "\n"), write("\n apasati orice tasta..."), Nod = readchar(_),clearwindow,shiftwindow(1). selectie('a'):-shiftwindow(2),clearwindow,write("\n\n\n "),readln(X),speranta(na(X),Y,_), shiftwindow(3), write("\n\n\n Speranta pentru nodul aleator: ",X," este ",Y,"\n"), write("\n\n apasati orice tasta..."), readchar(_),clearwindow,shiftwindow(1). selectie('c'):-shiftwindow(2),clearwindow, write("\n\n\n Nod = "), readln(C),nod_consecinta_economica(C,nc(X)),speranta(nc(X),Y,_), shiftwindow(3), write("\n\n\n Speranta pentru nodul consecinta: ",C," este ",Y,"\n"), write("\n\n apasati orice tasta..."), readchar(_),clearwindow,shiftwindow(1). start:-ferestre,meniu,sterge_ferestre.
Reproducem n continuarea un exemplu de problem de decizie din [17] (pg. 248), i apoi i asociem arborele de decizie corespunztor, i fiierul arbore.dat, care descrie acest arbore. Lan ul decizional optim poate fi aflat prin interogarea programului anterior.
Exemplu. O editur studiaz posibilitatea publicrii unui volum special ocazionat de
aniversarea unui anumit eveniment cultural-istoric. Dac decizia este pozitiv se pune apoi problema determinrii tirajului avnd n vedere urmtoarele costuri de produc ie: pentru drepturi de autor = 170 000 u.m.; costuri fixe = 130 000 u.m.; cost variabil unitar = 30 u.m.;
91
Editura ar putea testa succesul volumului n chestiune punndu-l n vnzare pe o pia regional (sau ntr-un numr de librrii alese la ntmplare). n acest scop va produce 5 000 de exemplare astfel c investi ia va fi: I1 = 170 000 + 130 000 + 5000 30 = 450 000 u.m. Dac va decide s pun n vnzare volumul pe toat pia a fr s-l testeze, va tiprii 50 000 exemplare astfel c n acest caz costul investi iei va fi: I2 = 170 000 + 130 000 + 50 000 30 = 1 800 000 u.m. n situa ia n care testul regional este pozitiv editura va tiprii nc 45 000 de exemplare pe care le va vinde pe toat pia a, costul investi iei fiind: I3 = 130 000 + 45 000 30 =1 480 000 Se apreciaz c probabilitatea ca testul s fie pozitiv este 80% i de nereuit 20%. De asemenea, se apreciaz c n cazul unui test pozitiv vnzarea pe ntreaga pia are succes cu o probabilitate de 75% i insucces cu 25%, iar n cazul unui test negativ c probabilitatea de succes este 35% i de insucces 65%. S remarcm c am considerat de fiecare dat doar dou situa ii (stri ale naturii sau beneficiilor) i anume succesul care presupune vnzarea volumului sau insuccesul cnd acesta nu se vinde (n sensul c numrul exemplarelor vndute este mic n raport cu tirajul i l socotim practic zero). S mai presupunem c n cazul netestrii pie ei se apreciaz c succesul de vnzare ar fi 60% i insuccesul 40%. Pre ul de vnzare al volumului se determin a fi 80 u.m. Arborele de decizie este reprezentat n figura 6.
test_pia Da succes1 Da(80%) vanzare1 Da succes3 Da(75%) Nu (20%) Nu esec1 Da succes4 Nu (20%) vanzare2 Nu esec2 100% Da(60%) c7 Nu succes2 Nu(40 %) c8
92
c1
c2
c3
c4 Figura 6
c5
c6
Am reprezentat nodurile decizionale prin dreptunghiuri, nodurile aleatoare prin elipse i nodurile consecin economic prin cercuri. Calculm beneficiile asociate fiecrei consecin e c1, c2, , c8 (notate b1,b2, , b8, respectiv). Pentru a nu complica exemplul nu se iau n considerare dect costurile de produc ie i ncasrile. n baza informa iilor de mai sus se ob ine: b1 = 45 000 80 (45 000 30 + 130 000) + 5 000 80 (170 000 + 130 00000 + 5 000 30) = 2 070 000 u.m. b2 = 0 (45 000 30 + 130 000) + 5 000 80 (170 000 + 130 00000 + 5 000 30) = -1 530 000 u.m. b3 = 5 000 80 (170 000 + 130 00000 + 5 000 30) = -50 000 u.m. b4 = 45 000 80 (45 000 30 + 130 000) + 0 (170 000 + 130 00000 + 5 000 30) = 1 670 000 u.m. b5 = 0 - (45 000 30 + 130 000)+ 0+ (170 000 + 130 00000 + 5 000 30) = - 1 930 000 u.m. b6 = 0 0 + 0 (170 000 + 130 00000 + 5 000 30) = -450 000 u.m. b7 = 5 000 80 ( 50 000 30 + 130 00000) + 0 170 000= 2 200 000 u.m. b8 = 0 - (50 000 30 + 130 000) + 0 + 170 000 = -1 800 000 Fiierul (arbore.dat) care con ine descrierea arborelui de decizie de mai sus este urmtorul:
predicates nod_decizie_si_succesori(nod_decizie,lista_succesori_nod_decizie) nod_aleator_si_succesori(nod_aleator,lista_succesori_nod_aleator) nod_consecinta_economica(symbol,nod_con_ec) clauses nod_decizie_si_succesori(nd(test_piata), [dn(da,na(succes1)),dn(nu,na(succes2))]).
93