#lang racket

;(require (only-in "parametros-nuevo-bidones.rkt" prob-mutacion length-cromosoma punto-de-cruce))
;(require (only-in "AG-cruceYmutacion.rkt" mutacion cruce list-set!))

;;MODULO EMPAREJAMIENTO
;;métodos de emparejamiento
(define empareja-primero-segundo;car y cadr padres
  (lambda (padres);un padre = (fitness (representación))
    (if (null? padres)
        '()
        (let* ((prog1 (cadr (car padres)))
               (prog2 (cadr (cadr padres)))
              )
          (cons
           (list prog1 prog2)
           (empareja-primero-segundo (cddr padres)))
          )) ))

(define empareja-primero-ultimo;car y last padres
  (lambda (padres);un padre = (fitness (representación))
    (if (null? padres)
        '()
        (let* ((prog1 (cadr (car padres)))
               (prog2 (cadr (last padres)))
               )
          (cons
           (list prog1 prog2)
           (empareja-primero-ultimo 
            (take (cdr padres) (- (length padres) 2))))
          )) ))

(define otro-azar;fuerza a que n cambie
  (lambda (n lon)
    (let ((num (random lon)))
      (if (equal? num n)
          (otro-azar n lon)
          num) )))

(define remove-por-ref
  (lambda (lista ref)
    (let ((comienzo (take lista ref))
          (resto (drop lista (add1 ref)))
          )
      (append comienzo resto) )))

(define empareja-dos-azar;
  (lambda (padres);un padre = (fitness (representación))
    (if (null? padres)
        '()
        (let* ((long (length padres))
               (n1-azar (random long))
               (n2-azar (otro-azar n1-azar long))
               (prog1 (cadr (list-ref padres n1-azar)))
               (prog2 (cadr (list-ref padres n2-azar)))
              )
          (cons
           (list prog1 prog2)
           (empareja-dos-azar
            (if (> n1-azar n2-azar)
                (remove-por-ref
                 (remove-por-ref padres n1-azar) n2-azar)
                (remove-por-ref
                 (remove-por-ref padres n2-azar) n1-azar)) ))
          )
        ) ))

(provide
 empareja-primero-ultimo
 empareja-primero-segundo
 empareja-dos-azar
 )