Paula Cazali

14000060

generate_cities <- function(cities =5){
  pos_x <- sample(1:100, size = cities , replace=TRUE) 
  pos_y <- sample(1:100, size = cities , replace=TRUE)
  out <- data.frame(city = 1:cities, pos_x, pos_y )
  return(out)
}
distance_route <- function(route,distance){
  sum_distance<-0
  for(i in 1:length(route[-1])){
    out <- distance[ route[i], route[i+1]  ]
    sum_distance <- sum_distance + out
  }
  return(sum_distance)
}
sample_route <- function(...,cities = 5){
  c(1,sample(2:cities),1) %>% return()
}
select_mating_parents <- function(...,pop_size, roullete, population){
  sum_fit_p <-
    sample(1:sum(roullete$rank), size = 1 )
  pindex <-
    roullete %>% 
    filter(cumsum_rank < sum_fit_p) %>%
    nrow()
  p1 <- roullete[pindex + 1,] %>% pull(parent)
  sum_fit_p <-
    sample(1:sum(roullete$rank),size = 1 )
  pindex <-
    roullete %>% 
    filter(cumsum_rank < sum_fit_p) %>%
    nrow()
  p2 <- roullete[pindex + 1,] %>% pull(parent)
  return(population[c(p1,p2)])
}

Position Based Crossover

position_based_crossover <- function(parents, n = 3){
  p1 <- parents[[1]]
  p2 <- parents[[2]]
  length_parent <- length(p1)
  p1 <- p1[2:(length_parent-1)]
  p2 <- p2[2:(length_parent-1)]
  index <- sample(1:(length_parent-2), size = n, replace = FALSE)
  print(index)
  child1 <- p1
  fill_values <- setdiff(p2, p1[index])
  child1[-index] <- fill_values
  return(c(1, child1, 1)) 
}

Probando el position_based_crossover

prueba1 <- list(c(1,2:9,1), c(1,5,4,6,3,9,2,7,8,1))
position_based_crossover(prueba1,4)
[1] 1 7 8 6
 [1] 1 2 5 4 6 3 7 8 9 1

Order Crossover

order_crossover <- function(parents, n = 3){
  p1 <- parents[[1]]
  p2 <- parents[[2]]
  length_parent <- length(p1)
  p1 <- p1[2:(length_parent-1)]
  p2 <- p2[2:(length_parent-1)]
  subs <- sample(1:(length_parent-2), size = 1, replace = FALSE)
  if((subs+(n-1)) > (length_parent-2)){
    index <- c(subs:(length_parent-2))
  }else {
    index <- c(subs:(subs+(n-1)))  
  }
  print(index)
  child1 <- p1
  fill_values <- setdiff(p2, p1[index])
  child1[-index] <- fill_values
  return(c(1, child1, 1)) 
}

Probando el order_crossover

prueba2 <- list(c(1,2:9,1), c(1,5,4,6,3,9,2,7,8,1))
order_crossover(prueba2,4)
[1] 5 6 7 8
 [1] 1 5 4 3 2 6 7 8 9 1

Order Based Crossover

order_based_crossover <- function(parents, n = 3){
  p1 <- parents[[1]]
  p2 <- parents[[2]]
  length_parent <- length(p1)
  p1 <- p1[2:(length_parent-1)]
  p2 <- p2[2:(length_parent-1)]
  index1 <- sample(1:(length_parent-2), size = n, replace = FALSE)
  child <- p2
  dif <- setdiff(child, p1[index1])
  index2 <- match(dif, child)
  child[-index2] <- p1[index1]
  return(c(1, child, 1)) 
}

Probando el order_based_crossover

prueba3 <- list(c(1,2:9,1), c(1,5,4,6,3,9,2,7,8,1))
order_based_crossover(prueba3,4)
 [1] 1 3 5 6 8 9 2 7 4 1

Cycle Crosscover CX

cycle_crossover <- function(parents){
  p1 <- parents[[1]]
  p2 <- parents[[2]]
  length_parent <- length(p1)
  p1 <- p1[2:(length_parent-1)]
  p2 <- p2[2:(length_parent-1)]
  child <- p1
  primer_sample <- sample(p1, size = 1, replace = FALSE)
  sample_actual <- 0
  proto_child <- c(primer_sample)
  sample_index <- match(primer_sample, p1)
  index <- c(sample_index)
  while (primer_sample != sample_actual) {
    sample_actual <- p2[sample_index]
    proto_child <- c(proto_child, sample_actual)
    sample_index <- match(sample_actual, p1)  #devuelve el indice del padre1
    index <- c(index, sample_index)
  }
  proto_child <- proto_child[-length(proto_child)]
  index <- index[-length(index)]
  child[index] <- proto_child
  child[-index] <-  setdiff(p2,proto_child)
  return(c(1, child, 1)) 
}

Probando el cycle_crossover

padre1 <- c(1,2:9,1)
padre2 <- c(1,7,6,8,2,9,5,4,3,1)
prueba4 <- list(padre1,padre2)
cycle_crossover(prueba4)
 [1] 1 2 6 8 5 9 7 4 3 1
LS0tDQp0aXRsZTogIkFsZ29yaXRtb3MgcGFyYSBDcm9zc292ZXIgLSBTaW11bGFjaW9uIDEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyMgUGF1bGEgQ2F6YWxpDQojIyMgMTQwMDAwNjANCg0KYGBge3J9DQpnZW5lcmF0ZV9jaXRpZXMgPC0gZnVuY3Rpb24oY2l0aWVzID01KXsNCiAgcG9zX3ggPC0gc2FtcGxlKDE6MTAwLCBzaXplID0gY2l0aWVzICwgcmVwbGFjZT1UUlVFKSANCiAgcG9zX3kgPC0gc2FtcGxlKDE6MTAwLCBzaXplID0gY2l0aWVzICwgcmVwbGFjZT1UUlVFKQ0KICBvdXQgPC0gZGF0YS5mcmFtZShjaXR5ID0gMTpjaXRpZXMsIHBvc194LCBwb3NfeSApDQogIHJldHVybihvdXQpDQp9DQpgYGANCg0KYGBge3J9DQpkaXN0YW5jZV9yb3V0ZSA8LSBmdW5jdGlvbihyb3V0ZSxkaXN0YW5jZSl7DQogIHN1bV9kaXN0YW5jZTwtMA0KICBmb3IoaSBpbiAxOmxlbmd0aChyb3V0ZVstMV0pKXsNCiAgICBvdXQgPC0gZGlzdGFuY2VbIHJvdXRlW2ldLCByb3V0ZVtpKzFdICBdDQogICAgc3VtX2Rpc3RhbmNlIDwtIHN1bV9kaXN0YW5jZSArIG91dA0KICB9DQogIHJldHVybihzdW1fZGlzdGFuY2UpDQp9DQpgYGANCg0KYGBge3J9DQpzYW1wbGVfcm91dGUgPC0gZnVuY3Rpb24oLi4uLGNpdGllcyA9IDUpew0KICBjKDEsc2FtcGxlKDI6Y2l0aWVzKSwxKSAlPiUgcmV0dXJuKCkNCn0NCmBgYA0KDQpgYGB7cn0NCnNlbGVjdF9tYXRpbmdfcGFyZW50cyA8LSBmdW5jdGlvbiguLi4scG9wX3NpemUsIHJvdWxsZXRlLCBwb3B1bGF0aW9uKXsNCiAgc3VtX2ZpdF9wIDwtDQogICAgc2FtcGxlKDE6c3VtKHJvdWxsZXRlJHJhbmspLCBzaXplID0gMSApDQogIHBpbmRleCA8LQ0KICAgIHJvdWxsZXRlICU+JSANCiAgICBmaWx0ZXIoY3Vtc3VtX3JhbmsgPCBzdW1fZml0X3ApICU+JQ0KICAgIG5yb3coKQ0KICBwMSA8LSByb3VsbGV0ZVtwaW5kZXggKyAxLF0gJT4lIHB1bGwocGFyZW50KQ0KICBzdW1fZml0X3AgPC0NCiAgICBzYW1wbGUoMTpzdW0ocm91bGxldGUkcmFuayksc2l6ZSA9IDEgKQ0KICBwaW5kZXggPC0NCiAgICByb3VsbGV0ZSAlPiUgDQogICAgZmlsdGVyKGN1bXN1bV9yYW5rIDwgc3VtX2ZpdF9wKSAlPiUNCiAgICBucm93KCkNCiAgcDIgPC0gcm91bGxldGVbcGluZGV4ICsgMSxdICU+JSBwdWxsKHBhcmVudCkNCiAgcmV0dXJuKHBvcHVsYXRpb25bYyhwMSxwMildKQ0KfQ0KYGBgDQoNCg0KIyMgUG9zaXRpb24gQmFzZWQgQ3Jvc3NvdmVyDQoNCmBgYHtyfQ0KcG9zaXRpb25fYmFzZWRfY3Jvc3NvdmVyIDwtIGZ1bmN0aW9uKHBhcmVudHMsIG4gPSAzKXsNCiAgcDEgPC0gcGFyZW50c1tbMV1dDQogIHAyIDwtIHBhcmVudHNbWzJdXQ0KICBsZW5ndGhfcGFyZW50IDwtIGxlbmd0aChwMSkNCiAgcDEgPC0gcDFbMjoobGVuZ3RoX3BhcmVudC0xKV0NCiAgcDIgPC0gcDJbMjoobGVuZ3RoX3BhcmVudC0xKV0NCiAgaW5kZXggPC0gc2FtcGxlKDE6KGxlbmd0aF9wYXJlbnQtMiksIHNpemUgPSBuLCByZXBsYWNlID0gRkFMU0UpDQogIHByaW50KGluZGV4KQ0KICBjaGlsZDEgPC0gcDENCiAgZmlsbF92YWx1ZXMgPC0gc2V0ZGlmZihwMiwgcDFbaW5kZXhdKQ0KICBjaGlsZDFbLWluZGV4XSA8LSBmaWxsX3ZhbHVlcw0KICByZXR1cm4oYygxLCBjaGlsZDEsIDEpKSANCn0NCmBgYA0KDQojIyMgUHJvYmFuZG8gZWwgcG9zaXRpb25fYmFzZWRfY3Jvc3NvdmVyDQoNCmBgYHtyfQ0KcHJ1ZWJhMSA8LSBsaXN0KGMoMSwyOjksMSksIGMoMSw1LDQsNiwzLDksMiw3LDgsMSkpDQpwb3NpdGlvbl9iYXNlZF9jcm9zc292ZXIocHJ1ZWJhMSw0KQ0KYGBgDQoNCiMjIE9yZGVyIENyb3Nzb3Zlcg0KDQpgYGB7cn0NCm9yZGVyX2Nyb3Nzb3ZlciA8LSBmdW5jdGlvbihwYXJlbnRzLCBuID0gMyl7DQogIHAxIDwtIHBhcmVudHNbWzFdXQ0KICBwMiA8LSBwYXJlbnRzW1syXV0NCiAgbGVuZ3RoX3BhcmVudCA8LSBsZW5ndGgocDEpDQogIHAxIDwtIHAxWzI6KGxlbmd0aF9wYXJlbnQtMSldDQogIHAyIDwtIHAyWzI6KGxlbmd0aF9wYXJlbnQtMSldDQogIHN1YnMgPC0gc2FtcGxlKDE6KGxlbmd0aF9wYXJlbnQtMiksIHNpemUgPSAxLCByZXBsYWNlID0gRkFMU0UpDQogIGlmKChzdWJzKyhuLTEpKSA+IChsZW5ndGhfcGFyZW50LTIpKXsNCiAgICBpbmRleCA8LSBjKHN1YnM6KGxlbmd0aF9wYXJlbnQtMikpDQogIH1lbHNlIHsNCiAgICBpbmRleCA8LSBjKHN1YnM6KHN1YnMrKG4tMSkpKSAgDQogIH0NCiAgcHJpbnQoaW5kZXgpDQogIGNoaWxkMSA8LSBwMQ0KICBmaWxsX3ZhbHVlcyA8LSBzZXRkaWZmKHAyLCBwMVtpbmRleF0pDQogIGNoaWxkMVstaW5kZXhdIDwtIGZpbGxfdmFsdWVzDQogIHJldHVybihjKDEsIGNoaWxkMSwgMSkpIA0KfQ0KYGBgDQoNCiMjIyBQcm9iYW5kbyBlbCBvcmRlcl9jcm9zc292ZXINCg0KYGBge3J9DQpwcnVlYmEyIDwtIGxpc3QoYygxLDI6OSwxKSwgYygxLDUsNCw2LDMsOSwyLDcsOCwxKSkNCm9yZGVyX2Nyb3Nzb3ZlcihwcnVlYmEyLDQpDQpgYGANCg0KIyMgT3JkZXIgQmFzZWQgQ3Jvc3NvdmVyDQoNCmBgYHtyfQ0Kb3JkZXJfYmFzZWRfY3Jvc3NvdmVyIDwtIGZ1bmN0aW9uKHBhcmVudHMsIG4gPSAzKXsNCiAgcDEgPC0gcGFyZW50c1tbMV1dDQogIHAyIDwtIHBhcmVudHNbWzJdXQ0KICBsZW5ndGhfcGFyZW50IDwtIGxlbmd0aChwMSkNCiAgcDEgPC0gcDFbMjoobGVuZ3RoX3BhcmVudC0xKV0NCiAgcDIgPC0gcDJbMjoobGVuZ3RoX3BhcmVudC0xKV0NCiAgaW5kZXgxIDwtIHNhbXBsZSgxOihsZW5ndGhfcGFyZW50LTIpLCBzaXplID0gbiwgcmVwbGFjZSA9IEZBTFNFKQ0KICBjaGlsZCA8LSBwMg0KICBkaWYgPC0gc2V0ZGlmZihjaGlsZCwgcDFbaW5kZXgxXSkNCiAgaW5kZXgyIDwtIG1hdGNoKGRpZiwgY2hpbGQpDQogIGNoaWxkWy1pbmRleDJdIDwtIHAxW2luZGV4MV0NCiAgcmV0dXJuKGMoMSwgY2hpbGQsIDEpKSANCn0NCmBgYA0KDQojIyMgUHJvYmFuZG8gZWwgb3JkZXJfYmFzZWRfY3Jvc3NvdmVyDQoNCmBgYHtyfQ0KcHJ1ZWJhMyA8LSBsaXN0KGMoMSwyOjksMSksIGMoMSw1LDQsNiwzLDksMiw3LDgsMSkpDQpvcmRlcl9iYXNlZF9jcm9zc292ZXIocHJ1ZWJhMyw0KQ0KYGBgDQoNCiMjIEN5Y2xlIENyb3NzY292ZXIgQ1gNCg0KYGBge3J9DQpjeWNsZV9jcm9zc292ZXIgPC0gZnVuY3Rpb24ocGFyZW50cyl7DQogIHAxIDwtIHBhcmVudHNbWzFdXQ0KICBwMiA8LSBwYXJlbnRzW1syXV0NCiAgbGVuZ3RoX3BhcmVudCA8LSBsZW5ndGgocDEpDQogIHAxIDwtIHAxWzI6KGxlbmd0aF9wYXJlbnQtMSldDQogIHAyIDwtIHAyWzI6KGxlbmd0aF9wYXJlbnQtMSldDQogIGNoaWxkIDwtIHAxDQogIHByaW1lcl9zYW1wbGUgPC0gc2FtcGxlKHAxLCBzaXplID0gMSwgcmVwbGFjZSA9IEZBTFNFKQ0KICBzYW1wbGVfYWN0dWFsIDwtIDANCiAgcHJvdG9fY2hpbGQgPC0gYyhwcmltZXJfc2FtcGxlKQ0KICBzYW1wbGVfaW5kZXggPC0gbWF0Y2gocHJpbWVyX3NhbXBsZSwgcDEpDQogIGluZGV4IDwtIGMoc2FtcGxlX2luZGV4KQ0KICB3aGlsZSAocHJpbWVyX3NhbXBsZSAhPSBzYW1wbGVfYWN0dWFsKSB7DQogICAgc2FtcGxlX2FjdHVhbCA8LSBwMltzYW1wbGVfaW5kZXhdDQogICAgcHJvdG9fY2hpbGQgPC0gYyhwcm90b19jaGlsZCwgc2FtcGxlX2FjdHVhbCkNCiAgICBzYW1wbGVfaW5kZXggPC0gbWF0Y2goc2FtcGxlX2FjdHVhbCwgcDEpICAjZGV2dWVsdmUgZWwgaW5kaWNlIGRlbCBwYWRyZTENCiAgICBpbmRleCA8LSBjKGluZGV4LCBzYW1wbGVfaW5kZXgpDQogIH0NCiAgcHJvdG9fY2hpbGQgPC0gcHJvdG9fY2hpbGRbLWxlbmd0aChwcm90b19jaGlsZCldDQogIGluZGV4IDwtIGluZGV4Wy1sZW5ndGgoaW5kZXgpXQ0KICBjaGlsZFtpbmRleF0gPC0gcHJvdG9fY2hpbGQNCiAgY2hpbGRbLWluZGV4XSA8LSAgc2V0ZGlmZihwMixwcm90b19jaGlsZCkNCiAgcmV0dXJuKGMoMSwgY2hpbGQsIDEpKSANCn0NCg0KYGBgDQoNCiMjIyBQcm9iYW5kbyBlbCBjeWNsZV9jcm9zc292ZXINCg0KYGBge3J9DQpwYWRyZTEgPC0gYygxLDI6OSwxKQ0KcGFkcmUyIDwtIGMoMSw3LDYsOCwyLDksNSw0LDMsMSkNCnBydWViYTQgPC0gbGlzdChwYWRyZTEscGFkcmUyKQ0KY3ljbGVfY3Jvc3NvdmVyKHBydWViYTQpDQpgYGANCg0KDQo=