5. QL N drones M puntos - alvvazort/AIDrone GitHub Wiki

Introducción

Se plantea el problema inicial partiendo de N puntos que tendrán que ser supervisados por M drones.

Preconfiguración

Realizar la preconfiguración descrita en el apartado MDP 2 puntos) para cada dron en QGroundControl.

Si queremos establecer el número de puntos (Sin contar el punto de carga PC), deberemos cambiar la constante NUMPOINTS y NUMDRONES en el archivo “wildfire_q-Learning_MP_ND.py” por los valores de puntos y drones que deseemos. Esto creará un .json específico con los valores de la tabla q_values según el número de puntos y drones especificado, de tal forma que si cambiamos la cantidad de puntos se creará un nuevo .json y se mantendrá el entrenamiento anteriormente ejecutado para poder ser ejecutado posteriormente. Cada archivo tendrá por nombre "q_values_NP_MD.json".

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 M -w baylands Siendo M el número de drones

Esto abrirá Gazebo con M drones 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_MP_ND.py”. Al ejecutar el archivo, se conectará al dron, inicializará los puntos, los tiempos en los que han sido vigilado cada punto, la tabla q_values, y demás datos necesarios. Tras ello, 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.

Como se mencionó en el anterior modelo, 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 con el número de puntos que hayas especificado, se creará un archivo “q_values_MP_ND.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 los N drones se queda cargandon batería aunque estén al 100%, ya que no conocen 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 posibilidad 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án que en los puntos de interés, si actúan en ellos son recompensados o que existe recompensa negativa por viajar hacia el punto donde se encuentren individualmente. De esta manera se quedarán vigilando algún punto al ser lo más eficiente hasta que se queden sin batería o descubran de nuevo mediante la fase de exploración que, ir a otro punto que lleva más tiempo sin vigilar les recompensa más. Aunque lo que más le recompensará será actuar en 2 puntos distintos no vigilados por un periodo de tiempo. Los drones serán penalizados altamente por quedarse sin batería y en el caso en el que todos se hayan quedado sin autonomía, volverán a PC para cargar la batería al 100% y volver a empezar una nueva época. Para la próxima iteración habrán aprendido que no deben quedarse vigilando hasta quedar sin batería y actuarán de otra forma posible. Trás varias épocas aprenderán que volver a PC aunque no le otorgue recompensa, les permite seguir actuando y obtener una recompensa mayor en un futuro. Además, aprenderán que viajar y actuar en distintos puntos les otorgará una mayor recompensa cuanto más tiempo estén sin ser vigilados.

Funcionamiento

En este contexto, nos encontramos con múltiples drones y múltiples puntos y para poder establecer la comunicación entre el código y cada vehículo se necesita inicializar un servidor por cada drone. Estos servidores son lanzados cada vez que ejecutamos el código, abriéndose en nuestro ordenador tantas terminales como número de drones se haya indicado.

Además las variables necesarias para el aprendizaje de este modelo, se ven alteradas ya que a medida que el número de puntos o drones aumenta, la dimensión de nuestro problema aumenta en la misma forma, provocando un aumento exponencial en estados, acciones, rewards y demás variables usadas.

q_values

En esta imagen, se puede ver una entrada (que corresponde a un estado) de la gran tabla q_values, en ella, se guarda una lista en la que cada elemento corresponde a la puntuación de cada acción que podría tomarse. Como se puede observar, la magnitud de estados y acciones aumenta exponencialmente a medida que se aumenta el número de puntos y sobre todo, el número de drones.

Por este motivo se ha automatizado la creación de todas las variables necesarias para el problema en función del número de drones. Para la creación de estas, hemos hecho uso de funciones matemáticas relacionadas con la combinatoria. En nuestro caso, como sí importa el orden y también las repeticiones, la combinación de estados es el número de drones elevado a la cantidad de estados posibles lo que permite que exista una entrada para cada posible situación de cada dron. De la misma forma, las acciones permitidas se calculan como la combinación de acciones posibles por un dron elevado por el número de drones.

Además se han paralelizado todas las acciones relacionadas con el inicio, funcionamiento y fin de la vida de un dron, para así conseguir un código mucho más eficaz y eficiente permitiendo que varios drones puedan hacer diferentes acciones sin la necesidad de esperar uno a otro.

Para este problema, se ha creado una función de recompensa que se calcula en el momento que el último drone termina de realizar su acción. Esta función corrige el aprendizaje en varios casos, por ejemplo, si uno de los drones está en el punto X y viaja de nuevo al punto X es penalizado.También, se recompensa actuar en un punto de vigilancia, pero se recompensa aún más según la proporción del tiempo que lleve sin ser monitorizado este punto. De la misma forma se incentiva vigilar un punto incendiado, aunque si actúa continuamente en ese punto no se le proporcionará el extra de recompensa por estar en un punto incendiado. Las acciones, como hemos comentado con anterioridad las realiza paralelamente todos los drones, es por eso que es común que varios drones realicen la misma acción en un mismo punto, en este caso únicamente se le otorgará una recompensa como si un único dron fuese quien hubiese realizado dicha acción. Esto hará que a todos los drones les interese ir vigilando diferentes puntos y viajar a otros para así tener una monitorización más general de la zona.

Todas las acciones, estados, recompensas obtenidas y matrices del mapa son recopiladas durante el entramiento en logs, estos permitirán al usuario poder recopilar información relativa o errores producidos.

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 actualizada para un determinado estado, siendo por ejemplo para el estado “M-M” (muerto 2 drones) uno con una recompensa extremadamente negativa y para el estado “AX-BY” positiva (Siendo X e Y 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.

⚠️ **GitHub.com Fallback** ⚠️