Baixe o app para aproveitar ainda mais
Prévia do material em texto
Maquina de Lavar Fuzzy.c #include <stdio.h> #include <stdlib.h> /* DADOS DO PROBLEMA T(X1) = {PS(pequena sujeira),MS(média sujeira),GS(grandesujeira)} T(X2) = {SM(sem mancha), MM(média mancha),GM(grandemancha)} T(Y) = {MC(muito curto), C(curto), M(médio), L(longo), ML(muito longo)} PS 0-50 MS 0-50-100 GS 50-100 SM 0-50 MM 0-50-100 GM 50-100 MC 0-10 C 0-10-25 M 10-25-40 L 25-40-60 ML 40-60 | SM | MM | GM PS | MC | M | L MS | C | M | L GS | M | L | ML */ // Conjuntos Fuzzy de saída // // MC C M L ML //1|**** ---- xxxx aaaa oooo| // | . * - . . - x . . x a . . a o . | // | . * - . . - x . . x a . . a o . | // | . *- . . - x . . x a . . a o . | // | . - * . . x - . . a x . . o a . | //0|___.__-______*__.__.___x_____-___.__.___a_____x___.__.___o_____a___.___| // 0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 1 struct PertinenciaSugeira { double PS; double MS; double GS; }; struct PertinenciaSugeira PerSu; struct PertinenciaMancha Página 1 Maquina de Lavar Fuzzy.c { double SM; double MM; double GM; }; struct PertinenciaMancha PerMa; struct PertSaida { double MC; double C; double M; double L; double ML; }; struct PertSaida PerSa; double saida; // Conjuntos Fuzzy // // Baixo medio alto //1|**** ---- xxxx| // | . * - . . - x . | // | . * - . . - x . | // | . *- . . - x . | // | . - * . . x - . | //0|___.__-______*__.__.___x_____-___.___| // 0 P1 P2 P3 P4 P5 P6 P7 P8 1 void calculaPertinenciaSugeira(double valor, double p1,double p2,double p3,double p4,double p5, double p6, double p7, double p8) { // calcula a pertinência ao conjunto PS if(valor<p1) { PerSu.PS=1.0; } if(valor>=p1&&valor<p3) { PerSu.PS=(p3-valor) / (p3-p1); } if(valor>=p3) { PerSu.PS=0.0; } // calcula a pertinência ao conjunto MS if(valor<p2) { Página 2 Maquina de Lavar Fuzzy.c PerSu.MS=0.0; } if(valor>=p2&&valor<p4) { PerSu.MS=(valor - p2) / (p4 - p2); } if(valor>=p4&&valor<p5) { PerSu.MS=1.0; } if(valor>=p5&&valor<p7) { PerSu.MS=(p7-valor) / (p7-p5); } if(valor>=p7) { PerSu.MS=0.0; } // calcula a pertinência ao conjunto GS if(valor<p6) { PerSu.GS=0.0; } if(valor>=p6&&valor<p8) { PerSu.GS=(valor - p6) / (p8 - p6); } if(valor>=p8) { PerSu.GS=1.0; } } void calculaPertinenciaMancha(double valor, double p1,double p2,double p3,double p4,double p5, double p6, double p7, double p8) { // calcula a pertinência ao conjunto SM if(valor<p1) { PerMa.SM=1.0; } if(valor>=p1&&valor<p3) { PerMa.SM=(p3-valor) / (p3-p1); } if(valor>=p3) { PerMa.SM=0.0; } // calcula a pertinência ao conjunto MM Página 3 Maquina de Lavar Fuzzy.c if(valor<p2) { PerMa.MM=0.0; } if(valor>=p2&&valor<p4) { PerMa.MM=(valor - p2) / (p4 - p2); } if(valor>=p4&&valor<p5) { PerMa.MM=1.0; } if(valor>=p5&&valor<p7) { PerMa.MM=(p7-valor) / (p7-p5); } if(valor>=p7) { PerMa.MM=0.0; } // calcula a pertinência ao conjunto GS if(valor<p6) { PerMa.GM=0.0; } if(valor>=p6&&valor<p8) { PerMa.GM=(valor - p6) / (p8 - p6); } if(valor>=p8) { PerMa.GM=1.0; } } struct Regra { double A1; double A2; double saida; }; struct Regra R1; struct Regra R2; struct Regra R3; struct Regra R4; struct Regra R5; struct Regra R6; struct Regra R7; struct Regra R8; struct Regra R9; Página 4 Maquina de Lavar Fuzzy.c void AvaliaRegrasFuzzy() { // base de regras // | SM | MM | GM // PS | MC | M | L // MS | C | M | L // GS | M | L | ML // Busca os valores de pertinência e armazena nas régras // Calcula o valor de ativação da régra pelo "MÍNIMO" // Calcula a ativação de cada conjunto de saída pelo "MÁXIMO" // 1 SM PS -> MC R1.A1=PerMa.SM; R1.A2=PerSu.PS; if(R1.A1<R1.A2) R1.saida=R1.A1; else R1.saida=R1.A2; // 2 SM MS -> C R2.A1=PerMa.SM; R2.A2=PerSu.MS; if(R2.A1<R2.A2) R2.saida=R2.A1; else R2.saida=R2.A2; // 3 SM GS -> M R3.A1=PerMa.SM; R3.A2=PerSu.GS; if(R3.A1<R3.A2) R3.saida=R3.A1; else R3.saida=R3.A2; // 4 MM PS -> M R4.A1=PerMa.MM; R4.A2=PerSu.PS; if(R4.A1<R4.A2) R4.saida=R4.A1; else R4.saida=R4.A2; // 5 MM MS -> M R5.A1=PerMa.MM; R5.A2=PerSu.MS; if(R5.A1<R5.A2) R5.saida=R5.A1; else R5.saida=R5.A2; // 6 MM GS -> L R6.A1=PerMa.MM; R6.A2=PerSu.GS; if(R6.A1<R6.A2) R6.saida=R6.A1; else R6.saida=R6.A2; // 7 GM PS -> L R7.A1=PerMa.GM; Página 5 Maquina de Lavar Fuzzy.c R7.A2=PerSu.PS; if(R7.A1<R7.A2) R7.saida=R7.A1; else R7.saida=R7.A2; // 8 GM MS -> L R8.A1=PerMa.GM; R8.A2=PerSu.MS; if(R8.A1<R8.A2) R8.saida=R8.A1; else R8.saida=R8.A2; // 9 GM GS -> ML R9.A1=PerMa.GM; R9.A2=PerSu.GS; if(R9.A1<R9.A2) R9.saida=R9.A1; else R9.saida=R9.A2; /* calcula conjuntos de saída pelo "MÁXIMO" MC <- R1 C <- R2 M <- MAX (R3,R4,R5) L <- MAX (R6,R7,R8) ML <- R9 */ PerSa.MC=R1.saida; PerSa.C=R2.saida; PerSa.M=R3.saida; if(PerSa.M<R4.saida) PerSa.M=R4.saida; if(PerSa.M<R5.saida) PerSa.M=R5.saida; PerSa.L=R6.saida; if(PerSa.L<R7.saida) PerSa.L=R7.saida; if(PerSa.L<R8.saida) PerSa.L=R8.saida; PerSa.ML=R9.saida; } void CalculaSaida() { double centMC; double centC; double centM; double centL; double centML; double num=0; double den=0; // Calcula a saída pelo Método da Média Ponderada dos Máximos // calcula o centro de cada conjunto de saída (MC, C, M, L, ML) centMC = (0+10)/2; centC = (0+25)/2; Página 6 Maquina de Lavar Fuzzy.c centM = (10+40)/2; centL = (25+60)/2; centML = (40+60)/2; //calcula a média if(PerSa.MC>0) { num=num+centMC*PerSa.MC; den=den+PerSa.MC; } if(PerSa.C>0) { num=num+centC*PerSa.C; den=den+PerSa.C; } if(PerSa.M>0) { num=num+centM*PerSa.M; den=den+PerSa.M; } if(PerSa.L>0) { num=num+centL*PerSa.L; den=den+PerSa.L; } if(PerSa.ML>0) { num=num+centML*PerSa.ML; den=den+PerSa.ML; } saida=num/den; } int main() { double sugeira=0; // 0 a 100 double mancha=0; // 0 a 100 // obtem entradas printf("Digite a quantidade de sugeira e manchas (0 a 100): "); scanf("%lf %lf",&sugeira,&mancha); printf("Sugeira = %lf\r\nMancha = %lf\r\n",sugeira,mancha); // calcula pertinencias das entradas nos conjuntos calculaPertinenciaMancha(mancha,0.0,0.0,50.0,50.0,50.0,50.0,100,100); calculaPertinenciaSugeira(sugeira,0.0,0.0,50.0,50.0,50.0,50.0,100,100); printf("\r\n"); printf("PerMa.SM,PerMa.MM,PerMa.GM = %lf %lf %lf\r\n",PerMa.SM,PerMa.MM,PerMa.GM); printf("PerSu.PS,PerSu.MS,PerSu.GS = %lf %lf %lf\r\n",PerSu.PS,PerSu.MS,PerSu.GS); Página 7 Maquina de Lavar Fuzzy.c // avalia as regras AvaliaRegrasFuzzy(); printf("\r\n"); printf("R1.A1,R1.A2,R1.saida = %lf %lf %lf\r\n",R1.A1,R1.A2,R1.saida); printf("R2.A1,R2.A2,R2.saida = %lf %lf %lf\r\n",R2.A1,R2.A2,R2.saida); printf("R3.A1,R3.A2,R3.saida = %lf %lf %lf\r\n",R3.A1,R3.A2,R3.saida); printf("R4.A1,R4.A2,R4.saida = %lf %lf %lf\r\n",R4.A1,R4.A2,R4.saida); printf("R5.A1,R5.A2,R5.saida= %lf %lf %lf\r\n",R5.A1,R5.A2,R5.saida); printf("R6.A1,R6.A2,R6.saida = %lf %lf %lf\r\n",R6.A1,R6.A2,R6.saida); printf("R7.A1,R7.A2,R7.saida = %lf %lf %lf\r\n",R7.A1,R7.A2,R7.saida); printf("R8.A1,R8.A2,R8.saida = %lf %lf %lf\r\n",R8.A1,R8.A2,R8.saida); printf("R9.A1,R9.A2,R9.saida = %lf %lf %lf\r\n",R9.A1,R9.A2,R9.saida); printf("\r\n"); printf("PerSa.MC = %lf\r\n",PerSa.MC); printf("PerSa.C = %lf\r\n",PerSa.C); printf("PerSa.M = %lf\r\n",PerSa.M); printf("PerSa.L = %lf\r\n",PerSa.L); printf("PerSa.ML = %lf\r\n",PerSa.ML); CalculaSaida(); printf("\r\n"); printf("SAIDA = %lf\r\n",saida); return 0; } Página 8
Compartilhar