|
|
@ -7,6 +7,7 @@ Created on Tue Feb 6 19:02:32 2024 |
|
|
|
""" |
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
import numpy as np |
|
|
|
import numpy as np |
|
|
|
|
|
|
|
import math |
|
|
|
import plotly.graph_objects as go |
|
|
|
import plotly.graph_objects as go |
|
|
|
from tqdm.notebook import tqdm |
|
|
|
from tqdm.notebook import tqdm |
|
|
|
import plotly.express as px |
|
|
|
import plotly.express as px |
|
|
@ -116,9 +117,21 @@ class Swimmer(Agent): |
|
|
|
self.ni = ni |
|
|
|
self.ni = ni |
|
|
|
self.sigma = sigma |
|
|
|
self.sigma = sigma |
|
|
|
|
|
|
|
|
|
|
|
# local position within the periodic box. X = [x, z]^T with 0 <= x < 2 pi and 0 <= z < 2 pi |
|
|
|
#obstáculos |
|
|
|
self.X = np.array([np.random.uniform(0, L), np.random.uniform(0, L), 0]) |
|
|
|
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. |
|
|
|
# absolute position. -inf. <= x_total < inf. and -inf. <= z_total < inf. |
|
|
|
self.X_total = self.X |
|
|
|
self.X_total = self.X |
|
|
|
|
|
|
|
|
|
|
@ -148,8 +161,7 @@ class Swimmer(Agent): |
|
|
|
# update coarse-grained state |
|
|
|
# update coarse-grained state |
|
|
|
self.update_state() |
|
|
|
self.update_state() |
|
|
|
|
|
|
|
|
|
|
|
#obstáculos |
|
|
|
|
|
|
|
self.obstacles= self.generate_obstacles() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#distancia entre el swimmer y el obstáculo |
|
|
|
#distancia entre el swimmer y el obstáculo |
|
|
@ -393,7 +405,22 @@ class Swimmer(Agent): |
|
|
|
else: # disminuye 1/8W |
|
|
|
else: # disminuye 1/8W |
|
|
|
self.W[2] -= 1./8*Wc |
|
|
|
self.W[2] -= 1./8*Wc |
|
|
|
return action_index |
|
|
|
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 |
|
|
|
#Define Taylor-Green vortex |
|
|
|
|
|
|
|
|
|
|
@ -594,17 +621,22 @@ print(Q) |
|
|
|
Ns = 5000 |
|
|
|
Ns = 5000 |
|
|
|
spinner = Swimmer(Ns, 1, 1) |
|
|
|
spinner = Swimmer(Ns, 1, 1) |
|
|
|
traj = [] |
|
|
|
traj = [] |
|
|
|
|
|
|
|
|
|
|
|
obstacles = spinner.generate_obstacles() |
|
|
|
obstacles = spinner.generate_obstacles() |
|
|
|
for i in range(Ns): |
|
|
|
for i in range(Ns): |
|
|
|
spinner.interaction_with_obstacles(obstacles, 2.5, 1, 1., 2.5e-4, 10000, 0.001) |
|
|
|
spinner.interaction_with_obstacles(obstacles, 2.5, 1, 1., 2.5e-4, 10000, 0.001) |
|
|
|
traj.append(spinner.X[0]) |
|
|
|
traj.append(spinner.X[0]) |
|
|
|
traj.append(spinner.X[1]) |
|
|
|
traj.append(spinner.X[1]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spinner.periodic_boundaries() |
|
|
|
|
|
|
|
|
|
|
|
action_index = spinner.take_greedy_action(Q) |
|
|
|
action_index = spinner.take_greedy_action(Q) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spinner.update_state() |
|
|
|
spinner.update_state() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#print("Mi estado", spinner.my_state) |
|
|
|
#print("Mi estado", spinner.my_state) |
|
|
|
#print("Valor de Wz después de tomar la acción:", spinner.W[2]) |
|
|
|
#print("Valor de Wz después de tomar la acción:", spinner.W[2]) |
|
|
|
|
|
|
|
|
|
|
@ -616,5 +648,4 @@ print(obstacles[::2]) |
|
|
|
plt.show() |
|
|
|
plt.show() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#comprobación de que W va cambiando |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|