Chemin le plus long

TBD à réordonner. Mettre avec Hamilton 2 ?

Ca où on sait faire :

  • arbres
  • acyclique pour chemin le plus long : et conséquence inattendue sr le BTP (pb d'ordonnancements. Aussi DFS !)

Cas particulier métrique et complet

  1. pas simple : exhaustif avec backtrack + branch and bound

Ordonnancement

TBD DFS et Problème d’ordonnancements

TBD tri topologique dans un DAG avec un DFS + à la visite ajoute en fin de liste. Ensuite on regarde la liste à l'envers

Un problème d'ordonnancement peut se modéliser par un DAG nommé graphe de dépendances où si $xy$ est une arête alors il faut faire $x$ avant de pouvoir faire $y$.

Pourquoi ne doit-il pas y avoir de cycles dans un graphe de dépendance ?

solution

Il est clair que s'il y a un cycle on ne peut réaliser le projet.

Vous résolvez des problèmes d'ordonnancement tous les jours comme par exemple comment s'habiller le matin (voir graphe ci-après)

habillage

Montrer que le tri topologique est une solution au problème d'ordonnancement. Appliquez le au problème de s'habiller le matin.

solution

De plus un tri topologique fait que lorsque l'on s'attelle à la tache $v_i$ on a déjà fait tous ses prédécesseurs (ses prés-requis).

C'est encore un exemple où les contraintes sont locales et ou l'on cherche une solution globale.

NP-complétude

TBD Chemin le plus long ≥ chemin hamiltonien

Formalisons les problèmes du cycle hamiltonien dans ses versions orienté et non orienté :

Problème

  • Nom : cycle (resp. circuit) hamiltonien
  • Entrée : Un graphe (resp. graphe orienté) $G$
  • Question : $G$ possède-t-il un cycle hamiltonien ?

Et faisons de même pour les chemins hamiltonien dans ses versions orienté et non orienté :

Problème

  • Nom : chemin (resp. chemin orienté) hamiltonien
  • Entrée : Un graphe (resp. graphe orienté) $G$
  • Question : $G$ possède-t-il un chemin hamiltonien ?

Les quatre problèmes ci-dessus sont clairement des problèmes de décisions de NP. Nous allons montrer qu'ils sont NP-complet par des réduction depuis le problème 3-SAT.

Chemin orienté hamiltonien

Pour transformer une instance de 3-SAT en une instance de recherche d'un chemin hamiltonien dans un graphe, il faut :

Nous allons appliquer la réduction à l'exemple du problème 3-SAT.

Encodage des variables

Chaque variable est encodé par le sous-graphe suivant :

encodage des variables

Il possède uniquement deux chemins passant par tous les sommets :

Le graphe de toutes les variables est composé de l'union de tous ces graphes. Pour l'exemple cela donne :

encodage des variables exemples

Il possède $2^5$ chemin hamiltoniens selon que l'on passe par le chemin vrai ou le chemin faux pour chaque variable.

Encodage des clauses

On encode chaque clause $c_i = l_i^1 \lor l_i^2 \lor l_i^3$ par un sommet $c_i$ que l'on ajoute au graphe des variables et tels que ses voisins sont, pour $1\leq k \leq 3$ :

encodage des clauses

Le graphe complet de l'exemple est :

encodage des variables exemples

Satisfiabilité

Si la conjonction de clause est satisfiable, il existe un chemin hamiltonien passant pas les chemins vrais des variables vraies, les chemins faux des variables fausses et passant par chaque clause pour un des littéral vrai de la clause. Pour l'exemple :

Une solution

Réciproquement s'il existe un chemin hamiltonien :

Notez que pour un chemin hamiltonien, si $v^j_ic_i$ est un arc (resp. $f^j_ic_i$), alors $c_iu^j_i$ en est un aussi, sinon $f^j_i$ (resp. $v^j_i$) ne peut être atteint. Cette construction justifie le fait que la clause est satisfaite pour un de ses littéraux (ceci montre qu'il faut 3 sommets v, f et u pour cette construction et qu'on ne peut s'en sortir qu'avec des sommets v et f).

On en conclut :

Proposition

Le problème de recherche d'un chemin hamiltonien dans un graphe dirigé est NP-complet.

Circuit orienté hamiltonien

La précédente preuve s'applique de manière identique pour la recherche d'un circuit hamiltonien en ajoutant un arc de $y_n$ à $y_0$. On en conclut :

Proposition

Le problème de recherche d'un circuit hamiltonien dans un graphe dirigé est NP-complet.

Cycle et chemins hamiltonien

On va montrer ici que la recherche d'un chemin (resp. circuit) hamiltonien dans un graphe orienté est équivalent à chercher un chemin (resp. cycle) hamiltonien dans un graphe. Pour cela on va associer à tout graphe dirigé un graphe.

On effectue la transformation suivante, pour chaque sommet du graphe orienté :

Arc orienté initial

On en associe 3 dans le graphe non orienté associé, permettant de séparer les arcs entrant des arcs sortants :

Arêtes non orientées

Il est alors évident que si le graphe non orienté a un chemin (resp. cycle) hamiltonien, alors le graphe orienté possède également un chemin (resp. circuit) hamiltonien. La réciproque est aussi trivialement vrai ce qui montre que les problèmes orientés ou non orientés sont équivalent.

Chemin le plus long

La NP-complétude des chemins et cycles hamiltoniens nous permet de conclure qu'il est illusoire de tenter de trouver un algorithme efficace pour résoudre le problème du chemin le plus long :

Problème

  • Nom : chemin le plus long
  • Entrée : Un graphe (resp. graphe orienté) $G$
  • Sortie : Un chemin élémentaire le plus long possible.

Résoudre ce problème revient en effet clairement à résoudre le problème du chemin hamiltonien.

Montrer que si l'on pouvait résoudre le problème d'un chemin le plus long dans un graphe, on pourrait résoudre le problème du chemin hamiltonien.

solution

Le plus long chemin élémentaire possible dans un graphe passe par tous les sommets. Donc un chemin élémentaire de longueur $\vert V \vert -1$ est hamiltonien.

Notez comment une petite différence — remplacer sommet (hamiltonien) par arête (eulérien) — rend un problème soit très simple soit très compliqué à résoudre.

Il existe un cas où trouver un chemin le plu long est facile : dans les graphes orientés qui ne contiennent pas de circuit (souvent appelé DAG, direct acyclic graph).

On appelle tri topologique d'un graphe orienté $G = (V, E)$ un ordre total $<$ sur les sommets du graphe tel que $xy \in E$ implique $x < y$ dans l'ordre.

Montrer que :

  1. un graphe orienté ne peut admettre de tri topologique que s'il n'a pas de cycle
  2. pour un DAG, il existe toujours un sommet qui n'a pas de voisins entrant (resp. sortant)
  3. en déduire qu'un DAG admet un tri topologique
  4. conclure sur le fait qu'un graphe est un DAG si et seulement s'il admet un tri topologique

solution

1 :

Soit $c_0\dots c_k$ un cycle ($c_k = c_0$), quelque soit l'ordre total entre les sommets du graphe, il existe $i$ tel que $c_{i+1} < c_i$ ce qui est impossible si un tel ordre était topologique.

2 :

Supposons que tout sommet d'un DAG admette un voisin entrant et un voisin sortant, et prenons une arête $x_0x_1$ de ce graphe. Il existe donc une arête $x_1x_2$. Si $x_2 = x_0$ il existe un cycle dans le graphe, sinon il existe un chemin $x_0x_1x_2$. Il existe donc une arête $x_2x_3$. Si $x_3 \in {x_0, x_1 }$ il existe un cycle et sinon on a un chemin $x_0x_1x_2x_3$. On peut ainsi recommencer jusqu'à tomber sur un cycle par finitude du graphe. Ce n'est pas un DAG.

Le raisonnement est identique pour les voisins entrant.

3 :

en supprimant itérativement les sommets sans voisins rentrant d'un DAG (le graphe obtenu en supprimant un sommet d'un DAG est toujours un DAG puisque supprimer un sommet ne rajoute pas de cycle), on obtient un tri topologique.

4 :

On a montré que :

  • cycle implique non tri topologique
  • DAG (non cycle) implique tri topologique

On a donc bien l'équivalence : tri topologique est équivalent à DAG.

Utiliser le tri pour trouver un chemin élémentaire de longueur maximum dans un DAG.

solution

algorithme sur tri topologique :

Entrée :
    - un graphe orienté G = (V, E)
    - un tri topologique V0 < ... < Vn des éléments de V
Initialisation :
    longueur(x) = 0 pour tout sommet x
    predecesseur(x) = x pour tout sommet x
    V' = {}, E' = {}
Algorithme :
    pour v allant de V0 à Vn:
        pour chaque voisin sortant w de v:
            si longueur(w) < longueur(v) + 1:
                longueur(w) = longueur(v) + 1
                predecesseur(w) = v
    soit a l'élément de V ayant la plus grande longueur
    chemin = [a]
    x = a
    tant que x est différent de predecesseur(x):
        x = predecesseur(x)
        ajoute x au début de chemin
Retour :
    chemin

La complexité est de $\mathcal{O}(\vert E \vert + \vert V \vert)$, ce qui est optimal.

Pour prouver l'algorithme, on montre par récurrence sur $\vert V \vert$ que longueur(x) est la longueur d'un plus long chemin finissant en x.

Si $\vert V \vert = 1$, c'est Ok. On suppose la propriété vraie à $\vert V \vert = n$. Pour $\vert V \vert = n +1$ on remarque que longueur(Vi) est la même pour le graphe $G$ et pour le graphe $G$ auquel on a enlevé $v_{n+1}$ pour tout $i \neq n+1$. Comme tous les prédécesseurs de $v_{n+1}$ seront vus pour l'algorithme et que longueur(Vi) ne change pas après l'étape $i$ on en conclut que la récurrence est vraie à $\vert V \vert = n +1$.

Applications

Voyageur de commerce

Problème vu sous l'angle algorithmique dans le cours d'algorithmie :

TBD formaliser ça en graphe.