Foro de debate

Calculo de rutas en R

 
Imagen de Rafa Trigo
Calculo de rutas en R
de Rafa Trigo - jueves, 25 de julio de 2019, 14:06
 

Buenas tardes,


Quiza alguien puede echarme una mano con R. Estoy intentando calcular las rutas optimas entre varias ciudades. La idea final es poder optimizar las rutas, incluyendo ciudades intermedias cercanas a la ruta principal hasta la ciudad seleccionada. 


Estoy trabajando con packs como TSP pero no soy capaz de ligar las otras ciudades a la ruta principal, simplemente obtengo el mejor camino para llegar a la ciudad destino.


Por ejemplo, si viajo de Madrid a Berlin, puedo encontrar la ruta optima de camino, pero me gustaria incluir aquellas ciudades de la lista que disten menos de 50 kilometros de dicha ruta optima. 


Espero vuestras respuestas y muchas gracias de antemano.

Imagen de Esteban Murillo Urrego
Re: Calculo de rutas en R
de Esteban Murillo Urrego - jueves, 25 de julio de 2019, 17:32
 

Hola Rafa buenos dias

me gustaría mucho poderte ayudar, lo peor que puede pasar es que aprendamos.

nos puedes compartir tu ejemplo e intentamos algo?

cordial saludo


Imagen de Rafa Trigo
Re: Calculo de rutas en R
de Rafa Trigo - viernes, 26 de julio de 2019, 13:55
 

Gracias por tu respuesta, por supuesto os envío un ejemplo de mi problema:

```

library(ggplot2)

library(tspmeta)


coord=read.csv2("CoordinatesUKExample.txt")

coords.df=data.frame(long=coord$Longitude,lat=coord$Latitude)

coords.mx=as.matrix(coords.df)

dist.mx=dist(coords.df)

tsp.ins <-tsp_instance(coords.mx,dist.mx)

tour=run_solver(tsp.ins,method="2-opt")

autoplot(tsp.ins,tour)

head(coord)

#> Postcode          City Latitude           Longitude

#> 1 AB53 8BJ Aberdeenshire   57.52995 -2.4509960

#> 2 NE46 4SA       Acomb 54.99080 -2.1184036

#> 3 NE66 2HT       Alnwick 55.39723 -1.6900000

#> 4 CA16 6QR       Appleby 54.57808 -2.4929927

#> 5 CA16 6JP        Appleby 54.60883 -2.5188636

#> 6  CO7 7LG        Ardeigh 51.92808           0.9833302


```

Camino optimo

En este caso obtengo una unión optima de todos los puntos. Pero yo quiero detectar que puntos están cerca de la ruta que une los dos puntos principales (ciudades).

 

También he hecho un mapa con Ias ciudades de Reino Unido para hacerlo más fácil de entender. He calculado las distancias reales entre los puntos y creado clusters en función de las distancias entre ellos. En este ejemplo solo hay 10 ciudades aunque en el problema hay más de 80 ciudades diferentes.


```

**library**(gmp)

**library**(cluster)

**library**(raster)


#Geo distance function

geo.dist = function(df) {

  require(geosphere)

  d <- function(i,z){         # z[1:2] contain long, lat

    dist <- rep(0,nrow(z))

    dist[i:nrow(z)] <- distHaversine(z[i:nrow(z),1:2],z[i,1:2])

    return(dist)

  }

  dm <- do.call(cbind,lapply(1:nrow(df),d,df))

  return(as.dist(dm))

}

df     <- data.frame(long=coord$Longitude, lat=coord$Latitude, city=coord$City)

d      <- geo.dist(df)   # distance matrix

hc     <- hclust(d)      # hierarchical clustering

df$clust <- cutree(hc,k=10)


UK <- getData("GADM", country = "GBR", level = 1)

map.df <- fortify(UK)


ggplot(map.df)+

  geom_path(aes(x=long, y=lat, group=group))+

  geom_point(data=df, aes(x=long, y=lat, color=factor(clust)), size=4)+

  scale_color_discrete("Cluster")+

  coord_fixed()

```

He obtenido el siguiente mapa con los puntos a tratar (sin la línea roja):

Mapa con las ciudades de UK

Mi objetivo es ser capaz de decir que si voy desde el punto 1 hasta el punto 7 (línea roja), paso cerca de los puntos 9, 3 y 5, por lo que podrían ser paradas en la ruta.

 

Quizá existe un package para hacerlo más fácil. Yo he visto algo con package que interactúan con google maps pero no he sido capaz de montar un programa con éxito.

  

Si alguien sabe cómo ayudarme seria genial.

 Un saludo y gracias,

 Rafa