Files
Flintstones/README.md
T
Francisco Jesús Martínez Mimbrera 40dda44902 public code v2
2026-05-23 00:39:14 +02:00

396 lines
18 KiB
Markdown

# 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
<executionEnvironment>JavaSE-11</executionEnvironment>
<breeAsFilter>false</breeAsFilter>
```
### 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 |