Manual Unfuzzy
Manual Unfuzzy
Generalidades
Requerimientos
Instalación
Los discos que acompañan a este texto incluyen la versión comprimida
(.ZIP) de UNFUZZY; los pasos a seguir para instalar el programa son los
siguientes:
Un primer ejemplo
En las siguientes líneas se explica cómo leer desde disco un archivo de
ejemplo suministrado con UNFUZZY, para tener un contacto inicial con las
opciones de diseño y análisis que brinda el programa.
Primeros cálculos
Si bien este primer cálculo resume todas las operaciones del Sistema de
Lógica Difusa, en ocasiones es deseable tener un conocimiento sobre los
pasos intermedios que llevaron a obtener tal resultado; para ello, el usuario
debe efectuar una cualquiera de las siguientes dos operaciones:
Para ver otras opciones de edición del Universo de Entrada, el lector puede
remitirse al numeral 4.3.1.
Figura 0.7 Cuadro de Diálogo Definir Variable de Entrada
Para consultar o modificar otra Regla, el usuario debe emplear las opciones
Siguiente, Anterior, o Ir A.... Para ver otras opciones de edición de la Base
de Reglas, el lector puede remitirse al numeral 4.3.3.
Generación de Tablas
Para ver detalles sobre el código fuente generado, el lector puede remitirse
a los numerales 4.4.5. y 4.6.
Opciones de Diseño
Tipo Descripción1
Tipo L Conjunto Difuso con función de pertenencia
⎧1,x < a
⎪
f(x) = ⎨(b − x)/(b − a),a > x > b
⎪0,x > b
⎩
Triangulo Conjunto Difuso con función de pertenencia
⎧0,x < a
⎪(x − b)/(a − b),a > x > b
⎪
f(x) = ⎨
⎪(c − x)/(c − b),b > x > c
⎪⎩0,x > c
Pi Conjunto Difuso con función de pertenencia
⎧0,x < a
⎪(x − b)/(a − b),a > x > b
⎪⎪
f(x) = ⎨1, b > x > c
⎪(d − x)/(d − c),c > x > d
⎪
⎩⎪0,x > d
Tipo Gamma Conjunto Difuso con función de pertenencia
⎧0,x < a
⎪
f(x) = ⎨(x − a)/(b − a),a > x > b
⎪1,x > b
⎩
Tipo Z Conjunto Difuso con función de pertenencia
⎧1,x < a
⎪
⎪1 − 2((x − a)/(b − a)) , a > x > (a + b) / 2
2
f(x) = ⎨
⎪2((x − b)/(b − a)) ,(a + b) / 2 > x > b
2
⎪0,x > b
⎩
Campana Conjunto Difuso con función de pertenencia
1
En esta tabla, a,b,c,d son reales definidos dentro del Universo de Discurso
de la Variable Lingüística que contiene al ConjuntoDifuso, que satisfacen
a<b<c<d.
⎧0,x < a
⎪
⎪2((x − a)/(b − a)) ,a > x > (a + b) / 2
2
f(x) = ⎨
⎪1 − 2((x − b)/(b − a)) ,(a + b) / 2 > x > b
2
⎪1,x > b
⎩
Singlenton Conjunto Difuso con función de pertenencia
⎧0,x ≠ x 0
f(x) = ⎨
⎩1,x = x 0
Tabla 4.2
Tipos de Conjuntos Difusos Disponibles
Tipo Descripción
Triangulo difusor que genera Conjuntos Difusos tipo Triangulo
Pi difusor que genera Conjuntos Difusos tipo Pi
Campana difusor que genera Conjuntos Difusos tipo Campana
PiCampana difusor que genera Conjuntos Difusos tipo PiCampana
Singlenton difusor que genera Conjuntos Difusos tipo Singlenton
Tabla 4.3
Tipos de Difusores Disponibles
Tipo Descripción
Mínimo T_Norma definida por la relación
f ( x , y ) = min( x , y )
Producto T_Norma definida por la relación
f ( x , y ) = xy
Producto Drastico T_Norma definida por la relación
⎧x, y = 1
⎪
f ( x, y) = ⎨ y, x = 1
⎪0, x ≠ 1 ANDy ≠ 1
⎩
Producto Acotado T_Norma definida por la relación
f ( x , y ) = max (0, x + y − 1)
Familia Tp T_Norma definida por la relación
[ ]
1/ p
f ( x , y ) = 1 − (1 − x ) p + (1 − y ) p − (1 − x ) p *(1 − y ) p
p ∈ℜ
Familia Hamacher T_Norma definida por la relación
xy
f ( x, y) =
p + (1 − p)( x + y − xy )
p≥0
Familia Sugeno T_Norma definida por la relación
f ( x , y ) = min(1, x + y + p − xy )
p ≥ −1
Familia Frank T_Norma definida por la relación
⎛ ( p x − 1)( p y − 1) ⎞
f ( x , y ) = log p ⎜ 1 + ⎟
⎝ p −1 ⎠
p>0
FamiliaYager T_Norma definida por la relación
f ( x , y ) = 1 − min(1, ((1 − a ) p + (1 − b) p ) 1/ p )
p≥0
Familia Dubois-Prade T_Norma definida por la relación
xy
f ( x, y) =
max ( x , y , p)
0≤ p≤1
Máximo T_Norma definida por la relación
f ( x , y ) = max ( x , y )
Suma Acotada T_Norma definida por la relación
f ( x , y ) = min(1, x + y )
Suma Drástica T_Norma definida por la relación
⎧x, y = 0
⎪
f ( x, y) = ⎨ y, x = 0
⎪1, x ≠ 1 ANDy ≠ 1
⎩
Tabla 4.4
Tipos de Normas Disponibles
Tipo Descripción
Producto Implicación de Ingeniería definida por la relación
f ( x , y ) = xy
Mínimo Implicación de Ingeniería definida por la relación
f ( x , y ) = min( x , y )
Kleene Dienes Implicación Lógica definida por la relación
f ( x , y ) = max(1 − x , y )
Lukasiewicz Implicación Lógica definida por la relación
f ( x , y ) = min(11
, − x + y)
Zadeh Implicación Lógica definida por la relación
f ( x , y ) = max (min( x , y ),1 − x )
Estocástica Implicación Lógica definida por la relación
f ( x , y ) = max (1 − x , xy )
Goguen Implicación Lógica definida por la relación
y
f ( x , y ) = min(1, )
x
Godel Implicación Lógica definida por la relación
⎧1, x ≤ y
f ( x, y) = ⎨
⎩ y, x > y
Aguda Implicación Lógica definida por la relación
⎧1, x ≤ y
f ( x, y) = ⎨
⎩0, x > y
Tabla 4.5
Tipos de Implicaciones Disponibles
Tipo Descripción2
Primer Máximo Concresor definido por la expresión
y * = inf { y ∈U | μ ( y) = sup μ B ( y )}
y ∈U
y *
2 = sup{ y ∈U | μ ( y ) = sup μ B ( y )}
y ∈U
( y *1 + y * 2 )
y* =
2
Centro De Gravedad Concresor definido por la expresión
∫ yμ B ( y )dy
y = * U
∫μ
U
B ( y )dy
2
En esta tabla se supone que el Motor de Inferencia produce m Conjuntos
Difusos para la Variable de Salida en cuestión, que está definida sobre un
Universo de Discurso U; cada uno de los m conjuntos tiene una función de
pertenencia uBi(y), i=1,2,..m . Si el Concresor efectúa la Unión o la
Intersección de los m conjuntos, el resultado es un Conjunto Difuso B que
tiene función de pertenencia uB(y).
m
∑yμ
i i
Bi ( y)
i =1
y* = m
∑μ
i
Bi ( y )
i =1
i
y = centroAltura (i )
centroAltura(i) es un parámetro del Conjunto Difuso de la Variable de
Salida, que corresponde al Consecuente de la regla i; dicho parámetro
intenta representar el centro del Conjunto Difuso.
Tabla 4.6
Tipos de Concresores Disponibles
El orden en el que se deben efectuar estos pasos sólo está regido por las
siguientes reglas:
Definir Variable:
Insertar Variable
Eliminar Variable
Tipo de Difusor
Definir Difusor
Puntos de Evaluación
Definir Conjunto
Insertar Conjunto
Eliminar Conjunto
Tipo de Conjunto
Autodefinir Variable
Intervalos de Evaluación
Definición Rápida
Con esta opción UNFUZZY ayuda al usuario a definir una Base de Reglas
de forma rápida; para utilizar esta opción, el usuario debe ejecutar el
Comando Definición Rápida del Menú Inferencia, con lo cual se despliega
el cuadro de Diálogo Definición Rápida de Reglas, que se muestra en la
figura 4.20. Con este Cuadro el usuario puede efectuar las siguientes tareas:
Con esta opción UNFUZZY ayuda al usuario a definir una a una las Reglas
que forman la Base; para utilizar esta opción, el usuario debe efectuar una
cualquiera de las siguientes tres operaciones:
Modificaciones en el Antecedente
Modificaciones en el Consecuente
Siguiente Regla
Anterior Regla
Ir A....
El botón Ir A... permite ubicar rápidamente una regla dentro de la base y/o
adicionar nuevas reglas, para ello despliega el cuadro de diálogo Ir a... que
se muestra en la figura 4.22; La regla se identifica por los términos del
Antecedente, por lo tanto en este Cuadro de Diálogo no se incluye la
información del Consecuente.
Figura 0.22 Cuadro de Diálogo Ir A...
Para buscar una regla el usuario puede ubicarla por su número, mediante la
caja de edición Número de Regla, o mediante los términos del Antecedente
así:
De lo anterior es claro que para adicionar una regla, primero debe buscarse
en la Base, y si no existe, entonces aceptar cuando UNFUZZY le pregunte
si desea adicionarla.
Eliminar Regla
Eliminar Todas
El botón Eliminar Todas elimina todas las reglas de la base de reglas;
siempre subsistirá una regla, con lo que se impide que el programa entre en
inconsistencias internas.
Cálculo de Salidas
Esta opción permite calcular cuáles son los valores concretos de las
Variables de Salida para unos ciertos valores concretos de las Variables de
entrada; para ello, el usuario debe efectuar una cualquiera de las siguientes
dos operaciones:
1. Ejecutar el Comando Calcular del Menú Analizador
2. Utilizar el Ícono de la Barra de Herramientas que se muestraen la figura
4.4
Esta opción permite calcular cuáles son los valores concretos de las
Variables de Salida para unos ciertos valores concretos de las Variables de
entrada, mostrando los pasos intermedios que llevaron a obtener tal
resultado; para acceder a esta opción el usuario debe efectuar una
cualquiera de las siguientes dos operaciones:
Función de Transferencia
Selección de Entrada
Selección de Salida
Entradas fijas
Limpiar
3
Ver Tabla 1.2
5. Emplear la opción Entrenar, para ejecutar el algoritmo de
Entrenamiento.
Los dos principales objetivos del código fuente generado por UNFUZZY
son los siguientes:
1. Permitir que el software del usuario cree fácilmente (con una sola
instrucción) el Sistema de Lógica Difusa.
2. Permitir que el sofware del usuario consulte fácilmente (con una sola
instrucción) cuáles son las salidas concretas del Sistema de Lógica
Difusa, para unas ciertas entradas concretas.
4
Ver numerales 4.3.1.3.7 al 4.3.1.3.11
es posible que el encadenador detecte que el código generado exceda el
estándar de 64K, en cuyo caso el usuario deberá fraccionar el archivo.
Código C
1. define:
NUMEROREGLAS : Número total de Reglas
NUMEROVARIABLESENTRADA : Número de variables de Entrada
NUMEROVARIABLESSALIDA : Número de variables de Salida
2. struct
conjunto: incluye las siguientes variables
char nombre[40] : cadena con el nombre de la variable
float minimo : límite inferior del soporte del conjunto
float maximo : límite superior del soporte del conjunto
funciones:
void llenarDatos() : esta función crea el Sistema de Lógica Difusa; en rigor, lo que hace es asignar a las
variables, estructuras y vectores globales sus valores adecuados.
void calcular(float *ent, float * sal): esta función permite calcular cuáles son los valores concretos de
salida del Sistema de Lógica Difusa, cuando se especifican unos valores concretos de entrada; los valores
de entrada deben estar en el vector ent, y los valores de salida se archivan en el vector sal.
Código C++
1. void calcular(float *entra,float *sale): esta función permite calcular cuáles son los valores concretos
de salida del Sistema de Lógica Difusa, cuando se especifican unos valores concretos de entrada; los
valores de entrada deben estar en el vector ent, y los valores de salida se archivan en el vector sal.
Debido a que las clases incluidas en los archivos fuzzy.hpp y fuzzy.cpp son
versiones resumidas de las mismas clases empleadas para implementar
UNFUZZY, se recomienda al lector que desee profundizar en el
conocimiento de su diseño, remitirse a los capítulos 2 y 3.