public code v1
This commit is contained in:
@@ -0,0 +1,409 @@
|
||||
# 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
|
||||
|
||||
| Herramienta | Versión mínima | Notas |
|
||||
|---|---|---|
|
||||
| Docker | 20+ | Para compilar sin instalar nada más |
|
||||
| Java | 11 | Solo para ejecutar el producto compilado |
|
||||
| Maven | 3.8+ | Solo si compilas fuera de Docker |
|
||||
|
||||
> **Sin Docker:** necesitas JDK 11 y Maven 3.8+.
|
||||
> **Con Docker:** solo Docker. El contenedor lleva Maven 3.8.6 y JDK 11.
|
||||
|
||||
---
|
||||
|
||||
## Compilar
|
||||
|
||||
### Con Docker (recomendado)
|
||||
|
||||
```bash
|
||||
./build.sh
|
||||
```
|
||||
|
||||
O directamente:
|
||||
|
||||
```bash
|
||||
docker compose run --rm build
|
||||
```
|
||||
|
||||
La primera vez descarga dependencias de Eclipse (~1-2 GB). Las siguientes compilaciones usan caché y son mucho más rápidas.
|
||||
|
||||
Los productos 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
|
||||
|
||||
```bash
|
||||
mvn clean install -Dmaven.test.skip=true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Ejecutar
|
||||
|
||||
### macOS
|
||||
|
||||
```bash
|
||||
cd releng/flintstones.application.product/target/products/
|
||||
unzip "RCP product-macosx.cocoa.x86_64.zip"
|
||||
open Eclipse.app
|
||||
```
|
||||
|
||||
> El ejecutable se llama `Eclipse.app` por herencia del launcher de Eclipse RCP.
|
||||
> En Apple Silicon (M1/M2/M3) funciona vía Rosetta 2 (arquitectura x86_64).
|
||||
|
||||
### Linux
|
||||
|
||||
```bash
|
||||
cd releng/flintstones.application.product/target/products/
|
||||
unzip "RCP product-linux.gtk.x86_64.zip"
|
||||
./"RCP product"/linux/gtk/x86_64/flinstones
|
||||
```
|
||||
|
||||
Requiere GTK3:
|
||||
```bash
|
||||
sudo apt install libgtk-3-0 # Debian/Ubuntu
|
||||
```
|
||||
|
||||
### Linux con VNC (desde Docker)
|
||||
|
||||
Levanta el contenedor con display virtual accesible en `localhost:5900`:
|
||||
|
||||
```bash
|
||||
docker compose run --rm run-vnc
|
||||
```
|
||||
|
||||
Conéctate con cualquier cliente VNC (RealVNC, TigerVNC, etc.) a `localhost:5900`.
|
||||
|
||||
### Windows
|
||||
|
||||
Descomprime `RCP product-win32.win32.x86_64.zip` y ejecuta `flinstones.exe`.
|
||||
|
||||
---
|
||||
|
||||
## 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 |
|
||||
Reference in New Issue
Block a user