# Flintstones Plataforma de escritorio para **Toma de Decisiones Multi-Criterio (MCDM/MCDA)** desarrollada por el grupo de investigación [Sinbad2](http://sinbad2.ujaen.es/) de la Universidad de Jaén. Flintstones permite definir un problema de decisión (alternativas, criterios, expertos, dominios) y resolverlo con una amplia colección de métodos de ayuda a la decisión, desde AHP clásico hasta modelos lingüísticos avanzados basados en conjuntos difusos y 2-tuplas. --- ## Tabla de contenidos - [Requisitos](#requisitos) - [Compilar](#compilar) - [Ejecutar](#ejecutar) - [Métodos disponibles](#métodos-disponibles) - [Tipos de información](#tipos-de-información) - [Operadores](#operadores) - [Arquitectura del proyecto](#arquitectura-del-proyecto) - [Estructura de directorios](#estructura-de-directorios) - [Flujo de trabajo en la aplicación](#flujo-de-trabajo-en-la-aplicación) - [Problemas conocidos resueltos](#problemas-conocidos-resueltos) --- ## Requisitos El único requisito es tener **Docker Desktop** instalado. Todo lo demás (Java 11, Maven, GTK…) corre dentro del contenedor. | Herramienta | Versión mínima | Dónde conseguirla | |---|---|---| | Docker Desktop | 20+ | [docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop/) | > En Windows, Docker Desktop debe estar en modo **Linux containers** (es el modo por defecto). --- ## Compilar y ejecutar ### macOS / Linux ```bash ./run.sh ``` ### Windows ```bat run.bat ``` Eso es todo. El script gestiona automáticamente cada situación: | Situación | Qué hace el script | |---|---| | Primera vez | Compila el proyecto + construye la imagen Docker + arranca + abre el navegador | | Ya compilado, imagen ya construida | Solo arranca el contenedor + abre el navegador | | Ya está corriendo | Abre el navegador directamente | La primera compilación descarga dependencias de Eclipse (~1-2 GB) y tarda unos minutos. Las siguientes arrancan en segundos. La aplicación aparece en el navegador en **`http://localhost:6080`** — no hace falta instalar ningún cliente VNC ni ningún visor especial. Para parar la aplicación: ```bash docker compose stop run # macOS / Linux ``` ```bat docker compose stop run :: Windows ``` ### Solo compilar (sin ejecutar) ```bash ./build.sh # macOS / Linux ``` ```bat build.bat :: Windows ``` Los productos compilados quedan en: ``` releng/flintstones.application.product/target/products/ RCP product-linux.gtk.x86_64.zip RCP product-macosx.cocoa.x86_64.zip RCP product-win32.win32.x86_64.zip ``` ### Sin Docker (avanzado) Requiere JDK 11 y Maven 3.8+ instalados localmente: ```bash mvn clean install -Dmaven.test.skip=true ``` --- ## Métodos disponibles ### Métodos clásicos / Ranking | Método | Bundle | Descripción | |---|---|---| | **AHP** | `flintstones.method.ahp` | Analytic Hierarchy Process. Descomposición jerárquica de un problema con comparaciones por pares. | | **AHP-Sort** | `flintstones.method.ahp.sort` | Variante de clasificación (sorting) sobre AHP. | | **AHP-SortII** | `flintstones.method.ahp.sortii` | Segunda versión de AHP-Sort con agregación grupal mejorada. | | **AHP-Sort Fuzzy** | `flintstones.method.ahp.sort.fuzzy` | AHP-Sort con información difusa. | | **Numeric TOPSIS** | `flintstones.method.decision.topsis.numeric` | TOPSIS clásico (Hwang & Yoon, 1981). Alternativa más próxima a la solución ideal positiva y más alejada de la negativa. | | **VIKOR** | `flintstones.method.vikor` | Método de compromiso para criterios conflictivos (Opricovic). | | **Fuzzy VIKOR** | `flintstones.method.vikorFuzzy` | VIKOR con pesos y criterios como números difusos triangulares. | | **ELECTRE** | `flintstones.method.electre` | Método de superación (outranking) con relaciones de concordancia y discordancia. | | **PROMETHEE** | `flintstones.method.promethee` | Outranking basado en flujos netos de preferencia. | | **FlowSort** | `flintstones.method.flowsort` | Extensión de PROMETHEE para problemas de clasificación. | | **TODIM** | `flintstones.method.todim` | Basado en la Teoría Prospectiva, modela el comportamiento del decisor ante ganancias y pérdidas. | | **MMOORA** | `flintstones.method.mmoora` | Multi-MOORA: combina ratio system, reference point y full multiplicative form. | | **Fuzzy MMOORA** | `flintstones.method.mmooraFuzzy` | MMOORA con información difusa. | | **WASPAS** | `flintstones.method.waspas` | Weighted Aggregated Sum Product ASsessment: combinación de WSM y WPM. | | **Fuzzy WASPAS** | `flintstones.method.waspasFuzzy` | WASPAS con números difusos. | | **dEvaluation** | `flintstones.method.dEvaluation` | *(en desarrollo)* | ### Métodos lingüísticos y difusos | Método | Bundle | Descripción | |---|---|---| | **2-Tuple** | `flintstones.method.twoTuple` | Modelo 2-tupla lingüística (Herrera & Martínez, 2000). Elimina pérdida de información en la fusión lingüística. | | **Hesitant Linguistic** | `flintstones.method.linguistic.hesitant` | MCDM con expresiones lingüísticas comparativas y 2-tuplas para retranslación. | | **HFLTS** | `flintstones.method.linguistic.hflts` | Hesitant Fuzzy Linguistic Term Sets. Para expertos que dudan entre varios términos lingüísticos. | | **ELICIT** | `flintstones.method.linguistic.elicit` | Extended Comparative Linguistic Expressions with Symbolic Translation. Modelo de representación lingüística más rico que la 2-tupla. | | **Linguistic TOPSIS** | `flintstones.method.linguistic.topsis` | TOPSIS con modelo 2-tupla y función de distancia mejorada. | | **Heterogeneous Fusion** | `flintstones.method.linguistic.heterogeneous.fusion` | Fusión de información heterogénea (numérica, lingüística, intervalar) con 2-tuplas. | | **Unbalanced Linguistic** | `flintstones.method.linguistic.unbalanced` | Conjuntos de términos lingüísticos no uniformes ni simétricos. | | **Multigranular LH** | `flintstones.method.linguistic.multigranular.lh` | Jerarquías lingüísticas para información multigranular. | | **Multigranular ELH** | `flintstones.method.linguistic.multigranular.elh` | Jerarquía lingüística extendida (ELH) para mayor flexibilidad de escalas. | | **Multigranular Fusion** | `flintstones.method.linguistic.multigranular.fusion` | Fusión multigranular sin restricciones en las escalas, con principio de extensión. | | **Fuzzy TOPSIS** | `flintstones.method.topsisFuzzy` | TOPSIS con valoraciones difusas. | | **Numeric Common Aggregation** | `flintstones.method.numeric.common.aggregation` | Agregación con información numérica. | --- ## Tipos de información ### Dominios de valoración | Tipo | Bundle | Descripción | |---|---|---| | **Fuzzy Set** | `flintstones.domain.fuzzyset` | Conjuntos difusos (números difusos triangulares). | | **Unbalanced Fuzzy Set** | `flintstones.domain.fuzzyset.unbalanced` | Conjuntos difusos con distribución no uniforme. | | **Integer Numeric** | `flintstones.domain.numeric.integer` | Dominio numérico entero. | | **Real Numeric** | `flintstones.domain.numeric.real` | Dominio numérico real. | ### Tipos de valoración (Valuations) | Tipo | Bundle | |---|---| | Lingüística (2-tupla) | `flintstones.valuation.linguistic` | | ELICIT | `flintstones.valuation.elicit` | | Hesitant (HFLTS) | `flintstones.valuation.hesitant` | | Unbalanced | `flintstones.valuation.unbalanced` | | 2-Tupla | `flintstones.valuation.twoTuple` | | Proporcional 2-Tupla | `flintstones.valuation.proportionaltwotuple` | | AHP | `flintstones.valuation.ahp` | | Numérica entera | `flintstones.valuation.numeric.integer` | | Numérica entera (intervalo) | `flintstones.valuation.numeric.integer.interval` | | Numérica real | `flintstones.valuation.numeric.real` | | Numérica real (intervalo) | `flintstones.valuation.numeric.real.interval` | | Unificada | `flintstones.valuation.unifiedValuation` | | Difusa | `flintstones.valuation.fuzzy` | --- ## Operadores ### Agregación | Operador | Bundle | |---|---| | Media aritmética | `flintstones.operator.aggregation.arithmeticmean` | | Media geométrica | `flintstones.operator.aggregation.geometricMean` | | Media armónica | `flintstones.operator.aggregation.harmonicmean` | | OWA (Ordered Weighted Averaging) | `flintstones.operator.aggregation.owa` | | Mínimo | `flintstones.operator.aggregation.min` | | Máximo | `flintstones.operator.aggregation.max` | | MinMax | `flintstones.operator.aggregation.minmax` | | Mediana | `flintstones.operator.aggregation.median` | | Integral de Choquet | `flintstones.operator.aggregation.choquetIntegral` | | Media de Bonferroni | `flintstones.operator.aggregation.bonferroniMean` | Los pesos para OWA se calculan con cuantificadores de Yager (`flintstones.quantifiers.yager`). ### Normalización (métodos numéricos) | Operador | Bundle | |---|---| | Ideal | `flintstones.operator.normalization.numeric.ideal` | | Distribuida | `flintstones.operator.normalization.numeric.distributed` | ### Unificación (métodos lingüísticos) | Operador | Bundle | |---|---| | 2-Tupla | `flintstones.operator.unification.twotuple` | | ELICIT | `flintstones.operator.unification.elicit` | | Difusa | `flintstones.operator.unification.fuzzy` | --- ## Arquitectura del proyecto Flintstones es una aplicación **Eclipse 4 RCP** (Rich Client Platform) basada en OSGi. Cada funcionalidad se encapsula como un bundle independiente con dependencias declaradas en `META-INF/MANIFEST.MF`. ``` ┌─────────────────────────────────────────────────────┐ │ Eclipse E4 RCP Shell │ │ (workbench, perspectives, parts, DI) │ ├──────────────┬──────────────┬───────────────────────┤ │ application │ framework │ perspective.* │ │ (UI global) │ (UI MCDM) │ (panels por etapa) │ ├──────────────┴──────────────┴───────────────────────┤ │ method.* (implementación métodos) │ ├─────────────────────────────────────────────────────┤ │ entity.* │ valuation.* │ domain.* │ operator.* │ │ (modelo) │ (valoraciones)│ (dominios)│ (operadores│ ├───────────┴───────────────┴────────────┴────────────┤ │ model.*.service / model.*.provider │ │ (capa de servicios OSGi, acceso a datos) │ ├─────────────────────────────────────────────────────┤ │ helper.* (utilidades: I/O, datos, validación) │ └─────────────────────────────────────────────────────┘ ``` ### Patrón service / provider Cada modelo de datos tiene dos bundles: - `flintstones.model.X.service` — interfaz OSGi (contrato) - `flintstones.model.X.provider` — implementación concreta Los bundles se conectan vía inyección de dependencias de Eclipse E4 (`@Inject`). ### Motor R El bundle `flintstones.engine.R` integra el motor estadístico R para cálculos avanzados. --- ## Estructura de directorios ``` flintstones-develop/ ├── bundles/ # Todos los plugins OSGi (~250 bundles) │ ├── flintstones.application/ # Bundle principal (E4 app model) │ ├── flintstones.application.*/ # UI de la aplicación │ ├── flintstones.domain.*/ # Tipos de dominio de valoración │ ├── flintstones.entity.*/ # Entidades del modelo de dominio │ ├── flintstones.method.*/ # Implementaciones de métodos MCDM │ ├── flintstones.model.*.service/ # Interfaces de servicio OSGi │ ├── flintstones.model.*.provider/ # Implementaciones de servicio │ ├── flintstones.operator.*/ # Operadores de agregación/unificación │ ├── flintstones.valuation.*/ # Tipos de valoración │ ├── flintstones.helper.*/ # Utilidades (I/O, datos, UI, validación) │ ├── flintstones.quantifiers.*/ # Cuantificadores lingüísticos │ ├── flintstones.engine.R/ # Integración con el motor R │ ├── flintstones.clustering.*/ # Clustering aglomerativo │ ├── flintstones.theme/ # Tema visual │ ├── org.apache.commons.math3/ # Dependencia: Apache Commons Math │ ├── org.jfree.chart.jfreechart/ # Dependencia: JFreeChart │ ├── de.jaret.util.swt/ # Dependencia: Jaret SWT utils │ ├── de.kupzog.ktable/ # Dependencia: KTable │ └── org.eclipse.nebula.*/ # Dependencia: Eclipse Nebula widgets │ ├── features/ # Features Eclipse (agrupaciones de bundles) │ ├── flintstones.feature.application/ │ ├── flintstones.feature.domain/ │ ├── flintstones.feature.element/ │ ├── flintstones.feature.engine/ │ ├── flintstones.feature.entity/ │ ├── flintstones.feature.helper/ │ ├── flintstones.feature.libraries/ │ ├── flintstones.feature.method/ │ ├── flintstones.feature.model/ │ ├── flintstones.feature.operator/ │ ├── flintstones.feature.quantifiers/ │ ├── flintstones.feature.theme/ │ └── flintstones.feature.valuation/ │ ├── releng/ # Release engineering │ ├── flintstones.application.configuration/ # POM raíz con config de Tycho │ ├── flintstones.application.product/ # Definición del producto (.product) │ └── flintstones.application.update/ # Update site │ ├── Dockerfile # Imagen Docker para compilar y ejecutar ├── docker-compose.yml # Servicios: build, run (Xvfb), run-vnc ├── build.sh # Script de compilación └── pom.xml # POM raíz Maven ``` --- ## Flujo de trabajo en la aplicación La aplicación guía al usuario a través de **perspectivas** secuenciales: ``` 1. Framework └─ Definir: alternativas, criterios (con pesos y dominios), expertos 2. Framework Structuring └─ Organizar la estructura jerárquica del problema 3. Gathering └─ Recoger las valoraciones de cada experto sobre cada alternativa/criterio 4. Method Selection └─ Elegir el método MCDM a aplicar y configurarlo 5. Execution / Results └─ Ejecutar el método y visualizar el ranking de alternativas 6. Sensitive Analysis └─ Analizar la robustez de los resultados ante variaciones en los pesos ``` Los ficheros de problema se guardan/cargan desde **File → Save / Open**. El formato de archivo es propio de Flintstones (XML interno). --- ## Problemas conocidos resueltos Los siguientes problemas estaban presentes en el repositorio y han sido corregidos: ### 1. Bundles inexistentes en `feature.xml` `flintstones.feature.method/feature.xml` referenciaba tres bundles que ya no existen en el código: ``` flintstones.method.linguistic.elicit.topsis flintstones.method.linguistic.elicit.topsis.phase.experts flintstones.method.linguistic.elicit.topsis.phase.experts.ui ``` **Fix:** eliminados del `feature.xml`. ### 2. Entradas duplicadas en `feature.xml` El mismo `feature.xml` contenía dos veces las entradas de `flintstones.method.linguistic.topsis.*`. **Fix:** eliminada la segunda ocurrencia. ### 3. URLs HTTP obsoletas en el POM El POM de configuración usaba URLs `http://` que ya no funcionan: | Antes | Después | |---|---| | `http://download.eclipse.org/releases/photon` | `https://download.eclipse.org/releases/2018-09` | | `http://central.maven.org/maven2/` | `https://repo1.maven.org/maven2/` | El repositorio de Eclipse Photon (2018) se actualizó a **2018-09** porque Photon no incluía el perfil JRE para JavaSE-11 en su repositorio p2 y los bundles del proyecto lo requieren. ### 4. Plataformas de 32 bits incompatibles con JavaSE-11 Los targets `linux/gtk/x86` y `win32/win32/x86` no pueden resolver `osgi.ee=JavaSE(version=11)` porque no hay JDK 11 de 32 bits disponible. **Fix:** eliminados. Solo se compila para x86_64 (Linux, Windows, macOS). ### 5. Tycho no encontraba el perfil JavaSE-11 **Fix:** añadidas al `target-platform-configuration`: ```xml JavaSE-11 false ``` ### Bundles huérfanos (pendientes de integrar) Existen en el código pero no están incluidos en ninguna feature (no se empaquetan en el producto): | Bundle | Estado | |---|---| | `flintstones.operator.aggregation.bonferroniMean` | En disco, no en `pom.xml` ni en features | | `flintstones.operator.unification.fuzzy` | En disco, no en `pom.xml` ni en features | | `flintstones.method.dEvaluation` (+ sub-bundles) | En `pom.xml`, no en features | | `flintstones.valuation.fuzzy` | En `pom.xml`, no en features | | `flintstones.valuation.proportionaltwotuple` | En `pom.xml`, no en features | | `flintstones.clustering.agglomerative` | En `pom.xml`, no en features | --- ## Tecnologías | Tecnología | Uso | |---|---| | **Java 11** | Lenguaje principal | | **OSGi / Equinox** | Framework de componentes | | **Eclipse E4 RCP** | Framework de aplicación de escritorio | | **Eclipse SWT + JFace** | Widgets y UI | | **Maven Tycho 2.0.0** | Sistema de build para proyectos Eclipse | | **EMF** | Eclipse Modeling Framework (modelos de datos) | | **Apache Commons Math 3** | Cálculos matemáticos y estadísticos | | **JFreeChart** | Gráficas y visualización | | **R Engine** | Cálculos estadísticos avanzados | | **Eclipse Nebula** | Widgets SWT adicionales | | **Docker** | Entorno de build reproducible |