Skip to content

Instantly share code, notes, and snippets.

@RicardoLara
Last active May 16, 2016 03:23
Show Gist options
  • Select an option

  • Save RicardoLara/b71f3cd9d913dac470a604f342ca5624 to your computer and use it in GitHub Desktop.

Select an option

Save RicardoLara/b71f3cd9d913dac470a604f342ca5624 to your computer and use it in GitHub Desktop.
Desarrollo y Pseudocódigo del Algoritmo de Ruteo
Algoritmo (V2)
Consta de 2 partes:
- P1: La forma de encolar los pedidos y la hora en que los motonetos salen.
- P2: La forma en que se van a realizar los pedidos (Las rutas).
Notas:
El sistema de motos, asi como el de pizzas en espera van a ser -> COLAS <-
El sistema de las rutas es una -> LISTA <-
Desarrollo:
Proceso principal de la Parte 1:
Este proceso se ejecutara en 2 casos:
- Si se cambia el estado de una pizza a "Lista para salir".
- Si llega un repartidor (Que regrese de repartir).
Una vez verificado, proseguimos a otra comprobacion (Y aquí es donde está lo importante):
- Si no hay motos -> Quiere decir que no hay repartidores disponibles.
- Si hay una pizza lista para salir -> Hay un problema, porque no hay repartidores.
- Entonces, pongo la pizza "En espera" -> Es decir, la guardo para que cuando llegue un repartidor se le asigne.
- Si hay motos -> Si alguien acaba de llegar o que haya motos disponibles, de igual manera, hay motos.
- Si hay pizzas en espera -> Quiere decir que hay pedidos pendientes
- Mientras la moto no esté llena ó haya pizzas en espera -> Lo que pase primero
- Pasar pizzas a la moto -> O se llena la moto, o se acaban los pedidos pendientes
En este punto puede que la moto no este llena, por lo que si no esta llena y se PUEDEN meter mas pedidos, se hace
Con PUEDE nos referimos a que quepan pedidos a la moto siempre y cuando la moto no tenga que salir
Para saber si la moto tiene que salir se toman en cuenta la hora del pedido, el tiempo de recorrido y la hora maximade entrega
- Mientras la moto no este llena ó el repartidor ya tiene que salir
- Si hay una pizza lista para salir -> Deberia entrar a la moto
- Pasar pizza a la moto -> Pizza guardada
- Salida del repartidor -> Con el ciclo anterior aseguramos la maxima capacidad de la moto o el hecho de que tiene que salir, por lo tanto, sale
- Si hay una pizza lista para salir y hay una moto vacia -> Sucede si hay una pizza lista y hay alguna moto libre
- Pasar pizza a la moto -> Esto se hace por separado ya que es el primer pedido en la moto
- Mientras la moto no este llena ó el repartidor ya tiene que salir
- Si hay una pizza lista para salir -> Deberia entrar a la moto
- Pasar pizza a la moto -> Pizza guardada
- Salida del repartidor -> Con el ciclo anterior aseguramos la maxima capacidad de la moto o el hecho de que tiene que salir, por lo tanto, sale
Proceso principal de la Parte 2:
Este proceso se ejecuta una vez que el repartidor salio
- Si se oprime boton de Salida o boton de Entregada -> Salida es cuando el repartidor sale de la sucursal, entregada cuando se entregó un pedido
- Mejor_destino = siguiente_destino -> Se dice por diseño que el mejor lugar al que tiene que ir el repartidor es el siguiente destino, es decir, la direccion de la siguiente pizza
- Si es el primer pedido -> Para saber si reordenamos o no
- Entregar pedido
- Si no es el primer pedido -> Se puede reordenar
-Si hay mas de 1 ruta
- Tomar la siguiente direccion
En la instruccion anterior Tomar la siguiente direccion quiere decir que, las direcciones estan en una lista, y se va a tomar la siguiente despues de la actual
Es decir: A B C D <- Lista de rutas. A es Mejor_destino y B es la siguiente direccion
- Iniciar T en 31 -> Variable usada para agarrar la mejor opcion, se pone en 31 porque ningun pedido debe tardar mas de 30
- Mientras haya rutas <- Para comparar con todas
- Calcular tiempo entre la posicion actual del repartidor y la direccion que estoy viendo -> Ya que con el ciclo vamos a ver todas las direcciones
- Sumarle a ese tiempo el tiempo entre la direccion que estoy viendo y el siguiente destino en la lista -> NO EL MEJOR, si no el siguiente, ya que tiene mayor prioridad el sig
- Si el tiempo calculado + hora actual es menor a la hora de entrega y tiempo calculado es menor a T -> Si es la mejor opcion que he encontrado
- Mejor_destino = ruta que estoy viendo -> La mejor ya no es la sig, si no la que estoy viendo, ya que da tiempo de hacer los dos pedidos
- T = tiempo calculado -> Menor tiempo para T, se cambia para ver si hay una mejor opcion
- Si Mejor_destino es distindo a siguiente_destino -> Quiere decir que encontré una opcion de entrega
- Mover la lista -> Es decir, poner Mejor_destino como sig_dstino, sig_dstino despues de Mejor_destino, y mover el anterior de Mejor_destino antes de moverlo
- Entregar pedido -> Porque ya tiene la mejor ruta posible
Pseudocódigo:
Parte 1:
si ( cambiaEstado ó llegaMoto )
si ( noHayMotos )
si ( haypedidoListo )
pizzasEnEspera(pedidoListo)
si no{
si ( hayPizzasEnEspera ){
mientras( motoNoLlena ó hayPizzasEnEspera)
pasarALaMoto()
mientras ( motoNoLlena ó horaAct < TMSdeMoto() )
si( pedidoListo )
meterAMoto(pedidoListo)
saleMoto()
}
si ( haypedidoListo && motoVacia )
meterAMoto(pedidoListo)
mientras ( motoNoLlena ó horaAct < TMSdeMoto() )
si( pedidoListo )
meterAMoto(pedidoListo)
saleMoto()
}
Parte 2:
si (oprimiBoton){
mejor = destinoMoto_direccion
si ( primeraVez )
viaje(mejor)
si no{
si ( rutas.size > 1){
aux = destinoMoto -> siguiente
tiempo = 31
mientras ( aux != MotoFinal ){
k = t_dist(actual, aux_direccion)
k += t_dist(aux_direccion, destinoMoto_direccion)
si (k < tiempo y hora_act + k < destinoMoto_TME){
mejor = aux;
tiempo = k;
}
}
si ( mejor != destinoMoto_direccion ){
ant_mejor -> sig_mejor
sig_mejor = destinoMoto -> siguiente
destinoMoto -> siguiente = mejor
}
}
viaje(mejor)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment