3. QL 1 dron 2 puntos - alvvazort/AIDrone GitHub Wiki

Introducción

Se plantea el problema inicial partiendo de 2 puntos que tendrán que ser supervisados por 1 dron.

Preconfiguración

Realizar la preconfiguracón descrita en el apartado MDP 2 puntos.

Ejecución

Para la ejecución, deberemos tener una terminal apuntando a la carpeta Firmware donde ejecutaremos el siguiente código:

./Tools/simulation/gazebo/sitl_multiple_run.sh -n 1 -w baylands

Esto abrirá Gazebo con un dron en un mapa de un parque (Baylands Park, California), además, si abrimos QGroundControl podremos ver que las coordenadas de ese parque corresponden con las reales.

Apuntando a la carpeta wildfire de nuestro repositorio y ejecutamos el archivo wildfire_q-learning.py. Al ejecutar el archivo, se conectará al dron, iniciará una función de recompensa y empezará un entrenamiento, en caso de que no exista uno previo, o continuará el anterior entrenamiento de q-learning y aprenderá mientras está en funcionamiento, que debe y que no debe hacer dependiendo del estado en el que se encuentre.

Para ello, el algoritmo crea una tabla de valores llamada q_values, la cual guarda una puntuación obtenida por las ecuaciones de Bellman, por cada acción que haga en cada estado. El algoritmo cada vez que toma la decisión de qué acción debe tomar, tiene la posibilidad de o realizar una fase de explotación o una de exploración, siendo la opción de explotación la más probable (en nuestro caso 90%). En el caso de explotación, va a ejecutar la acción con mayor puntuación, siendo esta la acción que en ese momento se ha calculado que tendrá una mayor recompensa en un futuro cercano. Para que descubra y calcule nuevas acciones en cada estado, debe existir la probabilidad de que realice la fase de exploración, que de manera aleatoria realizará una acción y calculará la puntuación de haber tomado esa acción.

Si es la primera vez que ejecutamos el entrenamiento se creará un archivo “q_values.json” donde se almacenará y se actualizará por cada época los valores de la tabla q_values. En caso de que exista un entrenamiento anterior se cargaran los datos correspondientes. En las primeras iteraciones del entrenamiento podremos ver en Gazebo y QGroundControl como el dron se queda cargando batería aunque esté al 100%, ya que no conoce el rendimiento de las otras acciones, por lo que lo más probable es que se quede cargando ya que es su primera opción. Esto se repetirá hasta que de manera pseudoaleatoria con un 10% de posibilidades ejecute la fase de exploración. Entonces de manera aleatoria escogerá una acción y calculará la puntuación de haber realizado esa acción. Es así como descubrirá que en el punto A, cuando se queda vigilando es recompensado o que no existe recompensa por viajar hacia el punto de carga estando ya allí. De esta manera se quedará vigilando el punto A al ser lo más eficiente hasta que quede sin batería. El dron será penalizado altamente y volverá a PC para cargar la batería al 100% y volver a empezar. Para la próxima iteración habrá aprendido que no debe quedarse vigilando hasta quedar sin batería y actuará de otra forma posible, la otra opción posible es volver a PC que aunque no le otorgue recompensa, le permite seguir actuando y obtener una recompensa mayor en un futuro.

Funcionamiento

Como hemos visto, el algoritmo guarda en q_value puntuaciones de las acciones de cada estado basándose en las recompensas que recogerá cuando escoge realizar esa acción, para actualizar este q_value, se utilizan las fórmulas de Bellman que veremos a continuación:

new_q_value = old_q_value + (LEARNING_RATE * temporal_difference)

Siendo old_q_value el antiguo valor que se encuentra para una determinada acción y estado en la tabla q_values (current value), α la tasa de aprendizaje que en nuestro proyecto es 0.9 y temporal_difference la diferencia del estado más óptimo futuro y el valor actual más la recompensa. Más específicamente:

temporal_difference = reward + (DISCOUNT_FACTOR *np.max(Wildfire.q_values[status])) - old_q_value

Siendo reward la recompensa para un determinado estado, siendo para el estado “M” (muerto) uno con una recompensa extremadamente negativa y para el estado “AX” positiva (Siendo X uno de los estados posibles de la batería). ɣ ó la tasa de descuento es un valor que recorre el rango (0,1] y permite al algoritmo centrarse en un futuro más cercano, en nuestro caso el valor de ɣ es de 0.9. El valor maxQ(s,a) se corresponde con el valor máximo de la tabla q_values para un determinado estado futuro y old_q_values obtiene el mismo valor que el old_q_values anteriormente mencionado.