Classificação topológica

Em teoria de grafos , e mais especificamente em algoritmos de grafos, uma classificação topológica de um gráfico acíclico direcionado (ou dag , do gráfico acíclico direcionado do inglês ) é uma ordem total no conjunto de vértices, em que s precede t para qualquer arco de um vértice s para um vértice t.

Em outras palavras, uma classificação topológica é uma extensão linear da ordem parcial nos vértices determinados pelos arcos.

Deixe ser um gráfico direcionado com e .

Uma ordem topológica neste gráfico pode dar, por exemplo, a sucessão dos vértices 7, 1, 2, 9, 8, 4, 3, 5, 6. Na verdade, cada vértice aparece bem antes de seus sucessores. Não há exclusividade no pedido.

Algoritmo

Para um grafo representado na memória de uma forma fácil de navegar, por exemplo por listas de adjacência , o cálculo de uma classificação topológica é simples. É suficiente realizar uma navegação em profundidade no gráfico, durante a qual empilham cada vértice uma vez que seus sucessores tenham sido visitados. Ao desempilhar, obtemos uma classificação topológica.

Sem dedicar um procedimento para este processamento (gráficos grandes), podemos reutilizar uma jornada em profundidade já realizada para determinar diretamente uma ordem topológica. Na verdade, a leitura dos vértices na ordem inversa da numeração pós-fixada da rota em profundidade é uma ordem topológica.

Outra forma de proceder é encontrar uma raiz (vértice sem predecessor), removê-la e repetir a operação quantas vezes forem necessárias. Isso é fácil se pudermos calcular facilmente o número de predecessores de um vértice; na verdade, as raízes de uma iteração estão entre as sucessoras das raízes da iteração anterior, e um contador das predecessoras torna possível reconhecê-las.

O algoritmo de classificação topológica de um gráfico funciona no mesmo princípio que o algoritmo de pesquisa em profundidade , adicionando uma noção de data de início e data de término. A ordem topológica no final será os vértices na ordem da matriz de data de término. Começamos com um determinado vértice, então, enquanto possível, “  descemos  ” de nível seguindo os arcos orientados, incrementando a data de início a cada passo, até chegar a um vértice a partir do qual nenhum arco começa. Em seguida, inserimos nossa primeira data de término. Em seguida, "  voltamos  " pelo pai de onde veio e visitamos outros arcos que ainda não foram processados. E repetimos a operação.

Para determinar se um cume foi visto ou não, usando um esquema de cores: branco para "  Não processado  ", cinza para "  Em tratamento  " e preto para "  Tratado  ".

Por exemplo, com o gráfico acima (escrevemos o par startDate / EndDate da seguinte forma: (startDate, endDate)):

Existem várias rotas topológicas para um gráfico, bem como para uma rota de profundidade, que variam de acordo com a direção tomada. No algoritmo a seguir, tratamos os vértices na ordem da lista de filhos de um vértice, ou seja, sempre começando com o elemento à esquerda, mas isso não é obrigatório.

Pseudo-código

Ele se divide em 2 funções:

Algorithme tri_topo (Graphe g) Entrée : Un graphe G =(V,E) orienté non cyclique. Sortie : La liste des sommets dans l'ordre topologique. Variables : listeSommets = [] t = 0 //C'est la variable qui établira les dates d'entrées et sorties. tabCouleur = [] //Le tableau qui indiquera la couleur et donc le traitement d'un sommet. Exécution : Pour i allant de 1 à nbSommets : ajouter(tabCouleur, 0) //On initialise tous les sommets à blancs, soit non traité. Fin Pour; Pour chaque x appartenant à V Faire : Si couleur(x) = Blanc alors : Parcours_Profondeur_Topo(G, listeSommets, x, t) Fin Pour; Afficher(listeSommets) et/ou Retourner(listeSommets) Fin Exécution;

O algoritmo Topo_Depth_Path_Topo (G, verticeslist, x, t):

Algorithme Parcours_Profondeur_Topo(G, listeSommets, x, t) Entrée : Un graphe G =(V,E) orienté non cyclique. La liste des sommets. Le sommet en traitement. La date. Sortie : Les sommets empilés dans l'ordre topologique dans listeSommets. Exécution : couleur(x) = Gris t = t + 1 dateDébut(x) = t Pour chaque y appartenant à Γ+ (x) Faire : //Γ+ (x) est l'ensemble des voisins de x. Si couleur(y) == Blanc alors : Parcours_Profondeur_Topo(G, listeSommets, y, t) Fin Si; Fin Pour; couleur(x) = Noir t = t + 1 dateFin(x) = t //Les dates ne sont pas nécessaires à l'algorithme mais pourraient être utilisées à d'autre fins. empiler(x, listeSommets) Fin Exécution;

Exemplo de código em Python

No código ao lado, as datas de início e término (correspondendo a t acima) não foram implementadas:

O código escrito aqui está em Python, mas usa funções SageMath que permitem modelar gráficos e métodos neles.

Aqui: G.vertices () retorna a lista de vértices do Gráfico G.

e G.neighbours (x) retorna a lista de vértices adjacentes a x.

O Sage também contém outros métodos que podem ser úteis dependendo se o gráfico é orientado ou não, como is_eulerian que determina se um gráfico é euleriano ou não.

Ou is_connected que retorna se um gráfico está conectado ou não.

Exemplo de uso

Link externo

"Ordenação sequencial: ordenação topológica" (versão de 3 de março de 2016 no Internet Archive )

<img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">