Last active
May 16, 2016 03:23
-
-
Save RicardoLara/b71f3cd9d913dac470a604f342ca5624 to your computer and use it in GitHub Desktop.
Desarrollo y Pseudocódigo del Algoritmo de Ruteo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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