METODOLOGÍA CIENTÍFICA

Entendiendo el método AHP-Sort II

Cómo INFUNI calcula tu destino ideal con rigor matemático.

1. ¿Qué es AHP?

El Proceso Analítico Jerárquico (Analytic Hierarchy Process, AHP) es una técnica estructurada para tomar decisiones complejas con múltiples criterios. En lugar de elegir "al azar", AHP permite comparar criterios entre sí (por ejemplo, Seguridad frente a Ocio) de forma relativa para entender qué es lo que realmente te importa.

AHP-Sort II es una variante que, además de ordenar alternativas, las clasifica en categorías ordinales (Élite, Muy Recomendado, Aceptable, etc.) comparándolas con perfiles de referencia. INFUNI implementa esta variante en ahp-engine.js y la integra en script.js.

2. Los 7 criterios y cómo se mapean a la BD

El sistema maneja 7 criterios. Su nombre en la interfaz no siempre coincide con el campo real almacenado en MongoDB:

Criterio (interfaz)Campo en metricas.* (BD)Notas
transportecalidadTransporte
ocioturismo
ocioNocturnoambienteNocturno
seguridadseguridad
calidadAcademicacalidadAcademica
conectividadconectividad
asequibilidadcosteAlquilerMedioInvertida: a mayor coste, menor score.

La asequibilidad se normaliza dinámicamente al rango 1–5 sobre el conjunto de ciudades cargadas:

asequibilidad(c) = 1 + 4 · (maxCoste − coste(c)) / (maxCoste − minCoste)

De este modo, la ciudad más barata obtiene un 5 y la más cara un 1, sin necesidad de fijar umbrales arbitrarios.

3. La matriz de Saaty (modo experto)

En el panel de experto, comparas cada criterio frente al resto. Si dices que la Seguridad es "Mucho más importante" que el Ocio, el sistema asigna un valor alto (p. ej. 7). La escala 1–9 de Saaty es la siguiente:

ValorDefinición
1Igual importancia
3Importancia moderada de uno sobre otro
5Importancia fuerte
7Importancia muy fuerte o demostrada
9Importancia extrema

La matriz A es recíproca: si afirmas que i es 7 veces más importante que j, automáticamente se asume que j es 1/7 frente a i.

4. Cálculo del vector de prioridades

Para obtener los pesos (w) a partir de la matriz, el motor utiliza la Media Geométrica Normalizada, una aproximación del autovector principal que es estable y fácil de calcular:

1) Para cada fila i: GM_i = (∏ a_ij)^(1/n)
2) Normalizar: w_i = GM_i / Σ GM_k
3) Reescalar 1–5: w_i^slider = w_i / max_k(w_k) · 5

El último paso reescala los pesos al rango 1–5 para que sean compatibles con los sliders de la interfaz, manteniendo las proporciones relativas entre criterios.

5. Razón de Consistencia (CR)

AHP verifica que tus comparaciones no se contradigan. Si afirmas que A > B y B > C, entonces A debe ser > C. El motor calcula:

CI = (λ_max − n) / (n − 1)
CR = CI / RI

donde RI es el Índice Aleatorio de Saaty para una matriz de tamaño n:

n3456789
RI0.580.901.121.241.321.411.45
Casos especiales:
  • Si n ≤ 2, la consistencia es perfecta por definición (CR = 0).
  • Si CR < 0.1, la matriz se considera consistente. ✅
  • Si CR ≥ 0.1, el motor identifica el par de criterios más inconsistente (el que tiene mayor error logarítmico relativo |log(a_ij) − log(w_i / w_j)|) y resalta esa celda en rojo en la tabla para que la revises.

6. Fase de puntuación de alternativas

Cada ciudad recibe una puntuación global a partir de sus métricas y los pesos calculados. Solo se suman los criterios para los que la ciudad tiene datos disponibles en la BD (los faltantes se omiten en numerador y denominador):

PuntuaciónGlobal(c) = Σ_i (Métrica_i(c) · w_i) / Σ_i w_i

Las métricas son los valores 1–5 almacenados en metricas.*. Los pesos son los w_i^slider calculados en la fase AHP (también en escala 1–5).

7. Fase Sort II: clasificación por perfiles límite

A diferencia del AHP tradicional que solo ordena, AHP-Sort II clasifica las ciudades en categorías comparándolas con perfiles límite (b1, b2, …): alternativas hipotéticas que marcan la frontera inferior de cada categoría.

Perfil límite de "🌟 Destino de Élite"

{ calidadTransporte: 4.5, turismo: 4.5, ambienteNocturno: 4.0, seguridad: 4.5, calidadAcademica: 4.5, conectividad: 4.5, asequibilidad: 4.0 }

El umbral de cada categoría se calcula con la misma fórmula que para una ciudad real, usando los pesos del usuario:

umbral_j = Σ_i (b_{j,i} · w_i) / Σ_i w_i
🔑 Importante: los umbrales son dinámicos. Se mueven junto con tus prioridades, no son constantes arbitrarias. Si subes el peso de "seguridad", el umbral de Élite también incorpora esa subida.

Algoritmo de clasificación

Las categorías se recorren de mejor a peor. La ciudad recibe la primera cuyo umbral cumple:

let cat = "⚠️ No Recomendado"; // por defecto for (const c of categoriasConUmbrales()) { if (S >= c.min) { cat = c; break; } }

8. Vetos: cuando una métrica es decisiva

La suma ponderada del paso 6 es compensatoria: una métrica baja se puede compensar con otra alta. Eso a veces no es deseable. Por ejemplo, una ciudad con una seguridad mínima no debería poder ser clasificada como "Élite" por mucha vida nocturna que tenga.

Para esos casos, se aplica un veto que capa la categoría máxima alcanzable, independientemente del score:

CriterioUmbralCapa a
seguridad< 2.0🆗 Aceptable
🚫
Ejemplo: una ciudad con seguridad = 1 nunca podrá ser "Élite" o "Muy Recomendado", aunque su puntuación global supere el umbral. La interfaz mostrará la etiqueta "🚫 Seguridad insuficiente". Esto introduce semántica de outranking dentro de un marco AHP esencialmente compensatorio.

9. Alertas de sensibilidad

Tras la clasificación, el sistema detecta situaciones límite frente a los umbrales dinámicos:

✨ Casi en categoría superior — la diferencia con el umbral de la categoría inmediatamente superior es < 0.15. Un pequeño cambio en los pesos podría hacer subir esta ciudad de categoría.
⚠️ Al límite inferior — la diferencia con el umbral de su propia categoría es < 0.10. Está a punto de bajar.
🚫 Veto activado — cuando hay veto, las dos alertas anteriores se suprimen, porque la categoría no la decide la puntuación global, sino el veto.

10. Resumen del flujo de datos

  1. Entrada: matriz de Saaty (modo experto) o sliders con pesos directos.
  2. Procesamiento AHP: Media Geométrica Normalizada → test de consistencia (CR) → reescalado a 1–5.
  3. Agregación: suma ponderada sobre las métricas disponibles en BD, aplicando el mapeo interfaz → BD.
  4. Cálculo de umbrales dinámicos: el score de cada perfil límite se recalcula con los pesos actuales.
  5. Clasificación Sort II: comparación del score con los umbrales.
  6. Veto: métricas críticas (seguridad) por debajo del umbral capan la categoría máxima.
  7. Alertas de umbral: detección de ciudades cerca del borde (suprimidas si hay veto).
  8. Salida: ranking visual con clasificación, alertas y vetos; mapa interactivo con marcadores de color por posición.

📖 Ejemplo visual rápido

🛡️ Seguridad
← 7 →

Seguridad es mucho más importante

🎉 Ocio
Peso resultante:

Seguridad: 87% | Ocio: 13%

¡Entendido, volver a buscar!