Sistema de planificación de trayectoria profesional que combina búsqueda informada (A*), metaheurísticas (Algoritmo Genético), una búsqueda voraz (Greedy) como baseline y un modelo de lenguaje (LLM) para interpretar objetivos en lenguaje natural y evaluar la calidad de las trayectorias propuestas.
- Python 3.11+
- Ollama instalado y corriendo (para el componente LLM)
# Clonar el repositorio
git clone <url-del-repo>
cd Intelligent-Learning-Path
# Crear entorno virtual e instalar dependencias
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
# Configurar variables de entorno (opcional)
# Crear un archivo .env con las siguientes variables:Editar .env si es necesario:
| Variable | Descripción | Default |
|---|---|---|
OLLAMA_HOST |
URL del servidor Ollama | http://localhost:11434 |
OLLAMA_MODEL |
Modelo a utilizar | qwen3:1.7b |
OLLAMA_TIMEOUT |
Timeout en segundos | 300 |
# Instalar Streamlit (si no está instalado)
.venv/bin/pip install streamlit>=1.30.0
# Ejecutar la interfaz web
.venv/bin/streamlit run app.pySe abrirá una interfaz en el navegador (http://localhost:8501).
Escribe tu objetivo profesional en lenguaje natural y recibe un plan personalizado.
Ejemplo de uso:
Quiero ser Data Scientist, ya sé Python, tengo 500 de presupuesto y 30 semanas.
# Descargar el modelo (si no se tiene)
ollama pull qwen3:1.7b
# Ejecutar el sistema
.venv/bin/python main.pyEl sistema pedirá describir un objetivo profesional en lenguaje natural. Ejemplo:
> Quiero ser Data Scientist, ya sé Python, tengo 500 de presupuesto y 30 semanas.
Salida esperada:
===== PARSED GOAL =====
{ "target_career": "ML Engineer", "initial_skills": ["Python"], ... }
===== A* SEARCH =====
1. Statistics
2. Linux
3. Linear Algebra
4. Docker
5. Machine Learning
6. Deep Learning
Total cost: 546 | Total time: 32 weeks
===== GENETIC ALGORITHM =====
1. Statistics
2. Linux
...
Para regenerar el dataset sintético (56 cursos, 10 carreras):
.venv/bin/python data/generator.py# Comparativa A* vs GA vs Greedy (genera experiments/results.csv)
.venv/bin/python -m experiments.compare_algorithms --trials 5
# Generar gráficos (solution_quality, time_vs_cost, constraint_feasibility, summary_table)
.venv/bin/python -m experiments.plot_resultsLos gráficos se guardan en experiments/figures/.
El sistema incluye un simulador Monte Carlo que evalúa la robustez de las soluciones:
from simulation.simulator import LearningSimulator
sim = LearningSimulator(courses_dict)
result = sim.simulate(path, n_runs=1000)
# result = {'total_weeks': 31, 'abandonment_probability': 0.78}.venv/bin/python -m pytest tests/ -v├── data/
│ ├── courses.json # Catálogo de cursos (56 cursos, generado)
│ ├── careers.json # Carreras y habilidades requeridas
│ ├── prerequisites.json # Aristas del grafo de prerequisitos
│ ├── skills_seed.json # Semilla curada a mano
│ └── generator.py # Generador sintético del dataset
├── planning/
│ ├── career_planner.py # Búsqueda A* con heurística admisible
│ ├── metaheuristic.py # Algoritmo Genético (OX crossover)
│ ├── greedy.py # Búsqueda voraz (baseline)
│ ├── constraints.py # Validación de prerequisitos
│ └── state.py # Estado de búsqueda para A*
├── llm/
│ ├── client.py # Wrapper de Ollama
│ ├── parser.py # Parsing de objetivo en lenguaje natural
│ └── evaluator.py # Evaluación de trayectorias
├── simulation/
│ └── simulator.py # Simulación estocástica Monte Carlo
├── experiments/
│ ├── compare_algorithms.py # Harness de comparación A* vs GA vs Greedy
│ ├── plot_results.py # Generación de figuras
│ ├── results.csv # Resultados crudos (225 corridas)
│ ├── simulation_results.csv # Resultados de simulación estocástica
│ ├── constraint_data.csv # Datos de factibilidad bajo restricciones
│ └── figures/ # Figuras generadas
├── tests/ # Tests unitarios
├── app.py # Interfaz web (Streamlit)
├── main.py # Punto de entrada CLI
├── requirements.txt
└── .env (opcional, ver tabla de variables de entorno)
- Estado: conjunto de cursos completados, camino, costo acumulado, tiempo acumulado.
- Heurística admisible: relajación LP fraccionaria (duración/k habilidades).
- Restricciones: presupuesto y tiempo máximo.
- Complejidad: óptimo en tiempo cuando la heurística es consistente.
- Representación: permutación de cursos candidatos.
- Operadores: Order Crossover (OX), mutación por swap, reparación topológica.
- Fitness:
w_t × tiempo + w_c × costo + w_m × cursos_faltantes + 1000 × [infactible]. - Selección: torneo (k=3), elitismo.
- Estrategia: selecciona el curso más corto que enseña una habilidad faltante.
- Complejidad: O(n³).
- Ventaja: extremely rápido (<1ms).
- Desventaja: no considera cursos combinados, produce trayectorias 25--75% más largas.
El LLM (Ollama) cumple dos funciones:
- Parser de objetivos (
GoalParser): convierte una frase en lenguaje natural a un JSON estructurado con carrera objetivo, habilidades iniciales y restricciones. - Evaluador de trayectorias (
PathEvaluator): evalúa la calidad de una trayectoria en coherencia, progresión lógica, empleabilidad y utilidad práctica, devolviendo un score de 0 a 10.