Especificación Técnica: Sistema de Predicción de Desgaste Neumaticos

Table of Contents

1. Planteamiento del Problema

El desgaste de neumáticos en vehículos de servicio pesado (Toyota Hilux) es un fenómeno altamente no lineal. La degradación del elastómero no depende únicamente de la distancia recorrida, sino de la disipación de energía en la interfaz suelo-neumático, influenciada por factores termodinámicos y mecánicos.

2. Definición de Variables (Sensores y Telemetría)

El sistema procesa un vector de estado dinámico \(S = \{v, L, F_z, T, H, k\}\) para determinar el desgaste instantáneo.

Variable Símbolo Unidad Descripción Física
Velocidad \(v\) km/h Frecuencia de deformación e histéresis térmica.
Lateral \(L\) G-Lateral Estrés cortante en los hombros de la banda.
Carga \(F_z\) Factor (1-2) Presión de contacto sobre el suelo.
Temperatura \(T\) °C Modifica la dureza Shore y viscoelasticidad.
Humedad \(H\) % Coeficiente de fricción y refrigeración superficial.
Suelo \(k\) Adimensional Índice de abrasividad de la superficie.

3. Constantes de Fabricante y Calibración

Partimos de las especificaciones de diseño para neumáticos All-Terrain (AT).

3.1. Coeficiente de Suelo (Escala de Abrasividad \(k\))

El valor \(k\) parametriza la rugosidad del terreno, afectando la transición de desgaste adhesivo a desgaste por corte (chipping).

Tipo de Suelo Valor \(k\) Fenómeno Dominante
Asfalto Nominal 1.0 Abrasión adhesiva mínima.
Asfalto Rugoso 2.0 Histéresis térmica.
Ripio Consolidado 4.0 Chipping & Cutting.
Suelo Pesado/Piedra 5.5 Lug Tearing (Desgarro).

3.2. Presupuesto de Banda de Rodadura

  • Profundidad Inicial: 10 mm (10,000 \(\mu m\)).
  • Límite de Seguridad (EoL): 2.0 mm (Testigo operativo).
  • Vida Útil de Referencia: 50,000 km (Target comercial).

4. El Modelo Matemático (GP + Escala)

El núcleo del cálculo es una S-Expression evolucionada mediante Programación Genética, normalizada por un factor de escala para alinear la intensidad teórica con la realidad de flota.

4.1. Factor de Escala

Dado que el modelo GP detecta picos de estrés, aplicamos un factor de normalización:

4.1.1. Calibración y Factor de Escala operativo

El resultado bruto de la S-Expression evolucionada por el GP representa un "Índice de Estrés Mecánico" adimensional. Para transformar este índice en una unidad de medida física utilizable para la gestión de activos (\(\mu m/km\)), es imperativo aplicar un proceso de calibración.

4.1.2. El Factor de Escala (0.025)

El valor 0.025 es una constante de normalización aplicada a la salida de la S-Expression.

  1. Naturaleza del Factor

    En Programación Genética, el fitness se optimiza para minimizar el error respecto a un target, pero la magnitud interna de los nodos (especialmente al usar funciones como sqr o safe-expt) puede escalar a valores que no representan directamente una unidad física.

    • Función Técnica: El factor 0.025 actúa como una ganancia estática (\(Gain\)) que mapea el "Índice de Estrés" adimensional del GP al dominio del desgaste físico real.
    • Justificación: Se define como un parámetro de sintonía del modelo para asegurar que, bajo condiciones de operación nominal (Asfalto, \(k=1.0\)), el desgaste proyectado sea consistente con el ciclo de vida estándar de un neumático AT (All-Terrain) de ~50,000 km.
  2. Importancia en la Proyección

    Sin este factor de escala, el modelo mantiene su capacidad de ordenamiento (saber qué terreno gasta más), pero pierde la capacidad de predicción temporal. La aplicación de este coeficiente permite integrar el desgaste instantáneo en la simulación de Monte Carlo para obtener valores de kilometraje total (EoL - End of Life).

4.2. Metodología de Evolución y Parámetros GP

Para alcanzar la S-Expression de 13 hits, el motor de Programación Genética fue configurado con una población masiva y una presión de selección orientada a la profundidad controlada. Esto asegura que la función resultante no sea solo un ajuste de curvas (overfitting), sino que tenga capacidad de generalización.

4.2.1. Configuración del Experimento

A continuación se detallan los parámetros técnicos utilizados en la corrida definitiva:

Parámetro Valor Descripción Técnica
Generaciones Máximas 600 Límite de iteraciones del proceso evolutivo.
Tamaño de la Población 15,000 Diversidad genética para evitar mínimos locales.
Profundidad Inicial Máxima 6 Límite para individuos de la Generación 0.
Profundidad tras Crossover 15 Límite para evitar el "bloat" (crecimiento excesivo).
Método de Selección TOURNAMENT Selección competitiva por aptitud (Fitness).
Método de Generación RAMPED-HALF-AND-HALF Asegura una mezcla equilibrada de árboles de toda forma.
Cruce en Puntos de Función 0.5 (50%) Prioriza el intercambio de lógica operativa.
Casos de Fitness 13 Puntos de control basados en telemetría real.
Semilla Aleatoria (Seed) 777.0d0 Garantiza la reproducibilidad del experimento.

4.2.2. Dataset de Entrenamiento (Escenarios de Referencia)

Para la evolución del modelo GP, se definieron 13 escenarios operativos basados en la experiencia técnica de campo. Estos targets (µm/km) actúan como objetivos de diseño para que el algoritmo aprenda a ponderar la severidad de cada variable.

Caso Terreno Condiciones Vel Fz T°C Target (µm/km)
1 Asfalto Crucero nominal 100 1.0 25 0.15
2 Asfalto Verano en curvas 60 1.2 38 0.85
3 Ripio Invierno (Húmedo) 40 1.0 5 1.20
4 Ripio Carga máxima 30 2.0 15 2.50
5 Asfalto Frenada brusca 80 1.0 30 5.00
6 Asfalto Ciudad / Lluvia 20 1.0 10 0.10
7 Ripio Ruta 40 (Alta vel) 70 1.1 18 0.90
8 Barro/Nieve Pino Hachado (Torque) 15 1.5 -2 0.40
9 Asfalto Subida abrasiva 50 1.6 32 0.65
10 Base/Maniobras Velocidad muy baja 5 1.0 20 0.02
11 Ripio Seco Neuquén (Verano) 65 1.0 35 1.45
12 Montaña Descenso trabado 45 1.4 22 1.10
13 Ruta Viento lateral fuerte 110 1.0 12 0.35

4.2.3. Función de Aptitud (Fitness)

El sistema penaliza el error cuadrático medio respecto a los 13 casos testigo. Se aplicó una Presión de Parsimonia proporcional al tamaño del árbol (0.005 por nodo) para forzar a la IA a encontrar la solución más elegante y computacionalmente eficiente posible.

  1. Presión de Parsimonia y Control de Complejidad

    En el desarrollo de modelos mediante Programación Genética, existe el riesgo de "Bloat" u obesidad del genoma: la tendencia de los algoritmos evolutivos a generar soluciones excesivamente complejas que contienen ramas redundantes o código muerto que no mejora la precisión.

  2. Implementación del Castigo por Tamaño

    Para mitigar este efecto y asegurar que el modelo sea eficiente para su ejecución en tiempo real, se aplicó una Presión de Parsimonia dentro de la función de aptitud (Fitness):

    • Penalización Lineal: Por cada nodo (función o terminal) presente en la S-Expression, se suma un valor de 0.005 al error total del individuo.
    • Ecuación de Fitness Ajustada: \[Fitness_{final} = \sum (Error_{cuadrático}) + (N_{nodos} \times 0.005)\]

4.3. Resultado del GP

(defun predict-hilux-tire-wear (&key vel lat fz tmp hum suelo-k)
  "Calcula el desgaste de neumáticos (micrones/km) basado en el modelo evolucionado.
     Argumentos: 
     :vel (km/h), :lat (G-Lateral), :fz (Carga 1.0-2.0), 
     :tmp (°C), :hum (%), :suelo-k (1=Asfalto, 4.5=Ripio)"
  (let ((*current-vel* (float vel 0.0d0))
        (*current-ay-lat* (float lat 0.0d0))
        (*current-fz-load* (float fz 0.0d0))
        (*current-temp-amb* (float tmp 0.0d0))
        (*current-hum-amb* (float hum 0.0d0))
        (*current-suelo-k* (float suelo-k 0.0d0)))
    (labels ((% (a b) (if (zerop b) 0.0d0 (/ a b)))
             (safe-log (a) (let ((abs-a (abs a))) (if (< abs-a 1.0d-6) -6.0d0 (log abs-a))))
             (safe-expt (base power) 
               (handler-case (expt (abs base) (max -10.0d0 (min 10.0d0 power)))
                 (error () 0.0d0)))
             (if-gt (a b then else) (if (> a b) then else))
             (sqr (x) (* x x)))

      ;; El 'Cerebro' de 13 hits:
      (max
       (max
        (sqr
         (% (+ (+ 1.0 87.54708862304688d0) (sqr (sqr *current-suelo-k*)))
            (% 65.350341796875d0 *current-ay-lat*)))
        (-
         (max
          (min *current-fz-load*
               (if-gt (safe-log *current-suelo-k*) *current-fz-load*
                      (% *current-temp-amb* 23.266815185546875d0) 0.1d0))
          (% (sqr -11.586402893066406d0) (sqr *current-hum-amb*)))
         (-
          (safe-expt
           (if-gt *current-vel* *current-temp-amb* *current-ay-lat*
                  65.350341796875d0)
           (sqr *current-suelo-k*))
          0.1d0)))
       (max
        (%
         (+ (max 65.350341796875d0 (+ 65.350341796875d0 (sqr (safe-log 0.1d0))))
            (+ (% 65.350341796875d0 *current-fz-load*)
               (sqr (sqr *current-suelo-k*))))
         (% 65.350341796875d0
            (if-gt *current-vel* (* *current-suelo-k* *current-temp-amb*)
                   *current-ay-lat* -11.586402893066406d0)))
        (% (sqr (safe-expt *current-vel* *current-ay-lat*))
           (+ 87.54708862304688d0 (sqr -11.586402893066406d0))))))))

4.3.1. Run funcion encontrada por el GP

;; Ejemplo: 40 km/h en ripio (k=4.0), con carga (fz=1.5) y frío (5°C)
(predict-hilux-tire-wear :vel 40 :lat 0.2 :fz 1.5 :tmp 5 :hum 80 :suelo-k 4.0)
1.133028932292446d0

5. Motor de Simulación y Análisis de Riesgo

Para el reporte técnico, consolidamos la lógica operativa en tres pilares: Definición de Escenarios, Transición Estocástica y Cálculo de Supervivencia. Esta arquitectura permite simular la variabilidad real de una flota en la Patagonia.

5.1. Definición de Escenarios y Matriz de Transición

La simulación no asume un camino lineal. En la realidad operativa, una Hilux alterna entre diferentes superficies según la misión asignada.

  • *Los Estados (*estados-hilux):** Representan "instantáneas" de telemetría que capturan la severidad del uso.
    • :pav (Pavimento): Velocidad de crucero, carga nominal, desgaste por histéresis térmica.
    • :rip (Ripio): Velocidad reducida, pero el coeficiente de suelo \(k=4.0\) dispara el desprendimiento mecánico (chipping).
    • :off (Extremo): Máximo torque, carga límite (\(F_z=1.8\)) y suelo altamente abrasivo que busca el desgarro de tacos.
  • *La Matriz de Transición (*matriz-transicion):** Define la probabilidad de que el vehículo cambie de terreno en el siguiente kilómetro.
    • Esto modela la incertidumbre del trayecto. Por ejemplo, un 12% de probabilidad de pasar de asfalto a ripio refleja la realidad de las rutas de acceso en yacimientos.

5.2. Proyección de Vida Útil (Monte Carlo)

En este apartado unimos la IA (GP) con la Estadística (Markov) para obtener una métrica de confianza.

5.2.1. El Algoritmo de Simulación

La función simular-distancia-hasta-fallo es el núcleo del análisis de confiabilidad. Su ejecución sigue este flujo:

  1. Kilómetro a Kilómetro: En cada paso, consulta el estado operativo actual.
  2. Invocación del Modelo GP: Llama a predict-hilux-tire-wear inyectando los sensores del estado activo.
  3. Aplicación del Factor de Escala: Multiplica el estrés teórico por 0.025 para normalizar el desgaste a valores reales de flota.
  4. Acumulación y Salto: Suma el desgaste al total y decide el próximo terreno mediante el motor de Markov.
  5. Condición de Parada: El ciclo termina al agotar los 10,000 micrones (10 mm) de banda útil.

5.2.2. Reporte de Supervivencia e Iteraciones

La función reporte-supervivencia utiliza el argumento n-simulaciones para construir una base estadística sólida.

  • Muestra Estadística: Al usar un valor como 50, no nos quedamos con una sola trayectoria "afortunada" o "desastrosa", sino que generamos una campana de Gauss de rendimientos posibles.
  • Métricas de Riesgo: El "Peor Escenario" es vital para la ingeniería; nos define la ventana de mantenimiento preventivo para garantizar que ningún neumático de la flota llegue a un estado crítico por debajo de los límites de seguridad.

5.2.3. Establecemos los parámetros de telemetría por estado y las probabilidades de salto entre ellos (Modelo de Markov).

;; --- 5.1.1. PARÁMETROS DE ESTADO ---
(defparameter *estados-hilux* '((:pav . (:vel 100 :lat 0.1 :fz 1.2 :tmp 25 :hum 40 :suelo-k 1.0))
                                (:rip . (:vel 35  :lat 0.2 :fz 1.5 :tmp 20 :hum 60 :suelo-k 4.0))
                                (:off . (:vel 20  :lat 0.5 :fz 1.8 :tmp 15 :hum 90 :suelo-k 5.5))))

;; --- 5.1.2. MATRIZ DE MARKOV ---
(defparameter *matriz-transicion*
  '((:pav . ((:pav . 0.85) (:rip . 0.12) (:off . 0.03)))
    (:rip . ((:pav . 0.20) (:rip . 0.70) (:off . 0.10)))
    (:off . ((:pav . 0.10) (:rip . 0.30) (:off . 0.60)))))

(defun siguiente-estado (estado-actual)
  "Selecciona el próximo escenario basándose en la probabilidad acumulada."
  (let ((random-val (random 1.0)) 
        (sum 0.0)
        (posibilidades (cdr (assoc estado-actual *matriz-transicion*))))
    (loop for (estado . prob) in posibilidades
          do (incf sum prob)
          if (<= random-val sum) return estado)))

5.2.4. Proyección de Vida Útil (Monte Carlo)

Utilizamos el método de Monte Carlo para proyectar el punto de fallo (EoL) integrando el modelo GP con el factor de escala de calibración.

(defun simular-distancia-hasta-fallo (limite-micrones &optional (escala 0.025d0))
  "Simula el kilometraje total hasta agotar el presupuesto de 10mm de caucho."
  (let ((estado-actual :pav) 
        (desgaste-total 0.0d0) 
        (km 0))
    (loop
      (let ((params (cdr (assoc estado-actual *estados-hilux*))))
        ;; Integración: Modelo GP * Factor de Calibración
        (incf desgaste-total (* escala (apply #'predict-hilux-tire-wear params)))
        (incf km))
      (when (>= desgaste-total limite-micrones) (return km))
      (setf estado-actual (siguiente-estado estado-actual)))))

(defun reporte-supervivencia (n-simulaciones)
  "Ejecuta la simulación masiva y reporta métricas de riesgo operativo."
  (let ((resultados nil) (limite 10000.0d0))
    (dotimes (i n-simulaciones)
      (push (simular-distancia-hasta-fallo limite) resultados))
    (let* ((avg (round (/ (reduce #'+ resultados) n-simulaciones)))
           (peor (reduce #'min resultados))
           (mejor (reduce #'max resultados)))
      (format t "~%--- REPORTE TÉCNICO DE SUPERVIVENCIA ---")
      (format t "~%Vida útil promedio esperada: ~A km" avg)
      (format t "~%Escenario de riesgo (Fallo prematuro): ~A km" peor)
      (format t "~%Escenario óptimo (Rendimiento máx): ~A km" mejor)
      (format t "~%Dispersión operativa: ~A km" (- mejor peor))
      (values))))

6. Verificación y Validación del Modelo

Para validar la coherencia del sistema, se realizó una prueba de esfuerzo estocástica. Esta prueba no es un cálculo lineal, sino una simulación de la "vida real" del neumático.

6.1. Metodología de Validación (Monte Carlo)

Se ejecutó el comando (reporte-supervivencia 50), lo cual implica:

  • 50 Simulaciones Independientes: Se recrearon 50 "vidas" completas de neumáticos desde 0 km hasta el fallo (10mm de desgaste).
  • Variabilidad de Trayecto: En cada simulación, el algoritmo de Markov decidió kilómetro a kilómetro el tipo de terreno, carga y temperatura, generando 50 historias de uso totalmente distintas.

6.2. Análisis de Resultados Experimentales

Los resultados obtenidos demuestran la estabilidad de la arquitectura GP-Markov:

Métrica Valor Obtenido Significado Técnico
Vida Útil Promedio 50,819 km Convergencia estadística al target de diseño (Calibración).
Fallo Prematuro (Peor Caso) 47,937 km Límite inferior para planificación de mantenimiento.
Máximo Rendimiento 52,869 km Potencial máximo en condiciones de uso favorable.
     

6.2.1. Simulacion de Montecarlo

(reporte-supervivencia 50)

--- ANALISIS DE SUPERVIVENCIA (Limite 10mm) ---
Vida útil promedio: 50819 km
Fallo prematuro (Peor caso): 47937 km
Maximo rendimiento: 52869 km

6.2.2. Conclusión de la Validación

La dispersión observada (aprox. 5,000 km entre el mejor y el peor caso) es coherente con la realidad operativa de la Toyota Hilux en terrenos mixtos. Esto confirma que el Factor de Escala (0.025) y las S-Expressions de 13 hits capturan correctamente la severidad del uso sin caer en promedios planos.

7. Conclusión

Este modelo híbrido integra la sensibilidad de sensores mediante IA con la robustez estadística de los procesos estocásticos, proporcionando una herramienta de auditoría técnica alineada con el proyecto IISCV.

8. ANEXO I (codigo Fuente GP)

(defpackage :gp.examples.hilux.neumaticos
  (:use :cl :gp.kernel :gp.simplify-rules)
  (:export #:run #:run-example #:bench))

(in-package :gp.examples.hilux.neumaticos)

;; --- 1. VARIABLES DINÁMICAS (Sensores) ---
(defvar *current-vel* 0.0d0)      ; Velocidad (km/h)
(defvar *current-ay-lat* 0.0d0)   ; G-Lateral
(defvar *current-fz-load* 0.0d0)  ; Carga (1.0=Vacío, 2.0=Lleno)
(defvar *current-temp-amb* 0.0d0) ; Temperatura ambiente
(defvar *current-hum-amb* 0.0d0)  ; Humedad
(defvar *current-suelo-k* 1.0d0)  ; 1.0=Asfalto, 4.0=Ripio

(defvar *hilux-fitness-cases* nil)

;; --- 2. ARITMÉTICA PROTEGIDA (Anti-Complejos y Anti-Explosiones) ---

(defun % (a b)
  "División protegida."
  (if (and (numberp b) (/= b 0))
      (/ a b)
      0.0d0))

(defun safe-log (a)
  "Logaritmo protegido para evitar números complejos (usa valor absoluto)."
  (let ((abs-a (abs (float a 0.0d0))))
    (if (< abs-a 1.0d-6) -6.0d0 (log abs-a))))

(defun safe-exp (a)
  "Exponencial protegida para evitar overflows."
  (let ((val (float a 0.0d0)))
    (exp (max -20.0d0 (min 20.0d0 val)))))

(defun safe-expt (base power)
  "Potencia protegida: evita bases negativas (complejos) y potencias gigantes."
  (let ((b (abs (float base 0.0d0)))
        (p (max -10.0d0 (min 10.0d0 (float power 0.0d0)))))
    (handler-case (expt b p)
      (error () 0.0d0))))

(defun if-gt (a b then else)
  "Si A > B devuelve THEN, si no ELSE. Versión funcional para GP."
  (if (> a b) then else))

(defun sqr (x) (* x x))

;; --- 3. CONFIGURACIÓN GP ---

(defun define-function-set-for-HILUX ()
  ;; Añadimos MIN y ABS explícito para que pueda "recortar" picos de desgaste
  (values '(+ - * % safe-exp safe-log max min safe-expt if-gt abs sqr) 
          '(2 2 2 2 1 1 2 2 2 4 1 1)))


(defun generate-constants (n range)
  "Genera N constantes aleatorias para darle variedad al set inicial."
  (loop repeat n collect (float (- (random (* 2.0 range)) range) 0.0d0)))

(defun define-terminal-set-for-HILUX ()
  (values (append '(*current-vel* *current-ay-lat* *current-fz-load* *current-temp-amb* *current-hum-amb* *current-suelo-k*)
                  '(0.1 1.0 10.0) ; Constantes fijas estructurales
                  (generate-constants 5 100.0)) ; 5 constantes aleatorias entre -100 y 100
          nil))


(defun generate-hilux-fitness-cases ()
  "Casos testigo de la Patagonia Norte (Target en Micrones/km)."
  (setf *hilux-fitness-cases*
        '(;; --- CASOS ORIGINALES ---
          (100.0  0.05  1.0  25.0  40.0  1.0   0.15)  ; 1. Crucero Asfalto
          (60.0   0.45  1.2  38.0  20.0  1.0   0.85)  ; 2. Verano curvas
          (40.0   0.20  1.0   5.0  80.0  4.0   1.20)  ; 3. Ripio Invierno
          (30.0   0.30  2.0  15.0  50.0  4.0   2.50)  ; 4. Carga máxima ripio
          (80.0   0.80  1.0  30.0  30.0  1.0   5.00)  ; 5. Frenada brusca
          (20.0   0.10  1.0  10.0  90.0  2.0   0.10)  ; 6. Ciudad lluvia
          ;; 7. Ripio consolidado alta velocidad (Ruta 40 - Chipping)
          (70.0   0.15  1.1  18.0  35.0  3.5   0.90)  
          ;; 8. Barro/Nieve (Paso Pino Hachado - Mucho torque/poco avance)
          (15.0   0.05  1.5  -2.0  95.0  4.5   0.40)  
          ;; 9. Asfalto abrasivo con carga media (Subida a yacimiento)
          (50.0   0.25  1.6  32.0  15.0  1.5   0.65)  
          ;; 10. Ralentí / Maniobras en base (Cero desgaste térmico)
          (5.0    0.05  1.0  20.0  50.0  2.0   0.02)  
          ;; 11. Crucero en ripio seco (Norte de Neuquén - Enero)
          (65.0   0.10  1.0  35.0  10.0  4.0   1.45)  
          ;; 12. Descenso de montaña trabado (Uso intenso de freno/lateral)
          (45.0   0.60  1.4  22.0  40.0  1.2   1.10)
          ;; 13. Ruta con viento lateral fuerte (Compensación de dirección)
          (110.0  0.15  1.0  12.0  60.0  1.0   0.35)))

  (setf *number-of-fitness-cases* (length *hilux-fitness-cases*))
  *hilux-fitness-cases*)



;; --- 4. MOTOR DE EVALUACIÓN (Fitness) ---
(defun evaluate-standardized-fitness-for-HILUX (program fitness-cases)
  (let ((error-total 0.0d0)
        (hits 0)
        (tree-size (count-nodes program))
        (symbols '(*current-vel* *current-ay-lat* *current-fz-load* *current-temp-amb* *current-hum-amb* *current-suelo-k*)))
    (dolist (case fitness-cases)
      (let* ((values (mapcar (lambda (x) (float x 0.0d0)) (subseq case 0 6)))
             (target (seventh case))
             ;; CASOS CRÍTICOS: Peso doble si es frío extremo (< 5°C) o ripio pesado (k > 3.5)
             (weight (if (or (< (fourth case) 5.0) (> (sixth case) 3.5)) 2.0d0 1.0d0)))

        (progv symbols values
          (let ((pred (handler-case 
                          (sb-int:with-float-traps-masked (:overflow :invalid :divide-by-zero)
                            (eval program))
                        (error () :error))))

            (cond 
              ((or (eq pred :error) (not (numberp pred)) (complexp pred)
                   (sb-ext:float-infinity-p pred) (sb-ext:float-nan-p pred))
               (incf error-total 5000.0d0))

              (t
               (let* ((diff (abs (- (float (realpart pred) 0.0d0) target)))
                      ;; Penalización cuadrática ponderada por la importancia del caso
                      (weighted-diff (* weight 
                                        (cond ((< diff 1.0) diff)
                                              ((> diff 1.0d100) 1.0d200)
                                              (t (expt diff 2))))))
                 (incf error-total weighted-diff)
                 (if (< diff 0.1) (incf hits)))))))))

    ;; Parsimony Pressure aumentada para evitar el bloat y mejorar generalización
    (let ((final-fitness (+ error-total (* tree-size 0.005d0))))
      (values (float final-fitness 0.0d0) hits))))


(defun count-nodes (tree)
  "Retorna el número total de nodos en el árbol (S-Expression)."
  (if (listp tree)
      (1+ (reduce #'+ (mapcar #'count-nodes (cdr tree)) :initial-value 0))
      1))


;; --- 5. PARÁMETROS DEL SISTEMA ---
(defun define-parameters-for-HILUX ()
  (setf *number-of-fitness-cases* (length (generate-hilux-fitness-cases)))
  (setf *rules* *boolean-rules*)
  ;; Aumentamos un poco la profundidad permitida para dar margen de maniobra
  (setf *max-depth-for-new-individuals* 6) 
  (setf *max-depth-for-new-subtrees-in-mutants* 4)
  (setf *max-depth-for-individuals-after-crossover* 15)
  ;; Mantenemos las proporciones de cruce
  (setf *fitness-proportionate-reproduction-fraction* 0.1)
  (setf *crossover-at-any-point-fraction* 0.2)
  (setf *crossover-at-function-point-fraction* 0.5)
  (setf *method-of-selection* :tournament)
  (setf *method-of-generation* :ramped-half-and-half)
  (values))


(defun define-termination-criterion-for-HILUX (gen max-gen best-fit best-hits)
  (declare (ignore best-fit))
  (or (>= gen max-gen)
      (>= best-hits *number-of-fitness-cases*)))

(defun HILUX-NEUMATICOS ()
  (values 'define-function-set-for-HILUX
          'define-terminal-set-for-HILUX
          'generate-hilux-fitness-cases
          'evaluate-standardized-fitness-for-HILUX
          'define-parameters-for-HILUX
          'define-termination-criterion-for-HILUX))

;; --- 6. EJECUCIÓN ---

(defun run (maximum-generations size-of-population seed 
            &key (verbose nil) 
              (filename "/home/mtk/quicklisp/local-projects/gp/examples/hilux_neumaticos_results.txt"))
  (let ((*verbose* (if verbose :verbose :silent)))
    (with-open-file (*standard-output* filename :direction :output 
                                                :if-exists :supersede :if-does-not-exist :create)
      (format t "--- INICIANDO EVOLUCION: DESGASTE NEUMATICOS HILUX ---~%")
      (gp.kernel:run-genetic-programming-system 'HILUX-NEUMATICOS seed maximum-generations size-of-population)
      (format t "~%--- FIN DEL RUN ---~%"))
    (format t "Proceso finalizado. Resultados en: ~A~%" filename)
    (values)))

(defun bench ()
  (format t "~%--- BENCHMARK NEUMATICOS ---~%")
  (generate-hilux-fitness-cases)
  (time (run 600 15000 777 :verbose nil)))

9. ANEXO II: Estabilidad Numérica y Aritmética Protegida

El modelo generado por Programación Genética opera sobre un espacio de búsqueda vasto donde las combinaciones aleatorias de funciones pueden generar resultados indefinidos. Para garantizar que el "Cerebro" de la simulación sea computacionalmente estable, se implementaron operadores protegidos.

9.1. Mecanismos de Robustez

Los operadores en el set de funciones han sido redefinidos para manejar excepciones comunes en el cálculo de ingeniería:

  • División Protegida (%): Si el denominador es cero, la función devuelve \(0.0d0\) en lugar de disparar una interrupción de sistema. Esto permite que la evolución explore rangos de variables donde los sensores podrían reportar valores nulos.
  • Logaritmo Seguro (safe-log): Implementa un piso de seguridad (\(1.0 \times 10^{-6}\)) y opera sobre el valor absoluto de la entrada. Esto evita la generación de números complejos y errores de dominio en el cálculo de la entropía de desgaste.
  • Potencia Protegida (safe-expt): Limita tanto la base (siempre positiva) como el exponente (rango \([-10, 10]\)) para prevenir desbordamientos de memoria (Overflow) y bajo flujo (Underflow) durante la evaluación de polinomios complejos.
  • Condicionales de Flujo (if-gt): Permite al modelo ramificar su lógica (p. ej., cambiar de comportamiento si la temperatura supera un umbral) sin romper la continuidad de la S-Expression.

10. ANEXO III: Sustento Teórico de la Escala de Abrasividad (k)

La tabla de coeficientes de suelo utilizada en este modelo no es arbitraria; se fundamenta en la mecánica de contacto de elastómeros y en estándares internacionales de rugosidad de pavimentos.

10.1. 1. Fundamento en la Mecánica de Moore

El valor \(k=1.0\) representa la condición de referencia donde predomina la fricción adhesiva. A medida que \(k\) aumenta, el modelo transita hacia el predominio de la fricción por histéresis y deformación macroscópica, según la formulación clásica de Desmond Moore.

10.2. 2. Correlación con MTD (Mean Texture Depth)

Los saltos en la escala \(k\) (de 1.0 a 5.5) guardan una relación directa con el desplazamiento de volumen en el ensayo de "Círculo de Arena" (Sand Patch Test), que mide la macrotextura del terreno.

10.3. 3. Justificación del Factor de Severidad (k=4.0 a 5.5)

La transición al valor \(k=4.0\) (Ripio) responde al cambio de régimen de desgaste: de abrasión por deslizamiento a fractura mecánica por indentación aguda (Chipping & Cutting). Este factor de severidad es consistente con los multiplicadores de desgaste observados en estudios de "Road Severity Index" para flotas pesadas.

10.4. Nota al Pie para Tabla de Coeficientes:

"Los valores de k están normalizados siguiendo los principios de disipación de energía por histéresis (Moore, 1975). El incremento no lineal hacia k=5.5 representa el umbral de energía crítica para el desgarro del taco (Tear Strength), verificado mediante la macrotextura MTD de superficies no pavimentadas (ASTM E965)."

Date: 2024-05-22 Wed 00:00

Author: Gaston Pepe

Created: 2026-03-09 Mon 16:12

Validate