Articulo de referencia

lenguaje de marcado difuso

El lenguaje de marcado difuso ( FML ) es un lenguaje de marcado de propósito específico basado en XML , utilizado para describir la estructura y el comportamiento de un sistema ...

El lenguaje de marcado difuso ( FML ) es un lenguaje de marcado de propósito específico basado en XML , utilizado para describir la estructura y el comportamiento de un sistema difuso independientemente de la arquitectura de hardware dedicada a alojarlo y ejecutarlo.

Descripción general

FML fue diseñado y desarrollado por Giovanni Acampora durante su doctorado en Ciencias de la Computación en la Universidad de Salerno , Italia, en 2004. La idea original que inspiró a Giovanni Acampora a crear FML fue la necesidad de crear un marco cooperativo basado en lógica difusa para controlar automáticamente un entorno habitable caracterizado por una plétora de dispositivos heterogéneos cuyas interacciones estaban destinadas a maximizar el confort humano bajo restricciones de ahorro de energía. Este marco representó uno de los primeros ejemplos concretos de Inteligencia Ambiental . Más allá de esta aplicación pionera, la principal ventaja de usar XML para describir un sistema difuso es la interoperabilidad hardware/software. De hecho, todo lo que se necesita para leer un archivo FML es el esquema apropiado para ese archivo y un analizador FML. Este enfoque de marcado facilita enormemente el intercambio de sistemas difusos entre software: por ejemplo, una aplicación de aprendizaje automático podría extraer reglas difusas que luego podrían leerse directamente en un motor de inferencia difusa o cargarse en un controlador difuso. Además, con tecnologías como XSLT , es posible compilar el FML en el lenguaje de programación que prefiera, listo para integrarlo en cualquier aplicación que desee. Como afirma Mike Watts en su popular blog de Inteligencia Computacional: [ 1 ]

Aunque la motivación de Acampora para desarrollar FML parece ser crear controladores difusos integrados para aplicaciones de inteligencia ambiental, FML podría ser de gran utilidad para los desarrolladores de algoritmos de extracción de reglas difusas: por mi propia experiencia durante mi doctorado, sé que diseñar un formato de archivo e implementar los analizadores adecuados para la extracción de reglas y los motores de inferencia difusa puede ser un verdadero engorro, consumiendo tanto tiempo como la implementación del propio algoritmo de extracción de reglas. Hubiera preferido usar algo como FML para mi trabajo.

Una descripción general completa de FML y aplicaciones relacionadas se puede encontrar en el libro titulado On the power of Fuzzy Markup Language [ 2 ] editado por Giovanni Acampora, Chang-Shing Lee, Vincenzo Loia y Mei-Hui Wang, y publicado por Springer en la serie Studies on Fuzziness and Soft Computing .

Síntesis de sintaxis, gramática y hardware

FML permite codificar sistemas difusos mediante una colección de etiquetas semánticas correlacionadas capaces de modelar los diferentes componentes de un controlador difuso clásico, como la base de conocimiento, la base de reglas, las variables difusas y las reglas difusas. Por lo tanto, las etiquetas FML utilizadas para construir un controlador difuso representan el conjunto de lexemas utilizados para crear expresiones difusas. Para diseñar un lenguaje basado en XML bien formado, se define una gramática libre de contexto FML mediante un esquema XML que define el nombre, el tipo y los atributos que caracterizan cada elemento XML. Sin embargo, dado que un programa FML representa solo una vista estática de un controlador de lógica difusa, se proporciona XSLT para convertir esta vista estática en una versión computable. De hecho, los módulos XSLT pueden convertir el controlador difuso basado en FML en un lenguaje de programación de propósito general utilizando un archivo XSL que contiene la descripción de la traducción. En este nivel, el control es ejecutable para el hardware. En resumen, FML se compone esencialmente de tres capas:

  • XML con el fin de crear un nuevo lenguaje de marcado para el control de lógica difusa;
  • un esquema XML para definir los componentes legales básicos;
  • Transformaciones de lenguaje de hojas de estilo extensibles (XSLT) para convertir la descripción de un controlador difuso en un lenguaje de programación específico.

Sintaxis

La sintaxis FML se compone de etiquetas y atributos XML que describen los diferentes componentes de un controlador de lógica difusa que se enumeran a continuación:

  • base de conocimiento difusa;
  • base de reglas difusas;
  • motor de inferencia
  • subsistema de difuminación;
  • subsistema de defuzzificación.

En detalle, la etiqueta de apertura de cada programa FML es <fuzzySystem>la que representa el controlador difuso bajo modelado. Esta etiqueta tiene dos atributos: nombre e IP . El primer atributo permite especificar el nombre del controlador difuso e IP se utiliza para definir la ubicación del controlador en una red informática. La base de conocimiento difuso se define mediante la etiqueta <KnowledgeBase>que mantiene el conjunto de conceptos difusos utilizados para modelar la base de reglas difusas. Para definir el sistema controlado relacionado con el concepto difuso, <KnowledgeBase>la etiqueta utiliza un conjunto de etiquetas anidadas:

  • <FuzzyVariable>define el concepto difuso;
  • <FuzzyTerm>define un término lingüístico que describe el concepto difuso;
  • Un conjunto de etiquetas que definen la forma de los conjuntos difusos están relacionadas con los términos difusos.

Los atributos de la <FuzzyVariable>etiqueta son: nombre , escala , dominioIzquierdo , dominioDerecho , tipo y, solo para una salida, acumulación , defuzzificador y valorPredeterminado . El atributo nombre define el nombre del concepto difuso, por ejemplo, temperatura ; escala se utiliza para definir la escala utilizada para medir el concepto difuso, por ejemplo, grados Celsius ; dominioIzquierdo y dominioDerecho se utilizan para modelar el universo de discurso del concepto difuso, es decir, el conjunto de valores reales relacionados con el concepto difuso, por ejemplo [0°,40°] en el caso de grados Celsius; la posición del concepto difuso en la regla (parte consecuente o parte antecedente) se define mediante el atributo tipo (entrada/salida); el atributo acumulación define el método de acumulación que es un método que permite la combinación de los resultados de una variable de cada regla en un resultado final; el atributo defuzzificador define el método utilizado para ejecutar la conversión de un conjunto difuso, obtenido después del proceso de agregación, en un valor numérico para darlo en la salida al sistema; El atributo defaultValue define un valor real que se utiliza únicamente cuando no se ha activado ninguna regla para la variable en cuestión.

En cuanto a la etiqueta <FuzzyTerm>, utiliza dos atributos: nombre, usado para identificar el valor lingüístico asociado con el concepto difuso, y complemento , un atributo booleano que define si, de ser verdadero, es necesario considerar el complemento de la función de pertenencia definida por los parámetros dados. Las etiquetas de forma difusa, utilizadas para completar la definición del concepto difuso, son:

  • <TRIANGULARSHAPE>
  • <RIGHTLINEARSHAPE>
  • <LEFTLINEARSHAPE>
  • <PISHAPE>
  • <GAUSSIANSHAPE>
  • <RIGHTGAUSSIANSHAPE>
  • <LEFTGAUSSIANSHAPE>
  • <TRAPEZOIDSHAPE>
  • <SSHAPE>
  • <ZSHAPE>
  • <RECTANGULARSHAPE>
  • <SINGLETONSHAPE>

Cada etiqueta de forma utiliza un conjunto de atributos que definen el contorno real del conjunto difuso correspondiente. El número de estos atributos depende de la forma del conjunto difuso elegida.

Para ilustrarlo, consideremos el Sistema de Inferencia de Propinas descrito en el Tutorial de la Caja de Herramientas de Lógica Difusa de Mathworks Matlab. Este sistema Mamdani se utiliza para regular las propinas en, por ejemplo, un restaurante. Tiene dos variables de entrada ( comida y servicio ) y una de salida ( propina ). A continuación se muestra el código FML para modelar parte de la base de conocimiento de este sistema difuso, que contiene las variables comida y propina .

<?xml version="1.0" encoding="UTF-8"?> <fuzzySystem name= "newSystem" ip= "127.0.0.1" > <KnowledgeBase> <FuzzyVariable name= "food" domainleft= "0.0" domainright= "10.0" scale= "" type= "input" > <FuzzyTerm name= "delicious" complement= "false" > <LeftLinearShape Param1= "5.5" Param2= "10.0" /> </FuzzyTerm> <FuzzyTerm name= "rancid" complement= "false" > <TriangularShape Param1= "0.0" Param2= "2.0" Param3= "5.5" /> </FuzzyTerm> </FuzzyVariable> ........... <FuzzyVariable name= "tip" domainleft= "0.0" domainright= <FuzzyTerm name= "Euro" defaultValue= "0.0" defuzzifier= "COG" accumulate= "MAX" type= "output" > <FuzzyTerm name= "average" complement= "false" > <TriangularShape Param1= "5.0" Param2= "10.0" Param3= "15.0" /> </FuzzyTerm> <FuzzyTerm name= "cheap" complement= "false" > <TriangularShape Param1= "0.0" Param2= "5.0" Param3= "10.0" /> </FuzzyTerm> <FuzzyTerm name= "generous" complement= "false" > <TriangularShape Param1= "10.0" Param2= "15.0" Param3= "20.0" /> </FuzzyTerm> </FuzzyVariable> </KnowledgeBase> ............ </fuzzySystem>

Una etiqueta especial que también se puede usar para definir una forma difusa es <UserShape>. Esta etiqueta se usa para personalizar la forma difusa (forma personalizada). El modelado de la forma personalizada se realiza mediante un conjunto de <Point>etiquetas que enumeran los puntos extremos del área geométrica que define la forma difusa personalizada. Obviamente, los atributos utilizados en la <Point>etiqueta son las coordenadas x e y.

En cuanto al componente de base de reglas, FML permite definir un conjunto de bases de reglas, cada una de ellas describe un comportamiento diferente del sistema. La raíz de cada base de reglas se modela mediante <RuleBase>una etiqueta que define un conjunto de reglas difusas. La <RuleBase>etiqueta utiliza cinco atributos: nombre , tipo , método de activación , método de conjunción y método de oclusión . Obviamente, el atributo nombre identifica de forma única la base de reglas. El atributo tipo permite especificar el tipo de controlador difuso (Mamdani o TSK) con respecto a la base de reglas en cuestión. El atributo método de activación define el método utilizado para el proceso de implicación; los atributos método de conjunción y método de oclusión definen, respectivamente, el algoritmo de conjunción y oclusión que se utilizará por defecto. Para definir la regla individual se utiliza la etiqueta. Los atributos utilizados por la etiqueta son: nombre , conector , operador y peso . El atributo nombre permite identificar la regla; conector se utiliza para definir el operador lógico utilizado para conectar las diferentes cláusulas en la parte antecedente (y/o); operador define el algoritmo que se utilizará para el conector elegido; El peso define la importancia de la regla durante el paso del motor de inferencia. La definición de la parte de la regla antecedente y consecuente se obtiene mediante el uso de etiquetas y . La etiqueta se utiliza para modelar las cláusulas difusas en la parte antecedente y consecuente. Esta etiqueta utiliza el modificador de atributo para describir una modificación al término utilizado en la cláusula. Los valores posibles para este atributo son: above , below , extreme , intensify , more or less , norm , not , plus , slightly , something , very , none . Para completar la definición de la cláusula difusa, se deben utilizar las etiquetas anidadas y . Una secuencia de etiquetas realiza una base de reglas difusas.<Rule><Rule><Antecedent><Consequent><Clause><Variable><Term><Rule>

Como ejemplo, consideremos una regla Mamdani compuesta por (la comida está rancia) O (el servicio es muy malo) como antecedente y la propina es barata como consecuente. La parte del antecedente está formada por dos cláusulas: (la comida está rancia) y (el servicio es malo) . La primera cláusula del antecedente usa "comida" como variable y "rancia" como término difuso, mientras que la segunda cláusula del antecedente usa "servicio" como variable, "malo" como término difuso y " muy " como modificador; la cláusula del consecuente usa "propina" como variable difusa y "barato" como término difuso. La regla completa es:

SI (la comida está rancia) O (el servicio es muy malo) ENTONCES (la propina es barata) .

Veamos cómo FML define una base de reglas con esta regla.

<RuleBase name= "Rulebase1" activationMethod= "MIN" andMethod= "MIN" orMethod= "MAX" type= "mamdani" > <Rule name= "reg1" connector= "or" operator= "MAX" weight= "1.0" > <Antecedente> <Cláusula> <Variable> comida </Variable> <Término> rancio </Término> </Cláusula> <Cláusula modificador= "muy" > <Variable> servicio </Variable> < Término> pobre < /Término> </Cláusula> </Antecedente> <Consecuencia> <Cláusula> <Variable> propina </Variable> < Término > barato < / Término> </Cláusula > </Consecuencia> </Rule> ............ </RuleBase>

Ahora, veamos un sistema Takagi-Sugeno-Kang que regula el mismo problema. La diferencia más importante con el sistema Mamdani es la definición de una variable de salida diferente tip . La <TSKVariable>etiqueta se usa para definir una variable de salida que se puede usar en una regla de un sistema Tsk. Esta etiqueta tiene los mismos atributos que una variable de salida Mamdani excepto por el atributo domainleft y domainright porque una variable de este tipo (llamada variable tsk) no tiene un universo de discurso. La <TSKTerm>etiqueta anidada representa una función lineal y por lo tanto es completamente diferente de <FuzzyTerm>. La <TSKValue>etiqueta se usa para definir los coeficientes de la función lineal. El siguiente crunch de código FML muestra la definición de la variable de salida tip en un sistema Tsk.

<?xml version="1.0" encoding="UTF-8"?> <fuzzySystem name= "newSystem" ip= "127.0.0.1" > <KnowledgeBase> ....... <TSKVariable name= "tip" scale= "null" accumulate= "MAX" defuzzifier= "WA" type= "output" > <TSKTerm name= "average" order= "0" > <TSKValue> 1.6 </TSKValue> </TSKTerm> <TSKTerm name= "cheap" order= "1" > <TSKValue> 1.9 </TSKValue> <TSKValue> 5.6 </TSKValue> <TSKValue> 6.0 </TSKValue> </TSKTerm> <TSKTerm name= "generous" order= "1" > <TSKValue> 0.6 </TSKValue> <TSKValue> 1.3 </TSKValue> <TSKValue> 1.0 </TSKValue> </TSKTerm> </TSKVariable> <KnowledgeBase> .......... </fuzzySystem>

La definición de componente de base de reglas de FML en un sistema Tsk no cambia mucho. La única diferencia es que la <Clause>etiqueta no tiene el atributo modificador.

Como ejemplo, consideremos una regla tsk compuesta por (la comida está rancia) O (el servicio es muy malo) como antecedente y, como consecuente, propina = 1,9 + 5,6 * comida + 6,0 * servicio , que puede escribirse implícitamente como "la propina es barata" . Por lo tanto, la regla puede escribirse de esta manera:

SI (la comida está rancia) O (el servicio es muy malo) ENTONCES (la propina es barata) .

Veamos cómo FML define una base de reglas con esta regla.

<RuleBase name= "Rulebase1" activationMethod= "MIN" andMethod= "MIN" orMethod= "MAX" type= "tsk" > <Rule name= "reg1" connector= "or" operator= "MAX" weight= "1.0" > <Antecedente> <Cláusula> <Variable> comida </Variable> <Término> rancio </Término> </Cláusula> < Cláusula> <Variable> servicio </Variable> <Término> pobre < / Término > < / Cláusula > </Antecedente> <Consecuente> <Cláusula> <Variable> propina </Variable> < Término > barato < / Término > </ Cláusula> </Consecuente> </Rule> ............ </RuleBase>

Gramática

Las etiquetas FML utilizadas para construir un controlador difuso representan el conjunto de lexemas empleados para crear expresiones difusas. Sin embargo, para lograr un lenguaje XML bien formado, se requiere una gramática libre de contexto FML, la cual se describe a continuación. Esta gramática se modela mediante un archivo XML en forma de documento de esquema XML (XSD), que expresa el conjunto de reglas que debe cumplir un documento para ser considerado un documento FML válido . A partir de esta definición, se presenta a continuación una parte del XSD FML relativa a la definición de la base de conocimiento.

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs= "http://www.w3.org/2001/XMLSchema" > ........ <xs:complexType name= "KnowledgeBaseType" > <xs:sequence> <xs:choice minOccurs= "0" maxOccurs= "unbounded" > <xs:element name= "FuzzyVariable" type= "FuzzyVariableType" /> <xs:element name= "TSKVariable" type= "TSKVariableType" /> </xs:choice> </xs:sequence> </xs:complexType> <xs:complexType name= "FuzzyVariableType" > <xs:sequence> <xs:element name= "FuzzyTerm" type= "FuzzyTermType" maxOccurs= "sin límites" /> </xs:sequence> <xs:attribute name= "name" type= "xs:string" use= "required" /> <xs:attribute name= "defuzzifier" default= "COG" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:pattern value= "MM|COG|COA|WA|Custom" /> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name= "accumulation" default= "MAX" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:pattern value= "MAX|SUM" /> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name= "scale" type= "xs:string" /> <xs:attribute name= "domainleft" type= "xs:float" use= "required" /> <xs:attribute name= "domainright" type= "xs:float" use= "required" /> <xs:atributo nombre= "defaultValue" tipo= "xs:float" valor predeterminado= "0" /> <xs:atributo nombre= "tipo" valor predeterminado= "entrada" > <xs:simpleType> <xs:restricción base= "xs:string" > <xs:patrón valor= "entrada|salida" /></xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> <xs:complexType name= "FuzzyTermType" > <xs:choice> <xs:element name= "RightLinearShape" type= "TwoParamType" /> <xs:element name= "LeftLinearShape" type= "TwoParamType" /> <xs:element name= "PIShape" type= "TwoParamType" /> <xs:element name= "TriangularShape" type= "ThreeParamType" /> <xs:element name= "GaussianShape" type= "TwoParamType" /> <xs:element name= "RightGaussianShape" type= "TwoParamType" /> <xs:element name= "LeftGaussianShape" type= "TwoParamType" /> <xs:element name= <xs:element name= "TrapezoidShape" type = "FourParamType" /> <xs:element name= "SingletonShape" type= "OneParamType" /> <xs:element name= " RectangularShape" type= "TwoParamType" /> <xs:element name= "ZShape" type= "TwoParamType" /> <xs:element name= "SShape" type= "TwoParamType" /> <xs:element name= "UserShape" type= "UserShapeType" /> </xs:choice> <xs:complexType name= "TwoParamType" > <xs:attribute name= "Param1" type= "xs:float" use= "required" /> <xs:attribute name= "Param2" type= "xs:float" use= "required" /> </xs:complexType> <xs:complexType name= "ThreeParamType" > <xs:attribute name= "Param1" type= "xs:< xs:attribute name= " Param2 " type= "xs:float" use= "required" /> <xs:attribute name= "Param3" type= "xs:float" use= "required" /> </xs:complexType><xs:complexType name= "FourParamType" > <xs:attribute name= "Param1" type= "xs:float" use= "required" /> <xs:attribute name= "Param2" type= "xs:float" use= "required" /> <xs:attribute name= "Param3" type= "xs:float" use= "required" /> <xs:attribute name= "Param4" type= "xs:float" use= "required" /> </xs:complexType> <xs:complexType name= "UserShapeType" > <xs:sequence> <xs:element name= "Point" type= "PointType" minOccurs= "2" maxOccurs= "unbounded" /> </xs:sequence> </xs:complexType> <xs:complexType name= "PointType" > <xs:attribute name= "x" type= "xs:float" use= "required" /> <xs:attribute name= "y" type= "xs:float" use= "required" /> </xs:complexType> <xs:complexType name= "RuleBaseType" > <xs:attribute name= "name" type= "xs:string" use= "required" /> <xs:attribute name= "activationMethod" default= "MIN" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:pattern value= "PROD|MIN" /> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name= "andMethod" default= "MIN" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:pattern value= "PROD|MIN" /> </xs:restricción> </xs:simpleType> </xs:attribute> <xs:attribute name= "orMethod" default= "MAX" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:pattern value= "PROBOR|MAX" /> </xs:restriction> </xs:simpleType></xs:attribute> <xs:attribute name= "type" use= "required" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:pattern value= "TSK|Tsk|tsk|Mamdani|mamdani" /> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> <xs:complexType name= "MamdaniRuleBaseType" > <xs:complexContent> <xs:extension base= "RuleBaseType" > <xs:sequence> <xs:element name= "Rule" type= "MamdaniFuzzyRuleType" minOccurs= "0" maxOccurs= "unbounded" /> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name= "AntecedentType" > <xs:sequence> <xs:element name= "Clause" type= "ClauseType" maxOccurs= "unbounded" /> </xs:sequence> </xs:complexType> <xs:complexType name= "MamdaniConsequentType" > <xs:sequence> <xs:element name= "Clause" type= "ClauseType" maxOccurs= "unbounded" /> </xs:sequence> </xs:complexType> <xs:complexType name= "ClauseType" > <xs:sequence> <xs:element name= "Variable" > <xs:simpleType> <xs:restriction base= "xs:string" > <xs:whiteSpace value= "collapse" /> <xs:pattern value= "(([AZ])|([az]))+([AZ]|[az]|[0-9])*" /> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name= "Term" type= "xs:string" > </xs:element> </xs:sequence> <xs:atributo nombre= "modificador" uso= "opcional" > <xs:simpleType> <xs:restricción base= "xs:string" > <xs:patrón valor= "arriba|abajo|extremadamente|intensificar|más_o_menos|norma|no|más|ligeramente|algo|muy" /> </xs:restricción> </xs:simpleType> </xs:atributo> </xs:complexType>.......... </xs:schema>

Síntesis

Dado que un programa FML solo ofrece una representación estática de un sistema difuso, se proporciona XSLT para transformar esta representación estática en una versión computable. En concreto, la tecnología XSLT se utiliza para convertir la descripción de un controlador difuso en un lenguaje de programación de propósito general que se puede ejecutar en diversas plataformas de hardware. Actualmente, se ha implementado una conversión XSLT de un programa FML a código Java ejecutable. De esta forma, gracias a las capacidades de transparencia que ofrecen las máquinas virtuales Java, es posible obtener un controlador difuso modelado a alto nivel mediante FML y ejecutable en una amplia gama de arquitecturas de hardware a través de tecnologías Java. Sin embargo, XSLT también puede utilizarse para convertir programas FML en lenguajes heredados relacionados con un hardware específico o en otros lenguajes de propósito general.

Referencias

  1. Watts, Mike (28-05-2011). "Inteligencia Computacional: Lenguaje de Marcado Difuso" . Computational-intelligence.blogspot.it . Recuperado el 11-06-2012 .
  2. Acampora, Giovanni; Loia, Vincenzo; Lee, Chang-Shing; Wang, Mei-Hui, eds. (2013). Sobre el poder del lenguaje de marcado difuso . Estudios en lógica difusa y computación blanda. Vol. 296. Springer. doi : 10.1007/978-3-642-35488-5 . ISBN  978-3-642-35487-8.{{cite book}}: |work=ignorado ( ayuda )

Lecturas adicionales

  • Lee, Chang-Shing; et  al. (diciembre de 2010). "Evaluación de la dieta basada en ontología difusa de tipo 2 y lenguaje de marcado difuso". International Journal of Intelligent Systems . 25 (12): 1187– 1216. doi : 10.1002/int.20449 . S2CID 13570946 . (Se requiere suscripción)
  • Acampora, G.; Loia, V. (2005). "Interoperabilidad y escalabilidad del control difuso para un marco domótico adaptativo". IEEE Transactions on Industrial Informatics . 1 (2): 97– 111. doi : 10.1109/TII.2005.844431 . S2CID 8008285 . 
  • Acampora, G.; Loia, V. (2008). "Una propuesta de computación difusa ubicua para la inteligencia ambiental". Information Sciences . 178 (3): 631– 646. doi : 10.1016/j.ins.2007.08.023 .
  • Acampora, G.; Wang, M.-H.; Lee, C.-S.; Hsieh, K.-L.; Hsu, C.-Y.; Chang, C.-C. (2010). "Multiagentes basados ​​en ontologías para aplicaciones inteligentes de atención médica". Journal of Ambient Intelligence and Humanized Computing . 1 (2): 111– 131. doi : 10.1007/s12652-010-0011-5 . S2CID 35304577 . 
  • Acampora, G.; Loia, V.; Gaeta, M.; Vasilakos, AV (2010). "Servicios difusos interoperables y adaptativos para aplicaciones de inteligencia ambiental". ACM Transactions on Autonomous and Adaptive Systems . 5 (2): 1– 26. doi : 10.1145/1740600.1740604 . S2CID 14234229 .