summaryrefslogtreecommitdiff
path: root/ero1/src/drone/couverture_sommets.py
blob: 80a1fe6020f6cd522d09ef882150fc94a4c7d8df (plain)
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
from src.helper.debug_printer import debug_print
import parameters as params
import networkx as nx

def vertex_cover_glouton(graph):
    """
    Renvoie un ensemble de sommets couvrant toutes les arêtes du graphe.
    Approche gloutonne.
    """
    G = graph.copy()
    cover = set()

    while G.number_of_edges() > 0:
        u = max(G.degree, key=lambda x: x[1])[0] # Max degree
        cover.add(u)
        G.remove_node(u)

    return cover

def get_snowed_edges(graph, cover_nodes, snow_min, snow_max):
    """
    Retourne les arêtes enneigées couvertes par les sommets sélectionnés.
    """
    snowy_edges = []
    no_snowy_edges = []

    for u, v, key in graph.edges(keys=True): # toutes les arretes du graphe
        if u in cover_nodes or v in cover_nodes: 
            data = graph.get_edge_data(u, v, key)
            if 'snow' in data and snow_min <= data['snow'] <= snow_max:
                snowy_edges.append((u, v, key))
            else:
                no_snowy_edges.append((u, v, key))

    return (snowy_edges, no_snowy_edges)

def vertex_cover(graph, debug_mode=False):
    """
    Stratégie :
    Trouver un ensemble minimum de sommets pour couvrir toutes les arêtes.
    """
    debug_print(f"Passage du graphe en mode : undirected", debug_mode)
    graph = nx.to_undirected(graph)

    # debug_print(f"List Sommets total : {graph.nodes}", debug_mode)
    # debug_print(f"List Routes total : {graph.edges}", debug_mode)
    debug_print(f"Nombre de sommets total : {len(graph.nodes)}", debug_mode)
    debug_print(f"Nombre de routes total : {len(graph.edges)}", debug_mode)

    debug_print("Calcul de la couverture par sommet ...", debug_mode)
    nodes = vertex_cover_glouton(graph)
    debug_print(f"Nombre de sommets sélectionnés : {len(nodes)}", debug_mode)

    snowy_edges = get_snowed_edges(graph,
                                    nodes,
                                    params.SNOW_THRESHOLD,
                                    params.SNOW_MAX)

    return snowy_edges