Sunteți pe pagina 1din 3

G

I
n
f
o

n
r
.

1
5
/
3

-

m
a
r
t
i
e

2
0
0
5
38
f
o
c
u
s
Un fel de cupluri...
Cuplaj MAXIM de valoare
MINIM ntr-un GRAF
BIPARTIT
Ilie Vieru
n cadrul acestui articol vom prezenta un algoritm interesant pentru
determinarea cuplajului maxim de cost minim ntr-un graf bipartit. n
momentul de fa algoritmul este sub tipar i la prestigioasa revist
Mathematics Magazine.
Sunt cunoscute problemele n care se
solicit asocierea optim a elemente-
lor unei mulimi A = {a
1
, a
2
, ..., a
n
} cu
elementele mulimii B = {b
1
, b
2
, ..., b
m
},
n condiiile unor limitri ale posibi-
litilor de asociere.
n general, fiecare asociere posi-
bil a
i
b
j
aduce un anumit efect
(cost, profit etc.) pe care l presupu-
nem cunoscut.
Limitrile asupra asocierilor n-
seamn:
un element a
i
din A poate fi asociat
doar cu anumite elemente din B i
reciproc;
n final, fiecrui element din A i s-a
asociat cel mult un element din B i
reciproc.
Asocierea optim nseamn gsi-
rea unui cuplaj maxim ntr-un graf
bipartit i presupune, de obicei, dou
obiective:
s se determine maximul de asocieri;
suma efectelor asocierilor s fie op-
tim (maxim sau minim).
Dintre problemele practice care
se reduc la a determina un cuplaj ma-
xim de valoare optim, amintim [1]:
repartizarea muncitorilor unei sec-
ii pe utilaje n funcie de pregtirea
i preferinele muncitorilor dar i
de complexitatea mainilor;
repartizarea angajailor pe posturi;
formarea grupelor de lucru dup afi-
nitile dintre membrii colectivului;
transferarea unor informaii ntr-un
grup.
Observaie
Presupunem cunoscute definiiile cu
privire la graf bipartit, cuplaj, cuplaj
maxim, valoarea cuplajului ([1], [2],
[4]).
n anul 1931 Knig a formulat
teorema prezentat n continuare.
Teorem
Numrul maxim de muchii ale unui
cuplaj ntr-un graf bipartit G = (A
B, U) este .
n anul 1955, bazndu-se pe teo-
rema lui Knig, H.W. Kuhn a elabo-
rat un algoritm cunoscut sub denu-
mirea de algoritmul ungar cu ajuto-
rul cruia se poate determina un cu-
plaj maxim de valoare minim ntr-un
graf bipartit pentru |A| = |B| = n. El
se bazeaz pe observaia prezentat
n continuare.
Observaie
Dac se adun (sau se scade) acelai
numr la toate valorile muchiilor,
atunci nu se schimb ierarhia cupla-
jelor maxime.
Algoritmul pornete de la matri-
cea ptratic , unde:
Acest algoritm, este laborios, greu
de implementat, dei are complexita-
te polinomial ([1]).
Pentru determinarea cuplajului
bipartit maxim se poate folosi i me-
toda Ford-Fulkerson pentru graful
bipartit G = (X = A B, U), ntr-un
timp polinomial n |X| i |U|.
Soluia const n construirea unei
reele de transport n care fluxurile
reprezint cuplajele.
Graful iniial se completeaz cu
nc dou vrfuri s (sursa) i t (desti-

]. , [ muchia exist nu dac ,


]; , [ muchia exist dac
], , [ muchiei valoarea
j i
j i
j i
m
ij
( )
n j i
ij
m M

, 1
( ) ( ) C U C A
A C
+

min
f
o
c
u
s
G
I
n
f
o

n
r
.

1
5
/
3

-

m
a
r
t
i
e

2
0
0
5
39
naia), legate de vrfurile din A, res-
pectiv B ca n exemplul de la p. 517
din [2].
Se presupune c fiecare muchie
are o capacitate pozitiv. n acest con-
text se aplic algoritmul Ford-Fulker-
son obinndu-se soluia optim.
n continuare v propun un algo-
ritm original, rapid i foarte uor de
implementat. Pentru aceasta pornim
de la cteva elemente de algebr
superioar. Se tie c pentru a calcula
valoarea determinantului asociat unei
matrice avem formula:
unde reprezint signatura
permutrii , iar fiecare din termenii
sumei reprezint cte un produs cu n
elemente ale matricei A, n aa fel n-
ct ele epuizeaz toate liniile i toate
coloanele matricei.
Cu alte cuvinte, nu exist n nici
un termen al sumei doi factori aflai
pe aceeai linie sau aceeai coloan a
matricei.
Presupunem mai nti c avem
|A| = |B| = n. n acest caz va trebui s
determinm ntr-un mod asemntor
definiiei prezentate anterior terme-
nul de va-
loare minim, reinnd n acelai timp
i permutarea care l-a generat.
Introducem notaia:
Astfel putem scrie expresia:
Cu alte cuvinte, A
k+1
se obine
din A
k
prin bordare la dreapta i jos
cu elementele corespunztoate coloa-
nei k + 1, respectiv ale liniei k + 1.
Atam matricei A
n
vectorul de
decizie , cu semnificaia:
d
i
= j
0
unde a
ij
0
reprezint termenul
de pe linia i ales la un pas k (1 i, j
0
k) n suma S
n
, i k n. De aseme-
nea, construim vectorul ,
care memoreaz permutarea invers
ataat permutrii d, adic v
d
i
= i, sau
d
v
j
= j (1 i, j
0
k).
Iterativ construim:
A
1
= (a
11
); d
1
= 1; S
1
= a
11
; v
1
= 1.
Presupunem construite cele patru
iruri pn n pasul k, k 1.
Pentru pasul k + 1 ntreaga con-
strucie urmrete:
obinerea elementului S
k+1
cu valoa-
re minim, n sensul definiiei, cu
termeni din matricea A
k+1
folosind
rezultatele obinute pn la pasul k;
actualizarea vectorilor (d
1
, d
2
, ..., d
k
),
respectiv (v
1
, v
2
, ..., v
k
).
La acest pas se disting trei situaii:
la S
k
se adaug a
k+1,k+1
, caz n care
efectum urmtoarele operaii: S
k+1
= S
k
+ a
k+1,k+1
; d
k+1
= 1; v
k+1
= 1.
S
k+1
se formeaz adugnd termenii
a
i,k+1
i a
k+1,j
pentru care avem d
i
= j,
caz n care efectum operaiile: S
k+1
= S
k
- a
ij
+ a
i,k+1
+ a
k+1,j
; d
i
= k + 1;
d
k+1
= j; v
k+1
= i; v
j
= k + 1.
S
k+1
se formeaz adugnd termenii
a
i,k+1
i a
k+1,j
pentru care avem d
i
j,
caz n care se efectueaz operaiile:
S
k+1
= S
k
- a
i,d
i
- a
v
j
,j
+ a
v
j
,d
i
+ a
i,k+1
+
a
k+1,j
; d
v
j
= d
i
; v
d
i
= v
j
; d
i
= k + 1; v
k+1
= i; d
k+1
= j; v
j
= k + 1.
n final S
n
reprezint valoarea mi-
nim a cuplajului maxim: (1, d
1
), ...,
(n, d
n
).
Pentru n = |A| < |B| = m, algorit-
mul parcurge urmtorii pai:
se aplic algoritmul anterior i se
determin S
n
, d
n
, v
n
;
pentru valorile j cuprinse ntre n + 1
i m avem dac
l
i
0
< 0, atunci se efectueaz urmtoa-
rele actualizri S
n
= S
n
+ l
i
0
; d
i
0
= j.
Observaie
Soluia se exprim la fel ca n cazul
algoritmului prezentat anterior (cnd
mulimile A i B au acelai numr de
elemente).
Pentru n = |B| < |A| = m, algorit-
mul parcurge urmtorii pai:
se aplic algoritmul anterior i se
determin S
n
, d
n
, v
n
;
pentru valorile i cuprinse ntre n + 1
i m avem dac
l
j
0
< 0, atunci se efectueaz urmtoa-
rele actualizri S
n
= S
n
+ l
j
0
; d
v
j
0
= 0;
v
j
0
= i; d
i
= j
0
.
Observaie
n acest caz, la afiarea vectorului de
decizii ([3]), se poate parcurge irul
pe coloane: (v
1
, 1), ..., (v
n
, n), sau se
selecteaz acele linii, cresctor dup
i, pentru care d
i
> 0.
Algoritmul urmrete la fiecare
pas k optimizarea funciei obiectiv
i de aceea putem spune c se nca-
dreaz n strategia general Greedy.
Urmrind etapele prezentate, se
poate demonstra, folosind cunotine
de nivelul clasei a XI-a teorema care
urmeaz.
Teorem
Algoritmul prezentat determin un
cuplaj maxim cu valoare minim.
Exemplu
La o secie au fost angajai ase lu-
crtori pentru a lucra pe ase maini.
n urma unor probe de lucru s-au
determinat numerele a
ij
care repre-
zint riscul pe care i-l asum patro-
nul angajnd lucrtorul i pentru a
lucra pe maina j.
Rezultatele au fost nregistrate n
matricea urmtoare:
Ne propunem s determinm
repartizarea optim a angajailor pe
cele ase maini astfel nct riscul to-
tal s fie minim.
Pentru aceasta vom aplica algo-
ritmul prezentat, artnd valorile ob-
inute la fiecare pas.
.
50 13 44 18 44 25
60 40 36 38 41 15
64 73 18 6 14 58
70 16 12 62 90 18
13 23 90 69 24 29
52 39 14 27 43 17
(
(
(
(
(
(
(
(
,
\
,
,
,
,
,
,
,
,
(
j

k
A
; min
, ,
1
0
j v j i
n i
j
j
a a l

; min
, ,
1
0 i
d i j i
n i
i
a a l

( )
n i i
v v

1
( )
n i i
d d

1
.
|
\
|
1 , 1 1 , 1
1 , 1
1
(
(
(
,
\
,
,
,
(
j

+ + +
+
+
k k k
k k
k
a a
a A
A
.
2 1
2 22 21
1 12 11
(
(
(
(
(
,
\
,
,
,
,
,
(
j

kk k k
k
k
k
a a a
a a a
a a a
A
L
M O M M
L
L
( ) ( ) ( ) n n
def
n
a a a S
, 2 , 2 1 , 1
L
( )
( ) m
1
( )
( )
( ) ( ) ( )
, 1
, 2 , 2 1 , 1


n
S
n n
m
def
a a a A

L
( )
n j i
ij
a A

, 1
G
I
n
f
o

n
r
.

1
5
/
3

-

m
a
r
t
i
e

2
0
0
5
40
f
o
c
u
s
Pasul #1

S
1
= 17;
d
1
= 1;
v
1
= 1.
Pasul #2

S
2
= S
1
+ a
22
= 41;
d
2
= 2;
v
2
= 2.
Pasul #3

S
3
= S
2
+ a
13
+ a
31
- a
11
= 69;
d
1
= 3;
v
1
= 3;
v
3
= 1;
d
3
= 1.
Pasul #4

S
4
= S
3
+ a
14
+ a
43
- a
13
= 62;
d
1
= 4;
v
4
= 1;
d
4
= 3;
v
3
= 4.
Pasul #5

S
5
= S
4
+ a
14
+ a
43
- a
13
= 75;
d
3
= 5;
v
5
= 3;
d
5
= 1;
v
1
= 5.
Pasul #6

S
6
= S
5
+ a
26
+ a
63
- a
22
- a
43
+ a
42
= 90;
d
2
= 6;
v
6
= 2;
d
4
= 2;
v
2
= 4;
d
6
= 3;
v
3
= 6.
Rezultatul
n final vom obine:
Aadar, ordinea lucrtorilor pe
maini va fi: (1, 4), (2, 6), (3, 5), (4,
2), (5, 1),(6, 3).
Aplicaie
Acest algoritm poate fi utilizat pen-
tru a rezolva problema Culori, pro-
pus spre rezolvare la runda #04 a
ediiei 2004/2005 a concursului de
programare Bursele Agora.
Bibliografie:
1. E. Tignescu, D. Mitru, Bazele
cercetrii operaionale, Editura
Academiei de Studii Economice,
Bucureti, 1999;
2. T. H. Cormen, C. E. Leiserson, R.
R. Rivest, Introducere n algo-
ritmi, Editura Computer Libris
Agora, Cluj-Napoca, 2000;
3. I. Vieru, Rolul deciziei n progra-
marea dinamic, GInfo 10/3, Edi-
tura Agora Media, Trgu Mure,
2000;
4. I. Tomescu, Combinatoric i
teoria grafurilor, Editura Universi-
tii Bucureti, 1978.
.
50 13 44 44 25
60
64
70
52
40 36 38 41
79 18 6 14 58
12 62 90 18
23 90 69 29
39 27 43 17
18
13
15
16
24
14
(
(
(
(
(
(
(
(
,
\
,
,
,
,
,
,
,
,
(
j
A
;
50 13 44 18 44 25
60
64
70
13
52
40 36 38 41
79 18 14 58
12 62 90 18
23 90 69 29
39 27 43 17
15
6
16
24
14
6
(
(
(
(
(
(
(
(
,
\
,
,
,
,
,
,
,
,
(
j
A
;
40 36 38 41 15
79 18 14 58
16 12 62 90
23 90 69 29
39 27 43 17
6
24
14
18
5
(
(
(
(
(
(
,
\
,
,
,
,
,
,
(
j
A
;
18 6 14 58
12 62 90
90 69 29
14 43 17
18
24
27
4
(
(
(
(
(
,
\
,
,
,
,
,
(
j
A
;
62 90 18
69 29
27 43
24
17
3
(
(
(
,
\
,
,
,
(
j
A
;
24 29
43 17
2
(
(
,
\
,
,
(
j
A
( ); 17
1
A
Exemplu de implementare:
voi d cal cul ( ) {
d[ 1] = 1;
v[ 1] = 1;
s = a[ 1] [ 1] ;
f or ( k = 2; k <= n; k++) {
l i 0 = a[ 1] [ k] +
a[ k] [ d[ 1] ] - a[ 1] [ d[ 1] ] ;
i 0 = 1;
c0 = d[ i 0]
j = d[ i 0] ;
f or ( i = 1; i < k; i ++) {
j = d[ i ] ;
R = a[ i ] [ k] + a[ k] [ j ]
- a[ i ] [ j ] ;
i f ( R < l i 0) {
l i 0 = R;
i 0 = i ;
j = d[ i ] ;
c0 = j
j 0 = j ;
}
f or ( i nt c = 1;
c < k; c++)
i f ( c - j ) {
i nt u = v[ c] ;
R = a[ i ] [ k] + a[ k] [ c] -
a[ i ] [ j ] - a[ u] [ c] +
a[ u] [ j ] ;
i f ( R < l i 0) {
l i 0 = R;
c0 = c;
i 0 = i ;
u0 = u;
j 0 = j ;
}
}
}
i f ( l i 0 >= a[ k] [ k] ) {
s += a[ k] [ k] ;
d[ k] = k;
v[ k] = k;
}
el se {
s += l i 0;
i f ( c0 == j 0) {
d[ i 0] = k;
d[ k] = c0;
v[ c0] = k;
v[ k] = i 0;
}
el se {
d[ i 0] = k;
v[ k] = i 0;
d[ u0] = j 0;
v[ j 0] = u0;
d[ k] = c0;
v[ c0] = k;
}
}
}
pr i nt f ( " S= %d\ n" , s) ;
f or ( i = 1; i <= n; i ++)
pr i nt f ( " %d " ,
a[ i ] [ d[ i ] ] ) ;
pr i nt f ( " \ n" ) ;
}

S-ar putea să vă placă și