En un problema de localización se busca encontrar la ubicación óptima de un servicio, o un conjunto de ellos, de forma que la calidad que dicho servicio presta a un conjunto de puntos de demanda sea, según cierta medida, óptima.
Algunos ejemplos de problemas de localización son:
Son numerosos los contextos en los que se plantean problemas de localización, debido a ello la teoría de localización ha sido objeto de gran atención en los últimos años, pudiendo decirse que es un tema de gran actualidad y vigencia. A ello contribuye la aparición de facetas del problema hasta ahora no estudiadas. Por ejemplo, junto a los ya clásicos criterios de minimización de costos, aparecen nuevos criterios: ambientales, sociales, calidad de vida, etc. Estas nuevas vertientes del problema hacen que sea un campo abierto de estudio.
El paquete que se presenta está dedicado a la resolución del problema de localizar un único punto en el plano usando como objetivo la minimización de la suma de las distancias ponderadas a los puntos de demanda. Nuevas versiones del paquete incluirán nuevos modelos de localización.
El paquete RcmdrPlugin.orloca añade algunas opciones al menú de Rcmdr para la resolución de problemas de localización plana. La entrada principal del menú es Orloca y las opciones de dicho menú son:
En las siguientes secciones se describirán detalladamente cada una de estas opciones.
En un problema de localización plana el conjunto de puntos de demanda viene dado por las coordenadas de dichos puntos. Opcionalmente, se puede asignar a dichos puntos una ponderación, que da mayor importancia a unos puntos que a otros, dado que el objetivo que se considera es minimizar la suma ponderada de las distancias entre el punto de servicio y dicho conjunto demandante. Por ejemplo, si se busca la localización de un hospital comarcal, los puntos de demanda pueden ser las localidades a las que el hospital debe atender y las ponderaciones la población de cada localidad.
Para la resolución de estos problemas se ha definido una clase de
objetos designada loca.p
, de forma que un objeto
loca.p
almacena las coordenadas de los puntos de demanda y
las ponderaciones de cada uno de los puntos. Cada objeto
loca.p
tiene tres slots, x
e y
que almacenan las coordenadas y w
que almacena las
ponderaciones. Cuando las ponderaciones no se den de forma explícita, se
considerará que todos los puntos de demanda tienen igual
importancia.
En el resto de esta sección se expondrá la forma de hacer las
operaciones básicas con objetos loca.p
.
Consideremos un problema de localización en el que el conjunto de
puntos de demanda es (0, 0), (4, 0) y (2, 2). Para crear un objeto
loca.p
que represente a dicho conjunto, se seleccionan en
el menú las opciones “Orloca” -> “Nuevo loca.p”, obteniéndose el
diálogo:
Cambiando el nombre y pulsando en “Aceptar” se accede a la ventana
del editor de datos. En la columna x
se introducen los
valores 0, 4, 2 y 0, 0, 2 en la columna y
, y por último,
se introducen tres unos en la columna w
. Al salir del
editor se habrá creado y activado un nuevo conjunto de datos
loca1
que representa un objeto loca.p
.
Las conversiones necesarias entre el tipo data.frame
y
el tipo loca.p
se hacen de forma automática.
Se pueden crear objetos aleatorios de clase loca.p
usando las opciones “Orloca” -> “Nueva instancia aleatoria loca.p”,
obteniéndose el diálogo:
Cambiando los campos del diálogo como se muestra en la figura, se
genera un nuevo objeto loca.p
de nombre loca2
con 100 puntos de demanda con ambas coordenadas entre 0 y 100 y con tres
grupos. Tras pulsar en aceptar en la ventana de instrucciones se
obtiene:
loca2 <- rloca.p(n = 100, xmin = 0, xmax = 10, ymin = 0, ymax = 10, groups = 3)
loca2 <- as(loca2, "data.frame")
El nuevo conjunto de datos activo pasa a ser loca2
y
puede ser visualizado usando el botón “Visualizar conjunto de
datos”.
Se puede obtener un resumen numérico de un objeto
loca.p
. En el resumen se muestran los valores mínimo,
máximo y medio de ambas coordenadas, además de la medias ponderadas de
las coordenadas de los puntos para cada componente.
Activando previamente el conjunto de datos loca1
y
seleccionando “Orloca” -> “Resumen”, se obtiene:
Dado un objeto loca.p
se puede evaluar la distancia
media ponderada desde un punto dado. Así mismo, se puede evaluar el
gradiente de dicha función y se puede resolver el problema de minimizar
dicho objetivo.
La función distancia media ponderada se denomina en el paquete
distsum
. Dado un punto, por ejemplo: (3, 1) para evaluar la distancia media
ponderada a loca1
se elige “Orloca” -> “Evaluación de la
función objetivo del problema de localización de suma ponderada” y se
obtiene el diálogo:
Introduciendo los valores mostrados se obtiene:
distsum(as(loca1, "loca.p") , x = 3, y = 1) # Suma ponderada de las distancias
#> [1] 5.990705
distsumgra(as(loca1, "loca.p") , x = 3, y = 1) # Gradiente de la función suma ponderada de las distancias
#> [1] 0.9486833 0.3162278
Obsérvese que también se ha obtenido el gradiente en dicho punto de la función objetivo.
Para encontrar la solución óptima al problema de localización anterior se selecciona “Orloca” -> “Resolver el problema de localización de suma ponderada”, obteniéndose el cuadro de diálogo:
Y pulsando en “Aceptar” se obtiene:
.sol <- distsummin(as(loca1, "loca.p") , x = 0, y = 0, eps =0.001, algorithm ="Weiszfeld" ) # Resolver el problema de localización minsum
.sol # Muestra la solución
#> [1] 2.00000 1.15332
distsum(as( loca1 , "loca.p") , x = 2.00000022259505 , y = 1.15332010901434 ) # Suma ponderada de las distancias
#> [1] 5.464102
remove(.sol)
Donde se muestra que la solución es el punto (2, 1.15), se evalúa la función en él, resultando un valor de 5.46 y un gradiente practicamente nulo, lo cual indica que el punto es un punto extremo. La solución encontrada es un óptimo local y al ser la función objetivo convexa un óptimo global.
Tanto los objetos loca.p
como la función objetivo pueden
representarse en un gráfico. Para la función objetivo se proporciona una
representación basada en curvas de nivel y otra en un gráfico 3D.
loca.p
La gráfica de un objeto loca.p
consiste en representar
en el plano el diagrama de dispersión del conjunto de puntos de demanda.
Eligiendo “Orloca” -> “Gráficos” -> “Gráfica del conjunto de
puntos de demanda”, se obtiene:
El gráfico de curvas de nivel se realiza eligiendo “Orloca” -> “Gráficos” -> “Gráfica de curvas de nivel de distsum”, obteniéndose:
contour(as(loca1, "loca.p"), main="Gráfica de las curvas de nivel de la función objetivo para loca1")
En el gráfico se puede observar como la función alcanza el mínimo en el punto calculado anterioremente.
Seleccionando “Orloca” -> “Gráficos” -> “Gráficas de demanda y curvas de nivel” se obtienen los dos gráficos anteriores superpuestos:
La norma que se usa por defecto es la norma euclídea o norma l2. Mediante las opciones “Orloca” -> “Opciones” -> “Mostrar/Seleccionar norma” se puede visualizar la norma en uso o elegir una nueva norma dentro de la familia de normas lp. Al elegir dichas opciones del menú se muestra el diálogo:
En dicho diálogo se puede especificar un nuevo valor para p mayor o igual a 1, ya que, de lo contrario lp no sería norma. Todos los cálculos y gráficos se realizaran usando dicha norma hasta que se especifique un valor nuevo o se vuelva a elegir la norma l2. El nuevo gráfico de curvas de nivel es:
Las dos opciones disponibles dentro del menú “Orloca” -> “Ayuda”, a saber, “Ayuda sobre orloca” y “Ayuda sobre RcmdrPlugin.orloca” facilitan el acceso directo a la ayuda de ambos paquetes.
El paquete presentado permite resolver el problema de localización plana de un único servicio con norma lp usando un sistema amigable de menús.