-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexact_solution.py
55 lines (47 loc) · 1.89 KB
/
exact_solution.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
import itertools
def is_dominating_set(graph, candidate_set):
"""
Verifica si el conjunto candidato es un conjunto dominante para el grafo.
---
:param graph: Un diccionario que representa el grafo.
:param candidate_set: Conjunto candidato para ser evaluado.
:return: True si el conjunto candidato es dominante, False en caso contrario.
"""
dominated = set(candidate_set)
for node in candidate_set:
dominated.update(
graph[node]
) # Añadir los vecinos del nodo al conjunto dominado
return len(dominated) == len(graph)
def find_minimum_dominating_set(graph):
"""
Encuentra el conjunto dominante mínimo utilizando una búsqueda por tamaño creciente de subconjuntos.
---
:param graph: Un diccionario que representa el grafo.
:return: El conjunto dominante mínimo encontrado.
"""
nodes = list(graph.keys())
# Probar subconjuntos de tamaño creciente, desde 1 hasta len(nodes)
for size in range(1, len(nodes) + 1):
# Generar todos los subconjuntos de tamaño 'size'
for subset in itertools.combinations(nodes, size):
if is_dominating_set(graph, subset):
return list(
subset
) # Retornar la primera solución encontrada (que será la mínima)
return nodes # En el peor caso, retornar todos los nodos (caso donde todo el grafo es el conjunto dominante)
if __name__ == "__main__":
# Ejemplo
graph = {
"A": ["B", "H"],
"B": ["A", "C", "H"],
"C": ["B", "D", "E", "F", "H"],
"D": ["C", "F", "G"],
"E": ["C", "F"],
"F": ["C", "D", "E", "G"],
"G": ["D", "F", "H"],
"H": ["A", "B", "C", "G"],
}
# debe retornar o ["H", "F"] o ["A", "F"]
minimum_dominating_set = find_minimum_dominating_set(graph)
print(f"Conjunto dominante mínimo: {minimum_dominating_set}")