Documente Academic
Documente Profesional
Documente Cultură
Chiinu
Editura Tehnica-UTM
2014
U.T.M., 2014
Cuprins
CAPITOLUL I
LUCRAREA DE LABORATOR nr. 1 ............................................ 5
Introducere n limbajul Prolog
LUCRAREA DE LABORATOR nr. 2 .......................................... 15
Mecanisme de control al procesului de backtracking
LUCRAREA DE LABORATOR nr. 3 .......................................... 23
Structuri de date n Prolog
CAPITOLUL II
Exemple i probleme n limbajul Prolog ....................................... 30
LUCRAREA DE LABORATOR nr. 4 .......................................... 30
Sisteme expert
LUCRAREA DE LABORATOR nr. 5 .......................................... 39
Prelucrarea limbajului natural
LUCRAREA DE LABORATOR nr. 6 .......................................... 57
Algoritmi de recunoatere
LUCRAREA DE LABORATOR nr. 7 .......................................... 63
Algoritmi de recunoatere a imaginilor
LUCRAREA DE LABORATOR nr. 8 .......................................... 68
Reelele neuronale Hamming
LUCRAREA DE LABORATOR nr. 9 .......................................... 79
Reelele neuronale Hebb
BIBLIOGRAFIE ............................................................................ 92
3
ANEXE .......................................................................................... 93
Anexa 1 .......................................................................................... 93
Mediul GNU Prolog
CAPITOLUL I
LUCRAREA DE LABORATOR nr. 1
Introducere n limbajul Prolog
Scopul: nsuirea principiilor fundamentale de programare a
limbajului Prolog
PARTEA 1. Noiuni teoretice
1.1. Entitile limbajului Prolog
Prolog este un limbaj logic, descriptiv care permite specificarea
spaiului problemei i a soluiei acesteia, opernd n termeni de fapte
cunoscute despre obiectele universului problemei i ale relaiilor existente
ntre aceste obiecte. Execuia unui program Prolog const n deducerea
implicaiilor dintre aceste fapte i relaii, programul definind astfel o
mulime de consecine ce reprezint nelesul sau semnificaia declarativ
a programului.
Un program Prolog conine urmtoarele entiti:
fapte despre obiecte i relaiile existente ntre aceste
obiecte;
reguli despre obiecte i relaiile dintre acestea care
permit deducerea (inferarea) unor fapte noi n baza celor
cunoscute;
ntrebri, numite i scopuri, despre obiecte i relaiile
acestora, la care programul rspunde n baza faptelor i regulilor
existente.
1.1.1. Fapte
Faptele sunt predicate de ordinul nti de aritate n considerate
adevrate (reprezint cea mai simpl forma de predicat din Prolog). Ele
stabilesc relaiile dintre obiectele universului problemei. Numrul de
Aritate:
cine(grivei).
place(ion, ioana).
place(ion, ana).
frumoas(ana).
bun(daniel).
1.1.3. Reguli
O regul Prolog exprim un fapt care depinde de alte fapte i are
forma:
S :- S1, S2, Sn.
Fiecare Si, i =1,n i S au forma faptelor Prolog, deci sunt
predicate cu argumente constante, variabile sau structuri. Faptul S care
definete regula se numete antet de regul, iar S1, S2, Sn formeaz
corpul regulii i reprezint conjuncia (unificarea) scopurilor care trebuie
satisfcute pentru satisfacerea ulterioar a antetului regulii.
Fie urmtoarea baz de cunotine Prolog:
Ana este frumoas.
frumoasa(ana).
% Ipoteza 1
Ion este bun.
bun(ion).
% Ipoteza 2
Ion o cunoate pe Maria. cunoaste(ion, maria).
% Ipoteza 3
Ion o cunoate pe Ana. cunoaste(ion, ana).
% Ipoteza 4
Mihai o place pe Maria. place(mihai, maria).
% Ipoteza 5
Dac dou persoane X i Y se cunosc i persoana X este bun i
persoana Y este frumoas, atunci cele dou persoane, X i Y, se plac.
place(X, Y) :- bun(X), cunoaste(X, Y), frumoasa(Y). % Ipoteza 6
Enunul de la ipoteza 6 definete o regul Prolog. Relaia
place(Cine, PeCine) este definit att printr-un fapt (Ipoteza 5), ct i
printr-o regul (Ipoteza 6). n condiiile existenei regulilor n baza de
cunotine Prolog, satisfacerea unui scop se face printr-un procedeu
similar cu cel prezentat n seciunea b), iar unificarea scopului se ncearc
att cu fapte din baza de cunotine, ct i cu antetul regulilor de baz. La
8
unificarea unui scop cu antetul unei reguli, pentru satisfacerea acest scop
trebuie satisfcut i regula. Aceasta, se reduce la satisfacerea tuturor
faptelor din corpul regulii, deci conjuncia scopurilor. Scopurile din corpul
regulii devin subscopuri a cror satisfacere se va ncerca printr-un
mecanism similar cu cel al satisfacerii scopului iniial.
Pentru baza de cunotine descris mai sus, satisfacerea scopului
?- place(ion, ana). se va produce astfel: scopul se unific cu antetul
regulii (6) i duce la instanierea variabilelor din regula (6): X = ion i Y =
ana. Pentru ca acest scop s fie ndeplinit, trebuie ndeplinit regula, deci
fiecare subscop din corpul acesteia. Aceasta revine la ndeplinirea
scopurilor bun(ion), care este satisfcut prin unificare cu faptul (2)
cunoaste(ion, ana), satisfcut prin unificare cu faptul (4) i a scopului
frumoasa(ana), care este satisfcut prin unificare cu faptul (1). n
consecin, regula a fost ndeplinit, deci i ntrebarea iniial este
satisfcut (adevrat), iar sistemul rspunde yes.
n continuare vom observa ce se ntmpl dac se pune ntrebarea:
?- place(X, Y).
Prima soluie a acestui scop este dat de unificarea cu faptul (5),
iar rspunsul este:
X = mihai, Y = maria
Sistemul Prolog va pune un marcaj n dreptul faptului (5) care a
satisfcut scopul. Urmtoarea soluie a scopului place(X, Y) se obine
ncepnd cutarea de la acest marcaj n continuare n baza de cunotine.
Scopul se unific cu antetul regulii (6) i se vor fixa trei noi subscopuri de
ndeplinit, bun(X), cunoaste(X, Y) i frumoasa(Y). Scopul bun(X) este
satisfcut de faptul (2) i variabila X este instaniat cu valoarea ion,
X=ion. Se ncearc apoi satisfacerea scopului cunoaste(ion, Y), care este
satisfcut de faptul (3) i determin instanierea Y = maria. Se introduce
n baza de cunotine un marcaj asociat scopului cunoaste(ion, Y), care a
fost satisfcut de faptul (3). Se ncearc apoi satisfacerea scopului
frumoasa(maria). Acesta eueaz. n acest moment sistemul intr ntr-un
proces de backtracking n care se ncearc resatisfacerea scopului anterior
satisfcut, cunoaste(ion, Y), n sperana c o noua soluie a acestui scop
va putea satisface i scopul curent care a euat, frumoasa(Y). Resatisfacerea scopului cunoaste(ion, Y) se face pornind cutarea de la
marcajul asociat scopului n jos, deci de la faptul (3) n jos. O nou soluie
(resatisfacere) a scopului cunoaste(ion, Y) este dat de faptul (4) care
determin instanierea Y = ana. n acest moment se ncearc satisfacerea
9
Observaii:
La satisfacerea unei conjuncii de scopuri n Prolog, se ncearc
satisfacerea fiecrui scop pe rnd, de la stnga la dreapta. Prima
satisfacere a unui scop determin plasarea unui marcaj n baza de
cunotine n dreptul faptului sau regulii care a determinat satisfacerea
scopului.
Dac un scop nu poate fi satisfcut (eueaz), sistemul Prolog
reitereaz i ncearc resatisfacerea scopului din stnga, pornind cutarea
n baza de cunotine de la marcaj n mod descendent. nainte de
resatisfacerea unui scop se elimin toate instanierile de variabile
determinate de ultima satisfacere a acestuia. Dac cel mai din stnga scop
din conjuncia de scopuri nu poate fi satisfcut, ntreaga conjuncie de
scopuri eueaz.
Aceast comportare a sistemului Prolog n care se ncearc n
mod repetat satisfacerea i resatisfacerea scopurilor din conjunciile de
scopuri se numete backtracking.
10
12
Figura 1.2. Graful pentru relaiile bunic- nepot utiliznd relaii deja
definite
copil(Copil,Parinte):-parinte(Parinte,Copil).
Pn la acest moment, am definit reguli bazate pe relaiile directe
dintre persoanele ce alctuiesc baza de cunotine. n continuare, vom
defini dou reguli care reprezint relaiile indirecte dintre persoanele din
baza de cunotine. Vom defini regula bunic i regula nepot utiliznd
relaiile prezentate n Figura 1.2..
Pentru a afla bunicul Z al unei persoane X, procedm astfel:
Cine este printele lui X? (presupunem c este Y).
Cine este printele lui Y? (presupunem c este Z).
Deci, Z va fi bunicul lui X.
Relaia sora, de exemplu, poate fi descris de urmtorul algoritm:
Pentru orice X i Y,
X este sora lui Y dac
(1) X i Y au acelai printe, i
(2) X este femeie.
O posibil implementare n Prolog a algoritmului dat mai sus este
urmtoarea:
sora(X,Y):-parinte(Z,X), parinte(Z,Y), femeie(X), X <>Y.
Menionm c modalitatea n care X i Y au acelai printe a fost
prezentat anterior. n Prolog, operatorul <> are sensul de diferit.
13
14
%1
%2
f(X, 4) :- 6 =< X.
%3
La ntrebarea:
?- f(1, Y).
Y=0
rspunsul sistemului indic faptul c valoarea funciei pentru X=1 este
Y=0. Dac se pune ntrebarea format din conjuncia de scopuri:
?- f(1, Y), 2 < Y.
no
sistemul semnaleaz un eec. Arborii de deducie corespunztori sunt
reprezentai n Figura 2.1.
Se observ c se ncearc resatisfacerea primului scop cu regulile
2 i 3, iar acest lucru este inutil datorit semanticii acestor reguli. Astfel,
dac o valoare mai mic dect 3 pentru X duce la eecul scopului S din
conjuncia de scopuri f(X, Y), S, este inutil s se ncerce resatisfacerea
scopului f, deoarece aceasta nu este posibil. ncercarea de resatisfacere a
scopului f(X, Y) poate fi mpiedicat prin introducerea predicatului cut.
15
?-rau(gelu).
no
?- rau(petru).
yes
n cazul n care predicatul fail este folosit pentru a determina un
eec, cum i n cazul exemplului de mai sus, acesta este de obicei precedat
de predicatul cut, deoarece procesul de backtracking pe scopurile care l
preced este inutil, scopul eund oricum datorit lui fail.
Exist cazuri n care predicatul fail este introdus intenionat
pentru a genera procesul de backtracking pentru scopurile care l preced,
proces interesant nu att din punctul de vedere al posibilitii de resatisfacere a scopului ce conine fail, ct din punctul de vedere al efectului
lateral al acestuia.
rosu(mar).
rosu(cub).
rosu(soare.
afisare(X) :- rosu(X),
write(X),fail.
afisare( _ ).
Scopul afisare(X) va afia toate obiectele roii cunoscute de
programul Prolog datorit procesului de backtracking generat de fail;
astfel, cu ajutorul lui fail se realizeaz o iteraie pentru faptele rosu().
Clauza afisare( _ ) se adug pentru ca rspunsul final la
satisfacerea scopului s fie afirmativ. n acest caz, introducerea unui cut
nainte de fail ar fi determinat numai afiarea primului obiect rou din
program.
Analiznd combinaia !,fail, se consider n continuare
implementarea n Prolog a afirmaiei: "Mihai iubete toate sporturile cu
excepia boxului". Aceast afirmaie poate fi exprimat n pseudocod n
forma:
dac X este sport i X este box
atunci Mihai iubete X este fals
altfel dac X este sport
atunci Mihai iubete X este adevrat
19
20
punctul 2., utiliznd cut verde cel puin n dou reguli din baza de
cunotine.
5. Introducei schimbrile corespunztoare n programul din
punctul 2., utiliznd cut rou n reguli din baza de cunotine. Tragei
concluzii.
6. Prezentai darea de seam.
22
unde tip este un tip standard sau definit de utilizator. O list este compus
conceptul din dou pri:
cap (head), care desemneaz primul element din list;
rest (tail), care desemneaz lista elementelor rmase dup
eliminarea primului element.
Restul unei liste se mai numete corpul sau coada unei liste i este
ntotdeauna o list. Exemplele urmtoare ilustreaz modul n care se
structureaz o list (tabelul 3.1).
23
Coada
['a','b','c']
'a'
['b','c']
['a']
'a'
[]
[]
nedefinit
nedefinit
[[1,2,3],[2,3,4],[ [1,2,3]
]]
[[2,3,4],[]
]
Lista2
Legarea variabilelor
[X,Y,Z]
[7]
[X,Y]
X=7, Y=[]
[1,2,3,4]
[X,Y|Z]
[1,2]
[3|X]
esec
25
Martie
yes
26
27
9].
28
Scriei
un
program
care
utilizeaz
predicatul
iar al doilea argument returneaz o list cu toate numerele pare din prima
list.
1.14. S se elimine primele N elemente de la nceputul unei
liste. Numrul elementelor pentru eliminare se va introduce utiliznd
predicatul readln al limbajului Prolog.
1.15. S se elimine ultimele N elemente a unei liste. Numrul
elementelor pentru eliminare se va introduce utiliznd predicatul readln
al limbajului Prolog.
2. Se va prezenta darea de seam.
29
CAPITOLUL II
Exemple i probleme n limbajul Prolog
LUCRAREA DE LABORATOR nr. 4
Sisteme expert
Scopul: Studierea principiilor de proiectare i de organizare a sistemelor
expert bazate pe logic i reguli.
comparaie sau nu este epuizat toat BC, iar valoarea nu este gsit. n
cazul n care MI detecteaz c pot fi apelate mai mult dect o regul,
ncepe procesul de soluionare a conflictului. n soluionarea conflictului
prioritate se d regulilor care sunt mai specifice, sau regulilor ce in de
mai multe date actuale.
n SE, bazate pe logic, interogrile sunt transformate n valori
care sunt comparate cu listele de valori prezente n BC.
Procesul de unificare n programele Turbo Prolog i Visual Prolog
ajut la rezolvarea problemei de gsire i comparare dup exemplu i nu
necesit scrierea unor reguli suplimentare. Ca i n sistemele bazate pe
reguli, n cel bazat pe logic, utilizatorul obine rspunsuri la interogrile
(scopurile) sale, n conformitate cu logica stabilit n SE. Pentru punerea
n aplicare a mecanismului de extragere a rspunsului expertului este
suficient s se scrie specificaiile necesare.
4.3. Sistemul expert bazat pe reguli i realizarea lui
SE pe baza regulilor permite proiectantului a construi regulile
care sunt n mod natural combinate n grupuri de fragmente de cunotine.
Independena reciproc a regulilor de producie face ca baza de reguli s
fie semantic modular i capabil de dezvoltare.
Realizarea n Turbo Prolog (sau Visual Prolog) a SE bazat pe
reguli conine un set de reguli care sunt invocate de ctre datele de intrare
n momentul de corelare (comparare). mpreun cu regulile MI, SE este
compus dintr-un interpretator care selecteaz i activeaz diferite sisteme.
Activitatea acestui interpretator este descris ntr-o succesiune de
trei etape:
1) Interpretatorul compar un exemplu de regul cu elementele de
date n baza de cunotine.
2) n cazul n care este posibil apelarea mai multor reguli, pentru
a selecta o regul, se utilizeaz mecanismul de soluionare a conflictelor.
3) Regula selectat este folosit pentru a gsi un rspuns la
aceast ntrebare.
Acest proces n trei etape este ciclic i se numete ciclul de
detectare-aciune. Rspunsul afirmativ al SE este rezultatul uneia din
regulile de producie. Selecia regulii se efectueaz, n conformitate cu
datele de intrare.
32
Mecanismul de consultare
Predicatul dlg_Ask creeaz o fereastr standard de dialog pentru
a obine rspunsul utilizatorului la ntrebarea Da/Nu.
ask(X, Y):
concat(Intrebare : X, Temp),
concat(Temp, , Temp1),
concat(Temp1, Y, Temp2),
concat(Temp2, ?, Quest),
Reply1=dlg_Ask(Consultare, Quest, [D, Nu]),
Reply=Reply1+1,
remember(X, Y, Reply).
34
35
36
check(Rule_number, History,
[Breed_cond|Rest_breed_cond_list]):
cond(Breed_cond, Text),
ask_question(Breed_cond, Text),
check(Rule_number, History,
Rest_breed_cond_list).
check(_, _, [ ]).
do_answer(Cond_number, 1): !,
assertz(yes(Cond_number)).
do_answer(Cond_number, 2): !,
assertz(no(Cond_number)), fail.
37
Domeniul
Microprocesoare
Dispozitive mobile
Sisteme operaionale
Limbaje de programare
Jocuri pe computere
Virui de computere
Reele de calculatoare
Algoritmi de sortare
Algoritmi de cutare
38
39
E emitor
C - bloc de codificare
Z - zgomot extern
D - bloc de decodificare
R receptor
M - mesaj
f(M) mesajul codificat n limbaj
f1(M) codificarea modificat de zgomot
M1 mesajul nou
Emitor:
intenie - dorina emitorului de a transmite un mesaj ctre un
receptor;
generare - crearea inteniei de a comunica i a coninutului ei ntrun limbaj;
sintez - procesul efectiv de trimitere a mesajului.
40
Receptor:
percepie - procesul de recepionare a mesajului;
analiza - interpretarea mesajului din punct de vedere lexical,
sintactic, semantic, pragmatic;
dezambiguizarea selecia dintre posibilele rezultate ale analizei;
ncorporare introducerea coninutului mesajului.
Actul de comunicare
Acesta conine mai multe interpretri/sensuri:
Locuia fraza, aa cum e spus de locutor (emitor);
Ilocuie nelesul frazei ce se dorete a fi comunicat;
interlocuiune aciunea ce rezult din locuie.
Exemplu:
Maria i-a spus lui Ionic: "Te rog nchide ua"
locuie
ilocuie
interlocuiune
ua nchis
Categorii locuionale:
asertive asculttorul este informat n legtur cu fraza;
directive asculttorul efectueaz o aciune dup aflarea
informaiei;
comisive (angajamente) asculttorul afl de aciuni viitoare;
expresive mesaje ce exprim atitudinea emitorului legat
de un fapt.
5.1.2. Definirea unui limbaj
Un prim element ntr-un limbaj este lexiconul. Acesta conine
termenii vocabularului pentru limbajul respectiv.
Exemplu:
Lexicon:
Noun breeze | wumpus | ball
Verb is | see | smell | hit
Adjective right | left | smelly
Adverb here | there | ahead
Pronoun me | you | I | it
41
7. NP, Verb, NP
8. NP, VP
9. S
5.1.4. Definite Clause Grammar (DCG)
Exist mai multe tipuri de reprezentare pentru gramatici pe care le
expunem n continuare:
a) Gramatici n forma BNF (Backus Normal Form sau
BackusNaur Form) modul formal matematic de descriere a
limbajului.
Sunt gramatici dependente de context, bazate pe expresii de
forma:
<simbol> ::= _expresie_
unde,
<simbol> - un neterminal, iar _expresie_- o secven de
44
Proprieti:
aceeai gramatic se folosete i pentru analiz (recunoatere) i
pentru generare;
procesul de analiz lexical (parsing) se realizeaz exclusiv prin
inferene logice;
ca abordare:
a. Bottom-up parsing forward chaining;
b. Top-down parsing backward chaining.
Folosirea predicatelor are loc astfel:
NP(s) este adevrat dac s este NP
deci,
S NP VP
va deveni
NP(s1) VP(s2) S(append(s1,s2)).
n BNF:
S NP VP
n LP / DGC:
NP(s1) VP(s2) S(append(s1, s2)).
n BNF:
NP Pronoun | Noun
n LP / DGC:
Pronoun(s) Noun(s)
n BNF:
Noun ball | book
n LP / DGC
(s = ball s = book)
45
NP(s)
Noun(s) .
FOPL/DCG
NP VP NP(s1) VP(s2)
S(append(s1,s2))
NP Noun
Noun(s) NP(s)
Noun
stench
(s = stench s = wumpus)
Noun
Noun(s)
wumpus
Verb(s) VP(s)
VP Verb (v = smells v = kills)
Verb
Verb(v)
smells
Verb kills
PROLOG
sentence([S1, S2])
:- np(S1), vp(S2).
np(S):- noun(S).
noun(stench).
noun(wumpus).
vp(S):- verb(S).
verb(smells).
verb(kills).
?- sentence([wumpus,
smells]).
?-sentence([S1,
S2]).
Exemplu:
initial(1).
final(8).
arc(1,n,2).
arc(1,pron,2).
arc(2,v,3).
47
word(has,v).
word(a,art).
49
cuvintelor
cu
categoriile
word(most,adv).
word(widespread,adj).
word(language,n).
word(i,pron).
word(enjoy,v).
word(learning,part).
word(new,adj).
word(things,n).
50
?transform([english,is,the,most,widespread,language],Ca
tString).
CatString=[n,v,art,adj,n]
52
Codul surs:
s(s(GN1,GV))-->gn1(GN1),gv(GV).
gn1(gn1(PRON,N))-->pron(PRON),n(N).
gv(gv(V,GN3,GN2))-->v(V),gn3(GN3),gn2(GN2).
gn3(gn3(ADJ1,N1,PREP1,ADJ2,N2)-->
adj1(ADJ1),n1(N1),prep1(PREP1),adj2(ADJ2),n2(N2).
gn2(gn2(PREP2,ART,N3))-->
prep2(PREP2),art(ART),n3(N3).
pron(pron(my))-->[my].
n(n(husband))-->[husband].
v(v(drinks))-->[drinks].
adj1(adj1(innumerable))-->[innumerable].
n1(n1(cups))-->[cups].
prep1(prep1(of))-->[of].
adj2(adj2(black))-->[black].
n2(n2(coffee))-->[coffee].
prep2(prep2(during))-->[during].
art(art(the))-->[the].
n3(n3(day))-->[day].
?-phrase(s(X),[my, husband, drinks, innumerable, cups,
of, black, coffee, during, the, day]).
X = s(gn1(pron(my), n(husband)), gv(v(drinks),
gn3(adj1(innumerable), n1(cups), prep1(of),
adj2(black), n2(coffee)), gn2(prep2(during), art(the),
n3(day))))
Yes.
53
State
S1
NP1
NP2
NP3
S2
VP1
VP2
VP3
NP1
NP2
NP3
VP4
S3
Stack
S2
S2
S2
S3
S3
S3
VP4,S3
VP4,S3
VP4,S3
S3
-
54
Comment
Push to NP-net
Recognize
pron
Recognize
noun
Pop to S-net
Push to VP-net
Recognize
verb
Recognize
verb part1
Push to NP-net
Recognize
adj
Recognize
noun
Pop to VP-net
Pop to S-net
SUCCESS!
configurarea
% Configurarea finala
config(s:State,[],[]):final(s,State).
% If in final state for network pop back to previous
network
config(Network:State,String,[Network1:State1|Stack]):final(Network,State),
config(Network1:State1,String,Stack).
% Process next lexical item
config(Network:State,[Word|String],Stack):word(Word,Cat),
arc(Network,State,Cat,State1),
config(Network:State1,String,Stack).
% If next arc label refers to a network push to it
config(Network:State,String,Stack):arc(Network,State,Network1,State1),
initial(Network1,State2),
config(Network1:State2,String,[Network:State1|S
tack]).
initial(vp,1).
final(vp,4).
arc(vp,1,v,2).
arc(vp,2,vp1,3).
arc(vp,3,np,4).
initial(np,1).
final(np,3).
arc(np,1,pron,2).
arc(np,2,n,3).
arc(np,1,adj,2).
initial(np,1).
final(np,3).
arc(np,1,adj,2).
arc(np,2,n,3).
55
word(learning,vp1).
word(new,adj).
word(things,n).
?-consult(rtn.pl).
?-consult(lex.pl).
?-recognize([our,students,enjoy,learning,new,things]).
Yes.
56
Xk
x k1 , x k 2 , ... , x kn
semine
nu
da
da
da
semine
x15=0
x25= 1
x35= 1
x45= 1
L1 S i , X j
sik
x jk
sik
x jk
sik
x jk ,
(1)
(2)
k 1
n
L2 S i , X j
k 1
n
L3 S i , X j
(3)
k 1
unde:
L p Si , X j ,
p 1,3
(4)
Si
s i1 ,..., s in
(5)
cu imaginea model:
Xi
(6)
iar parametrul j reprezint numrul modelului, iar un rezultat pozitiv
ntreg, mai mare ca doi.
Distanele (1) - (3) pot fi, de asemenea, utilizate cu coeficieni de
greutate. Codificarea binar a caracteristicilor calitative poate fi aplicat i
la distana Hamming, care este introdus pentru toi vectorii binari.
Distana Hamming dintre doi vectori binari este numrul de componente
distincte de vectori binari. n cazul n care vectorii au aceleai
componente, distana dintre ei este zero, n cazul n care vectorul nu are o
component echivalent, distana este egala cu dimensiunea vectorilor.
O clasificare mai fin a obiectelor cu caracteristici calitative se
obine prin introducerea compatibilitii sau diferenei, pentru fiecare
pereche de obiecte Xj, Xi pentru care sunt introduse caracteristici
calitative binare de codare, utiliznd tabelul 6.3.
59
h
0
g
b
Variabila a n tabelul 6.3 este proiectat pentru a contoriza
numrul de caracteristici comune ale obiectelor Xj i Xi. Ea poate fi
calculat utiliznd relaia:
n
x jk xik ;
(7)
k 1
unde: xjk, xik sunt componente binare de vectori care descriu Xj obiecte,
i Xi obiecte.
Cu ajutorul variabilei b calculm numrul de cazuri n care
obiectele Xj, i Xi nu au acelai semn:
n
1 x jk 1 xik .
(8)
k 1
xik 1 x jk ;
(9)
1 xik x jk .
(10)
k 1
n
h
k 1
S1 X i , X j
a
a b g
a
;
n
(11)
S2 X i , X j
n b
a
2a g
S3 X i , X j
(12)
(13)
a
a 2( g
S4 X i , X j
h)
(14)
S5 X i , X j
a b
;
n
(15)
S6 X i , X j
a
g
(16)
ab gh
;
ab gh
S7 X i , X j
61
(17)
62
63
L Sk , Sk
min L S k , S i ;
(2)
L Si , X j
arccos
si1 x j1
si21
si22
si 2 x j 2
... sin2
sik x jk
... sin x jn
x 2j1
x 2j 2
...
x 2jn
arccos
k 1
Si
Xj
(3)
Si
X j , dac L S i , X j
min L S i , X j .
j
(4)
Xj j
1, m .
64
Sj,X j
S i X j cos
sik x jk .
(5)
k 1
L Si , X j
(6)
sik x jk .
k 1
Si
Dac zona Vj ( j
(8)
65
Si
X j , dac
x *jk
L Si , X j
sik
Rj .
(9)
k 1
L Si , X j
sik
x jk
sik
x jk
sik
x jk ;
(10)
(11)
k 1
L Si , X j
k 1
n
L Si , X j
(12)
k 1
n
sik
x jk
k 1
sik
x jk
L Si , X j
unde:
(13)
1, n coeficienii cu capacitate;
Si
X j , dac L S i , X j
Rij
Rj ,
(14)
unde: Rij distana dat de una din relaiile (10)-(13), ntre imaginea
prezentat Si i centrul sferei, care conine imaginea virtual j;
Rj raza sferei care conine imaginea virtual j.
n cazul folosirii pentru recunoaterea unghiului dintre vectorii
zoneleor ce nu se intersecteaz Vj ( j
1, m ), se reprezint n form de
66
X j , dac
L Si , X j
unde:
j max
ij
ij
arccos
s i1 x j1
s i21
s i 2 x j 2 ... s in x jn
x 2j1
x 2j 2 ... x 2jn
j max
(15)
67
SZ
Si Z i
d,
(2)
i 1
m
2
SZ
2
m
2
Si Z i .
(3)
i 1
69
U out Si
unde:
1, dac Siq 1
1, dac Siq
(4)
g z U in
0, dac U in 0
k1U in , dac 0 U in U n
(6)
U n , dac U in U n
unde: Uin semnalul de intrare a neuronului; k1 i U constante.
La descrierea imaginii S* = (s1*, , sm*) fiecare Z-neuron
calculeaz semnalul lui de intrare n conformitate cu expresia (3):
U in z k
m
2
wik si*
(7)
i 1
g U in
wij
U in , dac U in
0, dac U in
0
0
1, dac i j
, dac i j, i, j 1, n
71
Ui t 1
g Ui t
U j t , i 1, n
(8)
j 1, j i
cu condiiile iniiale:
Ui(0)=ai=UinZi, i=1,n.
Dac printre semnalele de intrare 1 ,..., an alr neuronilor A1, ...,
An este un semnal cel mai nalt ( {1, 2, ..., n}), atunci n urma
procesului iterativ, n subreeaua MaxNet va figura un singur neuron ,
care va rmne ca semnal de ieire, mai mare ca 0, adic va deveni
"nvingtor", dei semnalele de ieire U1, ..., Up, ..., Un ale -elemente vin
la intrrile a Y-neuroni care au funcia de activare de forma:
gY U in
1, dac U in 0
0, dac U in 0
(9)
72
73
Wik
V 1 ( Z1 ) V 2 ( Z 2 ) V 3 ( Z 3 ) V 4 ( Z 4 ) V 5 ( Z 5 )
S1 0.5
0.5
0.5
0.5
0.5
S 2 0.5
0.5
0.5
0.5
0.5
S3 0.5
0.5
0.5
0.5
0.5
S 4 0.5
0.5
0.5
0.5
0.5
S5 0.5
0.5
0.5
0.5
0.5
S6 0.5
0.5
0.5
0.5
0.5
S7 0.5
0.5
0.5
0.5
0.5
S8 0.5
0.5
0.5
0.5
0.5
S9 0.5
0.5
0.5
0.5
0.5
(10)
(11)
74
U in.Z 3
9
2
wi 3 S i1
4,5 0,5 ( 1)
( 0,5) ( 1)
0,5 1 0,5 1
i 1
0,5 1 8;
9
2
wi 4 S i1
4,5 0,5 ( 1)
0,5 ( 1)
0,5 1 0,5 1
i 1
( 0,5 1)
( 0,5) 1 4;
9 9
wi 5 S i1 4,5 ( 0,5) ( 1) ( 0,5) ( 1) ( 0,5) 1
2 i1
( 0,5) 1 0,5 1 ( 0,5) 1 ( 0,5) 1 ( 0,5) ( 1) ( 0,5) 1 4.
U in.Z 5
U out .Z 1
k1U in.Z 1
0,1 2
0,2 ;
U out .Z 2
k1U in.Z 2
0,1 6
0,6 ;
U out .Z 3
k1U in.Z 3
0,1 8
0,8 ;
U out .Z 4
k1U in.Z 4
0,1 4
0,4 ;
U out .Z 5
k1U in.Z 5
0,1 4
0,4 .
75
Vectorul:
Uout Z = (0,2; 0,6; 0,8; 0,4; 0,4)
reprezint vectorul de intrarea a subreelei MaxNet i ncepe procesul
iterativ de alocare a semnalului maxim de ieire cu condiiile iniiale
(12). Pentru t =1 vom avea:
5
U out . A1 (1)
g (U outA1 (0)
U outAk (0))
k 2
0,4))
g ( 0,24)
0;
U out . A2 (1)
g (U outA2 (0)
U outAk (0))
k 1, k 2
0,4))
g (0,24)
0,24;
U outAk (0))
k 1, k 3
0,4))
g (0,48) 0,48;
U outAk (0))
k 1, k 4
0,4))
g (0) 0;
U outAk (0))
k 1
0,4))
g (0) 0;
Uout A2
Uout A3
Uout A4
Uout A5
0,200
0,600
0,800
0,400
0,400
0,000
0,240
0,480
0,000
0,000
0,000
0,144
0,432
0,000
0,000
0,000
0,058
0,403
0,000
0,000
0,000
0,000
0,402
0,000
0,000
U in.Z 1 ( S 2 )
6 , U in.Z 2 ( S 2 )
2 ,U in.Z 3 ( S 2 )
U in.Z 4 ( S 2 )
4 ,U in.Z 5 ( S 2 )
8;
U out .Z 1 ( S 2 )
a1
0,6 ,U out .Z 2 ( S 2 )
U out .Z 3 ( S 2 ) U out .Z 4 ( S 2 )
U out .Z 5 ( S 2 )
a5
a3
a4
a2
4,
0,2 ,
0,4 ,
0,8 .
U in.Z 1 ( S 3 )
8 , U in.Z 2 ( S 3 )
0 ,U in.Z 3 ( S 3 ) 1,
U in.Z 4 ( S 3 )
2 ,U in.Z 5 ( S 3 )
8.
78
xi wi
w0 ,
(1)
i 1
1, dac S
0 , dac S
0
.
0
(2)
1, dac S 0
.
1, dac S 0
(3)
sau bipolare:
1, dac S
0 , dac S
1, dac S
1, dac S
(4)
(5)
unde:
n
(6)
wi xi .
1 pentru S
80
unde a este egal cu 0 pentru semnalele de intrare binare ale neuronilor iar
a este egal cu -1 pentru semnalele bipolare; k, a0 coeficieni permaneni.
1
1 e
(8)
1.
(9)
2
1 e
81
S2
(10)
1,
1 ( K 1) pentru 1 S
2 ,
2 ( K 1) pentru 2 S
3,
.......... .......... .......... .......... ...
K 2
pentru k 1 S
k ,
K 1
1 pentru S
k .
(11)
1,
1 2 ( K 1) pentru 1 S
1 4 ( K 1) pentru 2 S
.......... .......... .......... .......... ...
2( K 2)
1
pentru k 1 S
K 1
1 pentru S
k .
,
3,
2
(12)
xi wi
i 1
w0
0,
x2 w2
... xn wn
w0
0.
wi
0, i
0, n.
x0
xik , i 1, n.
1, xi
wi (new)
wi (old ) xi y, i
0, n.
1, dac S k
1, dac S
1, m,
unde:
n
Sk
xik wi
i 1
m
w0 .
85
Exemplu:
Fie c trebuie s nvm un neuron bipolar s recunoasc
imaginiler X1 i X2, ilustrate n figura 9.3.
X1
(X
1, 1,1,1,1, 1, 1,1 ,1 ;
(1,1,1,1, 1,1,1, 1,1), 1) ;
wi
w0
xi1 y ( i
w0
0, n) :
x0 y
0 1 1 1;
1
1
w1 w1 x y 0 1 1 1;
w1 w3 w4 w5 w6 w9 1;
w2
w2 x12 y 0 ( 1) 1
w2 w7 w8
1.
86
1;
w0
w0
x0 y 1 1 ( 1)
0;
w1 w1 x12 y 1 1 ( 1) 0 ;
w1 w3 w4 w6 w9 0 ;
w2
w2
x22 y
1 1 ( 1)
w2 w7
2;
2;
w5
w5
x52 y 1 ( 1) ( 1)
2;
w8
w8
x82 y
1 ( 1) ( 1) 0 ;
S1
xi1wi
w0
1 0 ( 1) ( 2) 1 0 1 0 1 2 1 0
i 1
( 1) ( 2) ( 1) 0 1 0 0 6;
y1=1, deoarece S1>0.
Se calculeaz semnalele de ieire i de intrare ale neuronului la
prezentarea imaginii X2:
9
S2
xi2 wi
w0 1 0 1 ( 2) 1 0 1 0 ( 1) 2 1 0
i 1
1 ( 2) ( 1) 0 1 0 0
y =-1, deoarece S2<0.
6;
ntruct vectorul (y1 ,y2)=(1, -1) este egal cu vectorul (t1 ,t2),
atunci calculele se stopeaz, deoarece a fost atins scopul neuronul corect
recunoate imaginile prezentate.
87
1, dac xi y 1,
0, dac xi 0 ,
wi
(15)
0 i y
1, dac xi
0.
Exemplu:
Fie c trebuie s nvm un neuron binar pentru recunoaterea
imaginilor X1 i X2 ale exemplului precedent. Imaginii X1 fie c-i va
corespunde semnalul de ieire +1 al neuronului, iar imaginii X2 0.
Aplicarea regulii lui Hebb n acest caz ne va da urmtoarele
rezultate:
Pasul 1. Se d mulimea:
M = {(X1 = (1, 0, 1, 1, 1, 1, 0, 0, 1), 1), (X2 = (1, 1, 1, 1, 0, 1, 1, 0, 1), 0)} ,
i se iniiaz ponderile legturilor neuronului wi = 0, i 0,9 .
Pasul 2. Pentru perechile (X1, 1), (X2, 0) se ndeplinesc paii 3-5.
Pasul 3. Se iniiaz mulimea intrrilor neuronului cu elementele imaginii
X1:
x0
xi1 , i
1, xi
0,9.
w0
w0
w1 w1
w1 w3 w4
w2
w2
w0
0 1 1;
w1 0 1 1;
w5 w6 w9 1;
w2
88
0 0
0;
w2
w7
w8
0.
x0
xi2 , i
1, xi
0,9.
w0
w0
w1
w1
w1
w3
w2
w0
w2
w5
w7
w8
0;
w1 1 ( 1) 0 ;
w4 w6 w9 0 ;
w2
w5
1 ( 1)
w8
0 ( 1)
1;
w5 1 0 1;
w2
1;
w8 0 0 0 .
S1
xi1wi
w0
1 0 0 ( 1) 1 0 1 0 1 1 1 0
i 1
0 ( 1) 0 0 1 0 0 1;
y =1, deoarece S1>0.
1
S2
xi2 wi
w0 1 0 1 ( 1) 1 0 1 0 0 1 1 0
i 1
1 ( 1) 0 0 1 0
2;
2
y =-1, deoarece S <0.
ntruct vectorul (y1 ,y2)=(1, 0) este egal cu vectorul (t1 ,t2), atunci
calculele se stopeaz, deoarece a fost atins scopul.
2
w ji
0, j 1, n , i 1, m.
90
xkj , j 1, n.
x0 1, x j
w ji (new)
w ji (old ) x j yi , j
0, n , i
0, m.
91
BIBLIOGRAFIE
Cri:
A. Florea, A. Boangiu. Elemente de inteligena artificial.
A. Florea. Bazele logice ale inteligenei artificiale. Cap. 4, 6.
A. Florea, B. Dorohonceanu, C. Francu. Programare n Prolog.
Articole on-line:
Turing, A.M. Computing Machinery and Intelligence, Mind, 59,
1950, 433-460.
AI's Greatest Trends and Controversies, IEEE Intelligent Systems
January/February 2000.
Marvin Minsky. A Framework for Representing Knowledge,
MIT-AI Laboratory Memo 306, June, 1974.
J. Austin - How to do things with words, 1962, J. Searle - Speech
acts, 1969
92
ANEXE
Anexa 1
MEDIUL GNU Prolog
Introducere
GNU Prolog este un compilator Prolog gratuit, dezvoltat de
Daniel Diaz. GNU Prolog reprezint un compilator bazat pe maina
abstract Warren (WAM). GNU Prolog, mai nti, compileaz programul
ntr-un fiier WAM, care apoi este translat n limbajul mini-assembly,
elaborat special pentru GNU Prolog. Fiierul obinut este la fel translat,
ns deja n limbajul assembler specific staiei pe care ruleaz. Acest fapt
permite GNU Prolog s produc un executabil nativ, independent dintr-un
fiier surs Prolog (.pl, .pro). Avantajul principal al acestei scheme de
compilare const n producerea codului nativ i viteza de compilare. O
alt caracteristic este c executabilele sunt de dimensiune mic.
Caracteristicile GNU Prolog:
predicatului).
Ciclul interactiv de citire-execuie-afiare al interpretatorului
GNU Prolog top-level se bazeaz pe un ciclu interactiv de citire-execuieafiare care permite reexecutri dup cum urmeaz:
executarea interogrii;
96
97
member/2
member(Element, List) verific dac elementul Element aparine
listei List.
reverse/2
reverse(List1, List2) inverseaz lista List1 n List2.
delete/3
delete(List1, Element, List2) elimin toate apariiile Element
n lista List1 n cadrul listei List2.
prefix/2
prefix(Prefix, List) verific dac lista Prefix este prefixul listei
List.
suffix/2
suffix(Suffix, List) verific dac lista Suffix este sufixul listei
List.
sublist/2
sublist(List1, List2) verific dac n lista List1 toate
nth/3
nth(N, List, Element) returneaz al N-lea element din lista List
n Element.
min_list/2
min_list(List, Min) returneaz elementul minimal din lista List
n Min.
max_list/2
max_list(List, Max) returneaz elementul maximal din lista List
n Max.
sum_list/2
sum_list(List, Sum) returneaz suma elementelor listei List n
Sum.
99
Anexa 2
Codul surs al programului care realizeaz o reea
neuronal Hamming n limbajul de programare C++
#include <iostream.h>
#include <string.h>
#define true 1
#define false 0
using namespace std;
class Hemming
{
private:
float* Uin;
float* Uout;
float** W;
int N;
int M;
int* s;
float e;
float b;
float k;
void InitUin();
void InitUout();
float g(float x);
bool Compare(float* v1, float* v2);
public:
int GetVectorLength(); //returns Image's length
int GetEtalonsCount();// returns Etalon count
void SetImage(int* image);// Set recognizing Image's
vector
void SetEtalons(int** images);// set etalons
void Hemming::Final(int* rezult, int &counter);//
recognize Image
Hemming(int n,int m);
Hemming(Hemming& hemming);
~Hemming();
};
void Hemming::InitUin()
{
int i,j;
for (i = 0; i < N; i++)
{
float temp = 0;
for ( j = 0; j < M; j++)
temp += s[j] * W[j][i];
Uin[i] = temp;
100
}
}
void Hemming::InitUout()
{
int i;
for (i = 0; i < N; i++)
Uout[i] = Uin[i] * k;
}
float Hemming::g(float x)
{
return x < 0 ? 0 : x;
}
bool Hemming::Compare(float* v1, float* v2)
{
int i;
for ( i = 0; i < N; i++)
if (v1[i] != v2[i]) return false;
return true;
}
int Hemming::GetVectorLength(){ return N;}
int Hemming::GetEtalonsCount(){ return M;}
void Hemming::SetImage(int* image)
{
int i;
for( i=0; i<M; i++)
s[i]= image[i];
}
void Hemming::SetEtalons(int** images)
{
int i,j;
for ( i = 0; i < M; i++)
for ( j = 0; j <N; j++)
W[i][j] = (float)images[j][i] / 2;
}
void Hemming::Final(int* rezult, int &counter)
{
InitUin();
InitUout();
int i,j;
while (!Compare(Uin, Uout))
{
for(i=0; i<N; i++)
Uin[i]=Uout[i];
for (i = 0; i < N; i++)
{
//Uout[i] = g(Uin[i] - e *
(Uin.Where((r, index) => index != i).Sum()));
float temp=0;
for(j=0; j<N; j++)
if(i!=j) temp+=Uin[j];
Uout[i] = g(Uin[i] - e*temp);
}
}
int max = 0;
for ( i = 1; i < N; i++)
101
102
if(W!=NULL)
{
for (int i=0; i<M; i++)
if (W[i]!=NULL) delete W[i];
delete W;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int rezult[5];
int n,m,i,j;
n=5; m=9;
int etalons[5][9] =
{
{ -1, 1, -1, -1, 1, -1, -1, 1, -1 },
{ 1, 1, 1, 1, -1, 1, 1, -1, 1 },
{ 1, -1, 1, 1, 1, 1, 1, -1, 1 },
{ 1, 1, 1, 1, -1, -1, 1, -1, -1 },
{ -1, -1, -1, -1, 1, -1, -1, -1, -1 }
};
int** etalonPt= new int* [5];
for( i =0; i<5; i++)
etalonPt[i]=new int[9];
for( i=0; i<5; i++)
for( j=0; j<9; j++)
etalonPt[i][j] = etalons[i][j];
int s[9]= {-1,-1,1,1,1,1,1,-1,1};
//s3={-1,-1,-1,1,-1,-1,-1,1,-1};
Hemming h(n,m);
h.SetEtalons(etalonPt);
h.SetImage(s);
int counter;
h.Final(rezult,counter);
cout<<"Mached image indexes: "<<endl;
for(i=0; i<counter; i++)
cout<<rezult[i]<<",";
cout<<endl;
char c; cin>>c;
for( i =0; i<5; i++)
delete etalonPt[i];
delete etalonPt;
return 0;
}
103
Anexa 3
Codul surs al programului care realizeaz reeaua neuronal
Hamming, n limbajul de programare C#
Clasa neuronului:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Plia_Interface
{ public class Newrons
{ protected int _m = 9;
protected int _n;
public Newrons(int n, int m)
{ _m = m; _n = n;
b = m / 2;
e = 1 / _n;
k = 0.1;
}
private double b;
private double e;
private sbyte[][] etalons;
public sbyte[][] Etalons
{ get
{ return etalons;
}
set
{ if (value.GetLength(0) != _n
|| value.Any(v => v.Length != _m))
throw new ArgumentException("Wrong size of vector");
etalons = value;
InitW();
}
}
private double[,] W;
private double[] Uin;
private double[] Uout;
private sbyte[] _s;
public sbyte[] S
{ get
{ return _s;
}
set
{ if (value.Length != _m)
throw new ArgumentException("Wrong vector size");
_s = value;
104
}
}
private double k;
protected void InitW()
{ W = new double[_m, _n];
for (int i = 0; i < W.GetLength(0); i++)
for (int j = 0; j < W.GetLength(1); j++)
W[i, j] = (double)etalons[j][i] / 2;
}
protected void InitUin()
{ Uin = new double[_n];
for (int i = 0; i < _n; i++)
{ double temp = 0;
for (int j = 0; j < _m; j++)
temp += _s[j] * W[j, i];
Uin[i] = temp;
}
}
protected void InitUout()
{ Uout = new double[_n];
for (int i = 0; i < _n; i++)
Uout[i] = Uin[i] * k;
}
protected double g(double x)
{ return x < 0 ? 0 : x;
}
private bool Compare(double[] v1, double[] v2)
{ if (v1.Length != v2.Length) return false;
for (int i = 0; i < v1.Length; i++)
if (v1[i] != v2[i]) return false;
return true;
}
public List<int> Final()
{ InitUin();
InitUout();
while (!Compare(Uin, Uout))
{ Array.Copy(Uout, Uin, Uout.Length);
for (int i = 0; i < Uout.Length; i++)
Uout[i] = g(Uin[i] - e * (Uin.Where((r, index) => index
!= i).Sum()));
}
int max = 0;
for (int i = 1; i < Uout.Length; i++)
if (Uout[max] < Uin[i]) max = i;
return Uout.Select((u, index) => new { U = u, Index =
index }).Where(u => u.U == Uout[max]).Select(u =>
u.Index).ToList();
105
}
}
}
106
_symbols.Clear();
}
}
public sbyte[][] GetVectors()
{ return _symbols.Select(s => s.Vector).ToArray();
}
public void AddSymbol(Symbol s)
{ if (s.Vector.Length != _n * _m)
throw new ArgumentException();
}
private static string path = "data.dat";
public void LazyInit()
{ _n = 3;
_m = 3;
var etalons = new sbyte[5][];
etalons[0] = new sbyte[9] { -1, 1, -1, -1, 1, -1, -1, 1, 1 };
etalons[1] = new sbyte[9] { 1, 1, 1, 1, -1, 1, 1, -1, 1 };
etalons[2] = new sbyte[9] { 1, -1, 1, 1, 1, 1, 1, -1, 1 };
etalons[3] = new sbyte[9] { 1, 1, 1, 1, -1, -1, 1, -1, -1
};
etalons[4] = new sbyte[9] { -1, -1, -1, -1, 1, -1, -1, -1,
-1 };
for (int i = 0; i < etalons.Length; i++)
_symbols.Add(
new Symbol()
{ Name = i.ToString(),
Vector = etalons[i]
});
}
public static SymbolCollection Load()
{ BinaryFormatter serializer = new BinaryFormatter();
var file = File.Open(path, FileMode.Open);
var result =
(SymbolCollection)serializer.Deserialize(file);
return result;
}
public static void Save(SymbolCollection collection)
{ BinaryFormatter serializer = new BinaryFormatter();
var file = File.Create(path);
serializer.Serialize(file, collection);
}
}
}
107
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows;
using System.Windows.Shapes;
using System.Windows.Media;
namespace Plia_Interface
{ public class SymbolEditor
{ private int _n, _m;
private Grid _grid;
private SolidColorBrush selected;
private SolidColorBrush deselected;
private LinearGradientBrush hylighted;
private Rectangle mask;
public SymbolEditor(int n, int m, Grid grid)
{ _n = n; _m = m; _grid = grid;
#region Fiture Initialization
_grid.ShowGridLines = true;
selected = new SolidColorBrush(Colors.DarkBlue);
deselected = new SolidColorBrush(Colors.AntiqueWhite);
hylighted = new
LinearGradientBrush(Colors.Azure, Colors.Crimson, 0.5);
mask = new Rectangle();
mask.Fill = hylighted;
mask.RadiusX = 5;
mask.RadiusY = 5;
mask.Opacity = 0.35;
mask.Visibility = Visibility.Visible;
#endregion
InitGrid();
}
protected void InitGrid()
{ _grid.Children.Clear();
_grid.RowDefinitions.Clear();
_grid.ColumnDefinitions.Clear();
for (int i = 0; i < _n; i++)
{ var row = new RowDefinition();
_grid.RowDefinitions.Add(row);
}
for (int j = 0; j < _m; j++)
{ var column = new ColumnDefinition();
//column.Width = new GridLength(0, GridUnitType.Star);
_grid.ColumnDefinitions.Add(column);
}
for (int i = 0; i < _n; i++)
{ for (int j = 0; j < _m; j++)
108
109
110
111