From be48f3040148fd4e2f634fd4f8e3de05137f083f Mon Sep 17 00:00:00 2001 From: marta Date: Wed, 13 Mar 2024 11:48:21 +0100 Subject: [PATCH] codigo actualizado --- .../Reinforce_Learning.py | 43 ++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/Documentos/TFG_Machine_Learning/Reinforce_Learning.py b/Documentos/TFG_Machine_Learning/Reinforce_Learning.py index 2c31b41..d38c9bb 100644 --- a/Documentos/TFG_Machine_Learning/Reinforce_Learning.py +++ b/Documentos/TFG_Machine_Learning/Reinforce_Learning.py @@ -7,6 +7,7 @@ Created on Tue Feb 6 19:02:32 2024 """ import numpy as np +import math import plotly.graph_objects as go from tqdm.notebook import tqdm import plotly.express as px @@ -116,9 +117,21 @@ class Swimmer(Agent): self.ni = ni self.sigma = sigma - # local position within the periodic box. X = [x, z]^T with 0 <= x < 2 pi and 0 <= z < 2 pi - self.X = np.array([np.random.uniform(0, L), np.random.uniform(0, L), 0]) - + #obstáculos + self.obstacles= self.generate_obstacles() + + #Condición inicial para el swimmer + valid_initial_position = False + while not valid_initial_position: + self.X = np.array([np.random.uniform(0, L), np.random.uniform(0, L), 0]) + valid_initial_position = True + # Comprobamos si esta inicialmente esta dentro de un obstáculo + for i in range(len(self.obstacles)//2): + obstacle_position = np.array([self.obstacles[2*i], self.obstacles[2*i+1], 0]) + if np.linalg.norm(self.X - obstacle_position) < 0.5*self.sigma: + valid_initial_position = False + break + # absolute position. -inf. <= x_total < inf. and -inf. <= z_total < inf. self.X_total = self.X @@ -148,8 +161,7 @@ class Swimmer(Agent): # update coarse-grained state self.update_state() - #obstáculos - self.obstacles= self.generate_obstacles() + #distancia entre el swimmer y el obstáculo @@ -393,7 +405,22 @@ class Swimmer(Agent): else: # disminuye 1/8W self.W[2] -= 1./8*Wc return action_index + + def periodic_boundaries(self, isxperiodic=True, isyperiodic=True, iszperiodic=True): + + offset = [math.floor(-self.X[0] * 1/L + 0.5), + math.floor(-self.X[1] * 1/L + 0.5), + 0] + + if isxperiodic: + self.X[0] += offset[0] * L + if isyperiodic: + self.X[1] += offset[1] * L + if iszperiodic: + self.X[2] += offset[2] * L + return self.X + #Define Taylor-Green vortex @@ -594,17 +621,22 @@ print(Q) Ns = 5000 spinner = Swimmer(Ns, 1, 1) traj = [] + obstacles = spinner.generate_obstacles() for i in range(Ns): spinner.interaction_with_obstacles(obstacles, 2.5, 1, 1., 2.5e-4, 10000, 0.001) traj.append(spinner.X[0]) traj.append(spinner.X[1]) + + spinner.periodic_boundaries() action_index = spinner.take_greedy_action(Q) spinner.update_state() + + #print("Mi estado", spinner.my_state) #print("Valor de Wz después de tomar la acción:", spinner.W[2]) @@ -616,5 +648,4 @@ print(obstacles[::2]) plt.show() -#comprobación de que W va cambiando