forked from dmunguiatec/IC-3002-P2-B
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dominio.py
166 lines (122 loc) · 4.87 KB
/
dominio.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
from abc import ABC
from abc import abstractmethod
from typing import Generic
from typing import List
from typing import TypeVar
T = TypeVar('T')
class Dominio(ABC, Generic[T]):
"""
Representa el objeto de dominio que conoce los detalles de implementación y modelamiento
de algún problema específico para ser resuelto con algoritmos probabilísticos.
Métodos:
generar() -> T
Construye aleatoriamente una estructura de datos que representa una posible
solución al problema.
fcosto(sol: T) -> float
Calcula el costo asociado con una solución dada.
vecino(sol: T) -> T
Calcula una solución vecina a partir de una solución dada.
validar(sol: T) -> bool
Valida que la solución dada cumple con los requisitos del problema.
texto(sol: T) -> str
Construye una representación en hilera legible por humanos de la solución
con el fin de reportar resultados al usuario final.
generar_n(n: int) -> List[T]
Construye aleatoriamente una lista de estructuras de datos que representa n
posibles soluciones al problema.
cruzar(sol_a: T, sol_b: T) -> T
Produce una nueva posible solución cruzando las dos soluciones dadas por parámetro.
mutar(sol: T) -> T
Produce una nueva solución aplicando un ligero cambio a la solución dada por
parámetro.
"""
@abstractmethod
def generar(self) -> T:
"""Construye una estructura de datos que representa una posible solución al problema.
Entradas:
ninguna
Salidas:
Una estructura de datos que representa una posible solución válida al problema
"""
pass
@abstractmethod
def fcosto(self, sol: T) -> float:
"""Calcula el costo asociado con una solución dada.
Entradas:
sol (estructura de datos)
Solución cuyo costo se debe calcular
Salidas:
(float) valor del costo asociado con la solución
"""
pass
@abstractmethod
def vecino(self, sol: T) -> T:
"""Calcula una solución vecina a partir de una solución dada.
Una solución vecina comparte la mayor parte de su estructura con
la solución que la origina, aunque no son exactamente iguales. El
método transforma aleatoriamente algún aspecto de la solución
original.
Entradas:
sol (estructura de datos)
Solución a partir de la cual se calculará una nueva solución vecina.
Salidas:
(estructura de datos) nueva solución construida con base en la solución de la entrada.
"""
pass
@abstractmethod
def validar(self, sol: T) -> bool:
"""Valida que la solución dada cumpla con todos los requerimientos del problema.
Entradas:
sol (estructura de datos)
La solución a validar
Salidas:
(bool) True si la solución es valida, False en cualquier otro caso.
"""
pass
@abstractmethod
def texto(self, sol: T) -> str:
"""Construye una representación en hilera legible por humanos de la solución
con el fin de reportar resultados al usuario final.
Entradas:
sol (estructura de datos)
La solución a transformar en texto legible
Salidas:
(str) El texto legible que representa a la solución.
"""
pass
@abstractmethod
def generar_n(self, n: int) -> List[T]:
"""Construye aleatoriamente una lista de estructuras de datos que representa n
posibles soluciones al problema.
Entradas:
n (int)
Número de soluciones aleatorias a generar.
Salidas:
(list) Lista que contiene n estructuras de datos, cada una representando
una posible solución al problema modelado por el objeto de dominio.
"""
pass
@abstractmethod
def cruzar(self, sol_a: T, sol_b: T) -> T:
"""Produce una nueva posible solución cruzando las dos soluciones dadas por parámetro.
Entradas:
sol_a (estructura de datos)
Estructura de datos que modela la solución antecesora A que será cruzada con la B
sol_b (estructura de datos)
Estructura de datos que modela la solución antecesora B que será cruzada con la A
Salidas:
(estructura de datos) Una nueva solución producto del cruzamiento entre las soluciones A y B
"""
pass
@abstractmethod
def mutar(self, sol: T) -> T:
"""Produce una nueva solución aplicando un ligero cambio a la solución dada por
parámetro.
Entradas:
sol (estructura de datos)
La solución a mutar.
Salidas:
(estructura de datos) Una nueva solución que refleja un ligero cambio con respecto
a la solución dada por parámetro
"""
pass