-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.py
80 lines (63 loc) · 2.96 KB
/
test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import simpy
import random
class Puerto:
def __init__(self, env, nombre, num_cajeros, num_gruas, num_controladores):
self.env = env
self.nombre = nombre
self.cajero = simpy.Resource(env, num_cajeros)
self.grua = simpy.Resource(env, num_gruas)
self.controlador = simpy.Resource(env, num_controladores)
def gestionar_atraque(self, barco):
# Tiempo de llegada al puerto
tiempo_llegada = self.env.now
print(f"{barco.nombre} ha llegado para atracar en {self.nombre} a las {tiempo_llegada}")
# Pago de tarifas portuarias
with self.cajero.request() as solicitud:
yield solicitud
print(f"{barco.nombre} está pagando tarifas en {self.nombre} a las {self.env.now}")
yield self.env.timeout(random.randint(1, 3))
# Revisión de documentación
with self.controlador.request() as solicitud:
yield solicitud
print(f"{barco.nombre} está en revisión de documentación en {self.nombre} a las {self.env.now}")
yield self.env.timeout(1)
# Carga o descarga si se requiere
if random.choice([True, False]):
with self.grua.request() as solicitud:
yield solicitud
print(f"{barco.nombre} comienza carga/descarga en {self.nombre} a las {self.env.now}")
yield self.env.timeout(random.randint(1, 5))
class Ruta:
def __init__(self, puerto_inicio, puerto_destino, duracion):
self.puerto_inicio = puerto_inicio
self.puerto_destino = puerto_destino
self.duracion = duracion
def viajar(self, env, barco):
# Simula el viaje entre el puerto de inicio y el puerto de destino
print(f"{barco.nombre} comienza su viaje de {self.puerto_inicio.nombre} a {self.puerto_destino.nombre} a las {env.now}")
yield env.timeout(self.duracion)
print(f"{barco.nombre} llega a {self.puerto_destino.nombre} a las {env.now}")
yield env.process(self.puerto_destino.gestionar_atraque(barco))
class Barco:
def __init__(self, env, nombre, ruta):
self.env = env
self.nombre = nombre
self.ruta = ruta
def iniciar_viaje(self):
# Inicia el viaje en la ruta especificada
yield self.env.process(self.ruta.viajar(self.env, self))
def simulacion(env):
# Puertos
puerto_a = Puerto(env, "Puerto A", num_cajeros=1, num_gruas=2, num_controladores=1)
puerto_b = Puerto(env, "Puerto B", num_cajeros=1, num_gruas=2, num_controladores=1)
# Rutas entre puertos
ruta_a_b = Ruta(puerto_inicio=puerto_a, puerto_destino=puerto_b, duracion=5)
ruta_b_a = Ruta(puerto_inicio=puerto_b, puerto_destino=puerto_a, duracion=7)
# Barcos que viajan en rutas específicas
for i in range(10):
barco = Barco(env, f"Barco {i}", ruta_a_b if i % 2 == 0 else ruta_b_a)
env.process(barco.iniciar_viaje())
# Simulación
env = simpy.Environment()
simulacion(env)
env.run(until=20)