Documente Academic
Documente Profesional
Documente Cultură
Lucrare de laborator
Algoritmul Malgrange
Student:
Student:
Profesor: Novac L.
Chiinu 2009
I. Noiuni preliminare:
Fie M o matrice binar, finit, de dimensiune mn, cu mulimea de linii L={l 1,l2,,lm} i
mulimea de coloane C={c1,c2,,cm}. Vom nota =(A,B) matricea format din elementele de la
intersecia liniilor AI i a coloanelor BJ.
Fie acum 1 i 2 dou submatrice ale matricei M, determinate de perechile de mulimi de linii
i coloane (Ai,Bi) i=1,2 (1=(A1,B1) i 2=(A2,B2)).
Dac A1A2 , B1B2 (12), matricea 1 se numete submatrice a matricei 2 .
Dac toate elementele din sunt egale cu 1, submatricea a matricei M se numete
complet.
Dac submatricea este complet i n M nu exist o alt submatrice complet astfel nct
, se numete principal.
Dac orice element egal cu 1 din M aparine cel puin unei submatrici din familia C={1,2,
,p}, aceast familie C se numete acoperire a matricei C.
Cardinalul mulimii stabile interior maxime a grafului G se noteaz prin 0(G) i se numete
numr de stabilitate intern.
a b c d e f
a 0 1 0 1 1 1
b 1 0 1 1 1 1
c 0 1 0 1 0 0
d 1 1 1 0 1 1
e 1 1 0 1 0 1
f 1 1 0 1 1 0
iar este matricea complementar a acesteia (elementele ij ale matricei se calculeaz n baza
elementelor aij ale matricei A dupa formula ij=1- aij):
a b c d e f
2
a 1 0 1 0 0 0
b 0 0 0 0 0 0
c 1 0 1 0 1 1
d 0 0 0 1 0 0
e 0 0 1 0 1 0
f 0 0 1 0 0 1
1
Scopul lucrrii: De a construi toate submatricile principale ptratice ale lui , n baza crora
se pot determina toate mulimile maximale stabile interior ale ale grafului G, prin utilizarea
algoritmului Malgrange.
Pasul 2. Pentru p=0, construim familia Xp={iCp, ji astfel, nct j i } familia tuturor
submatricelor complete din Cp, care care se conin n alte submatrice ale lui Cp.
Pasul 3. Construim familia de submatrice (Cp\Xp), care se obine prin aplicarea operaiilor
i asupra tuturor perechilor posibile de matrice i, j din Cp\Xp, cu condiia ca aceste
elemente noi s nu le conin pe submatricele din Cp\Xp.
3
C1C0\X0) ((C0\X0)) = { (a,ac), (b,b), (c,acef), (d,d), (e,ce), (f,cf), (ac,ac), (ae,c), (af,c), (ce,ce),
(cf,cf), (ef,c) }.
C1\X1= { (b,b), (c,acef), (d,d), (f,cf), (ac,ac), (ae,c), (af,c), (ce,ce), (ef,c) }.
4
(af,c) (ce,ce) = (af ce, c ce) = (acef,c)
(C1\X1) = { (cf,cf), (ac,ac), (ace,c), (acf,c), (ce,ce), (cef,c), (af,c), (ef,c), (aef,c), (acef,c) }
Pasul 4.
C2C1\X1) ((C1\X1)) = { (b,b), (c,acef), (d,d), (f,cf), (ac,ac), (ae,c), (af,c), (ce,ce), (ef,c), (cf,cf),
(ace,c), (acf,c), (cef,c), (aef,c), (acef,c) }
Pasul 5. C2 1
(f,cf) (cf,cf)
(ae,c) (ace,c), (aef,c) i (acef,c)
(af,c) (acf,c), (aef,c) i (acef,c)
(ef,c) (cef,c) i (acef,c)
3
(ace,c) (acef,c)
(acf,c) (acef,c)
(cef,c) (acef,c)
(aef,c) (acef,c)
X2 = {(f,cf), (ae,c), (af,c), (ef,c), (ace,c), (acf,c), (cef,c), (aef,c)}
Pasul 4.
C3C2\X2) ((C2\X2)) = { (b,b), (c,acef), (d,d), (ac,ac), (ce,ce), (cf,cf), (acef,c), (ace,c), (acf,c),
(cef,c) }
5
Pasul 5. C3 2
(ace,c) (acef c)
(acf,c) (acef,c)
(cef,c) (acef,c)
4
Pasul 4.
C4C3\X3) ((C3\X3)) = C3
C3 { (b,b), (c,acef), (d,d), (ac,ac), (ce,ce), (cf,cf), (acef,c), (ace,c), (acf,c), (cef,c) }
S = { {b}, {d}, {a, c}, {c, e}, {c, f} } (S-familia tuturor mulimilor stabile interior a grafului G).
Mulimile stabile interior maxim sunt {a, c}, {c, e} i {c, f}.
struct multsime{
struct submultime{
char A[10],B[10];
}sm[100];
}C[2],X[1];
char nit[10],nru[10];
6
unsigned c2(char *, char*);
void it(char* , char*);
void ru(char* , char*);
void sort(char *);
void del(unsigned , unsigned);
unsigned check(char *,char *,unsigned n);
unsigned eql(unsigned ,unsigned );
int main(){
//clrscr();
multsime S;
unsigned i, j, n, com[10][10]; //com - complementara
char *std="ABCDEFGH", lit[2]={'\0'};
int b[6][6]={
0,1,0,1,1,1,//1
1,0,1,1,1,1,//2
0,1,0,1,0,0,//3
1,1,1,0,1,1,//4
1,1,0,1,0,1,//5
1,1,0,1,1,0};//6
n=6;
/* printf("introdu nr de virfuri:");
scanf("%i", &v);
printf("introdu matricea de adiacenta:");
for(i=0; i<v; i++)
for(j=0; j<v; j++){
printf("\n b[%c][%c]=",std[i],std[j]);
scanf("%i", &b[i][j]);
}*/
printf("complementara:\n");
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
com[i][j]=1-b[i][j];
printf( " %i ",com[i][j]);}
printf("\n");
}
//-----------------------------------------------------------------
do{
C[1]=C[0];
m=n;
n=v;
for (i=0;i<m;i++)
for (j=0;j<m;j++)
if ((i!=j) && (c2(C[0].sm[i].A, C[0].sm[j].A)) && (c2(C[0].sm[i].B, C[0].sm[j].B))){
strcpy(X[0].sm[k].A,C[0].sm[j].A);
strcpy(X[0].sm[k].B,C[0].sm[j].B);
k++;
}
//afisharea X[]
printf("\nafisham multsimea X\n");
for (i=0;i<k;i++){
7
if (strlen(X[0].sm[i].A))
printf("X(%s|%s)\n", X[0].sm[i].A, X[0].sm[i].B);}
getch();
//(C[]/X[])
for(i=0;i<n;i++)
for(j=0;j<k+1;j++)
if( !strcmp(C[0].sm[i].A, X[0].sm[j].A) && !strcmp(C[0].sm[i].B, X[0].sm[j].B))
{del(i,n);n--;}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++){
ru(C[0].sm[i].A, C[0].sm[j].A);
it(C[0].sm[i].B, C[0].sm[j].B);
printf("(%s,%s)U(%s,%s)=(%s,%s)\n",C[0].sm[i].A,C[0].sm[i].B,C[0].sm[j].A,C[0].sm[j].B,nru,strlen(nit)>0?nit:"Vid");
if (strlen(nit) && strlen(nru) && check(nru,nit,v)){
strcpy(C[0].sm[v].A, nru);
strcpy(C[0].sm[v].B, nit);
v++;
}
}
getch();
puts("C[0]");
for (l=0;l<m;l++) if(strlen(C[1].sm[l].A)) printf("\t%.2d.C[1](%s|%s)\n",l, C[1].sm[l].A, C[1].sm[l].B);
puts("C[1]");
for (l=0;l<v;l++) if(strlen(C[0].sm[l].A)) printf("\t%.2d.C[0](%s|%s)\n",l, C[0].sm[l].A, C[0].sm[l].B);
getch();
n=v;
printf("X=%d",k);
printf("\nCiclu\n\n");
}while(eql(m,n)); printf("\ndone!\n");
//------------------------------------------------------------------
char vt[10][10];
puts("Rezultat:");
printf("F=");
for (l=0;l<v;l++)
if ((strcmp(C[0].sm[l].A,C[0].sm[l].B)==0) && (strlen(C[0].sm[l].B)))
printf("(%s|%s);",C[0].sm[l].A, C[0].sm[l].B);
printf("\nS={");
for (l=0;l<v;l++)
if ((strcmp(C[0].sm[l].A,C[0].sm[l].B)==0) && (strlen(C[0].sm[l].B))){
printf("{");
for (i=0;i<strlen(C[0].sm[l].A);i++) printf("%s%c",i?",":"",C[0].sm[l].A[i]);
printf("}");
}
printf("}");
getch();
return 1;
}
//controleaza da ca intrun shie se contsine caracterul variabila
unsigned cmp(char *p,char c){ //return 0 dace este return 1 daca nui
unsigned i=0;
while (*(p+i))
if(*(p+i++)==c) return 0;
return 1;
};
8
//intersectsia a 2 shiruri
void it(char *a,char *b){
char inter[10]={'\0'};
unsigned i=0;
if(strlen(a) && strlen(b))
while (*(b+i))
if(!cmp(a,*(b+i++))) *(inter+strlen(inter))=*(b+i-1);
sort(inter);
strcpy(nit,inter);
}
//reunuinea a 2 shiruri
void ru(char* a, char* b){
int i=0;
strcpy(nru,a);
char lit[2]={'\0'};
while (*(b+i))
if ( cmp(nru,b[i++]) ) {lit[0]=*(b+i-1); strcat(nru,lit);}
sort(nru);
}
Rezultatul
complementara: 0 0 0 1 0 0 C(A|AC)
1 0 1 0 0 0 0 0 1 0 1 0 C(B|B)
0 1 0 0 0 0 0 0 1 0 0 1 C(C|ACEF)
1 0 1 0 1 1 Afisharea lui C/ Pasul 2 C(D|D)
9
C(E|CE) (B,B)U(AF,C)=(ABF,Vid) C(AE|C)
C(F|CF) (B,B)U(CE,CE)=(BCE,Vid) C(AF|C)
(B,B)U(CF,CF)=(BCF,Vid) C(CE|CE)
afisham multsimea X (B,B)U(EF,C)=(BEF,Vid) C(CF|CF)
(C,ACEF)U(D,D)=(CD,Vid) C(EF|C)
Pasul 3 (C,ACEF)U(AC,AC)=(AC,AC) C(|)
(A,AC)U(B,B)=(AB,Vid) (C,ACEF)U(AE,C)=(ACE,C) C(|)
(A,AC)U(C,ACEF)=(AC,AC) (C,ACEF)U(AF,C)=(ACF,C) C(|)
(A,AC)U(D,D)=(AD,Vid) (C,ACEF)U(CE,CE)=(CE,CE) C(ACE|C)
(A,AC)U(E,CE)=(AE,C) (C,ACEF)U(CF,CF)=(CF,CF) C(ACF|C)
(A,AC)U(F,CF)=(AF,C) (C,ACEF)U(EF,C)=(CEF,C) C(CEF|C)
(B,B)U(C,ACEF)=(BC,Vid) (D,D)U(AC,AC)=(ACD,Vid) C(ACEF|C)
(B,B)U(D,D)=(BD,Vid) (D,D)U(AE,C)=(ADE,Vid) C(AEF|C)
(B,B)U(E,CE)=(BE,Vid) (D,D)U(AF,C)=(ADF,Vid)
(B,B)U(F,CF)=(BF,Vid) (D,D)U(CE,CE)=(CDE,Vid) afisham multsimea X
(C,ACEF)U(D,D)=(CD,Vid) (D,D)U(CF,CF)=(CDF,Vid) X(A|AC)
(C,ACEF)U(E,CE)=(CE,CE) (D,D)U(EF,C)=(DEF,Vid) X(E|CE)
(C,ACEF)U(F,CF)=(CF,CF) (AC,AC)U(AE,C)=(ACE,C) X(F|CF)
(D,D)U(E,CE)=(DE,Vid) (AC,AC)U(AF,C)=(ACF,C) X(AE|C)
(D,D)U(F,CF)=(DF,Vid) (AC,AC)U(CE,CE)=(ACE,C) X(AF|C)
(E,CE)U(F,CF)=(EF,C) (AC,AC)U(CF,CF)=(ACF,C) X(EF|C)
C[0] (AC,AC)U(EF,C)=(ACEF,C) X(AE|C)
00.C[1](A|AC) (AE,C)U(AF,C)=(AEF,C) X(AF|C)
01.C[1](B|B) (AE,C)U(CE,CE)=(ACE,C) X(EF|C)
02.C[1](C|ACEF) (AE,C)U(CF,CF)=(ACEF,C) X(ACE|C)
03.C[1](D|D) (AE,C)U(EF,C)=(AEF,C) X(ACF|C)
04.C[1](E|CE) (AF,C)U(CE,CE)=(ACEF,C) X(CEF|C)
05.C[1](F|CF) (AF,C)U(CF,CF)=(ACF,C) X(AEF|C)
C[1] (AF,C)U(EF,C)=(AEF,C) X(AE|C)
00.C[0](A|AC) (CE,CE)U(CF,CF)=(CEF,C) X(AF|C)
01.C[0](B|B) (CE,CE)U(EF,C)=(CEF,C) X(EF|C)
02.C[0](C|ACEF) (CF,CF)U(EF,C)=(CEF,C)
03.C[0](D|D) C[0] Pasul 3
04.C[0](E|CE) 00.C[1](A|AC) (B,B)U(C,ACEF)=(BC,Vid)
05.C[0](F|CF) 01.C[1](B|B) (B,B)U(D,D)=(BD,Vid)
06.C[0](AC|AC) 02.C[1](C|ACEF) (C,ACEF)U(D,D)=(CD,Vid)
07.C[0](AE|C) 03.C[1](D|D) C[0]
08.C[0](AF|C) 04.C[1](E|CE) 00.C[1](B|B)
09.C[0](CE|CE) 05.C[1](F|CF) 01.C[1](C|ACEF)
10.C[0](CF|CF) 06.C[1](AC|AC) 02.C[1](D|D)
11.C[0](EF|C) 07.C[1](AE|C) 03.C[1](AC|AC)
X=0 08.C[1](AF|C) 04.C[1](AE|C)
Ciclu 09.C[1](CE|CE) 05.C[1](AF|C)
10.C[1](CF|CF) 06.C[1](CE|CE)
Afisharea lui C/ Pasul 2 11.C[1](EF|C) 07.C[1](CF|CF)
C(A|AC) C[1] 08.C[1](EF|C)
C(B|B) 00.C[0](B|B) 12.C[1](ACE|C)
C(C|ACEF) 01.C[0](C|ACEF) 13.C[1](ACF|C)
C(D|D) 02.C[0](D|D) 14.C[1](CEF|C)
C(E|CE) 03.C[0](AC|AC) 15.C[1](ACEF|C)
C(F|CF) 04.C[0](AE|C) 16.C[1](AEF|C)
C(AC|AC) 05.C[0](AF|C) C[1]
C(AE|C) 06.C[0](CE|CE) 00.C[0](B|B)
C(AF|C) 07.C[0](CF|CF) 01.C[0](C|ACEF)
C(CE|CE) 08.C[0](EF|C) 02.C[0](D|D)
C(CF|CF) 12.C[0](ACE|C) 03.C[0](AC|AC)
C(EF|C) 13.C[0](ACF|C) 04.C[0](CE|CE)
14.C[0](CEF|C) 05.C[0](CF|CF)
afisham multsimea X 15.C[0](ACEF|C) 06.C[0](ACEF|C)
X(A|AC) 16.C[0](AEF|C) X=64
X(E|CE) X=3 Ciclu
X(F|CF) Ciclu
10