Algorithme Combinatoire Cours 1 : Coloriage d`un graphe But

publicité
Algorithme Combinatoire
Cours 1 : Coloriage d’un graphe
But : Formalisation + Rappels
𝐺 = (𝑉, 𝐸)
graphe
sommet(vertices)
arrêtes/arc(edges)
Créer des graphes par algorithme supermaster
Utilisation : G[u]
ajd(u) -> ensemble des voisins du sommet u
𝑎𝑑𝑗(2) = 1 3 4
𝑝𝑎𝑡ℎ(𝑢, 𝑣)𝐺 → chemin de u à v dans G
𝑑(2) → degré d’un sommet
𝑑(2) = 3 (nombre de voisin d’un graphe)
𝑑+ (2) / 𝑑 − (2) -> pour graphe orienté
degré entrant / degré sortant
Exo : Equipe un carrefour de feu tricolore :
Interet : reguler la circulation en evitant les
accidents
Relation de compatibilité entre les sommets
Le but est de transformer cet exo en graphe
Idée principale : ne pas faire d’algorithme compliqué,
 ne pas les crée,
 adapter les schémas à des algorithmes déjà connu
 minimiser à des algorithmes supermaster
Lien et direction
Complexité algorithme pour écrire graph :
𝒪(𝑉 + 𝐸) = linéaire
Problème NP - complet
Ce sont les liens compatibles entre eux : donc pas de collision
E = direction incomptable
V = toutes les directions définies par le problème
Colorier graphe : colorier les sommets de même couleur qui lien compatible de façon
minimale
𝜋𝑐𝑅𝑇 → problème complet = feu tricolore
𝜋𝑎 → problème abstrait = coloration d’un graphe : à formaliser !
On traduit un problème complet à un problème abstrait pour le réutiliser ensuite sur
d’autre algorithme
Pour formaliser on doit comprendre le problème et répondre à ces questions :
- Quelles sont les données ?
- Quels sont les résultats ?
- Quels sont les liens entre ces données et ces résultats ?
Pour écrire une équation on doit avoir ces 4 qualité :
I -> objet informatique -> graph : 𝐺 = (𝑉, 𝐸)
S -> solution : {𝑃𝐴(𝑉)/ ∀ 𝑝 ∈ 𝑃𝐴(𝑉), ∀ 𝑥, 𝑦 ∈ 𝑝((𝑥, 𝑦) ∉ 𝐸)}
F -> |𝑃𝐴(𝑉)| = Logarithme des blocs
Opt -> min -> ce que l’on cherche comme solution
Ici on cherche donc le plus petit paquet de direction compatible
FORMALISATION : ses 4 étapes
I : les données : {listes, ensembles, graphes, automates, arbres, grammaires}
S : ensemble des solutions : {ObjetCombinatoire(I), propriétés}
F : la meilleure solution : mesurer S
Opt : min / max : ce que l’on cherche à obtenir comme nombre de solution dans
l’ensemble S
Exercice :
I : {1,2,3,4,5}
Partition possible :
{1,5} , {2} , {3,4}
{1,3,4} , {2,5}
la meilleur des solutions car moins de couleur utilisé (2)
Les partitions se crées par compatibilités des sommets entre eux, c’est à dire quand il n’y
a pas d’arrête entre eux
Ex : {1,2,3,5} , {4} -> non compatible
Formalisation : traduire un problème complet en problème abstrait
On utilise 3 technique pour cela :
- choisir et traiter (la favorite)
- diviser pour régner
- programmation dynamique
Choisir et traiter :
On choisit un sommet, et on se traite pour connaître ses adjacents : u -> adj[u]
Moins on utilise de couleur plus on se rapproche de la solution !
On choisit le sommet 2 et on lui attribut la
première couleur.
On traite ses adjacents et leur donne la deuxième
couleur.
On applique à 5 sa couleur, puisque {2,5} est
compatible
-> On regarde pour chaque sommet ses adjacents
et leur couleur, et on ne prend pas celle là !
2 1 2 2 1
1 2 3 4 5
Exemple d’algorithme juste mais non optimal :
Liste des partitions :
{1,5} , {2} , {3, 4}
On obtient 3 couleurs, ce n’est pas
optimal, le but est de trouver le
moins de couleur possible
Remarque : on a autant le droit de mettre 1 de la même couleur que 5 que 2, puisque
tout les 2 n’ont pas de lien jusqu’à 5, la seule différence est l’optimisation
Création de l’algorithme :
𝐶𝑂𝐿(𝑧. 𝑄, 𝐶) = 𝛼(𝑎𝑑𝑗[𝑧], 1, 𝐶, 𝑧. 𝑄)
sommet
ensemble de couleur
liste où z appartient
voisin de z
couleur 1
fonction
Formalisation du problème :
𝐶𝑂𝐿(𝑧. 𝑄, 𝐶) = 𝛼(𝑎𝑑𝑗[𝑧], 1, 𝐶, 𝑧. 𝑄)
𝐶𝑂𝐿 ( ) = 𝐶
𝐶[𝑥] ≠ 𝑖 → 𝛼(𝑥. 𝑙, 𝑖, 𝐶, 𝑧. 𝑄) = 𝛼(𝑙, 𝑖, 𝑐𝐶 𝑧. 𝑄)
𝐶[𝑥] = 𝑖 → 𝛼(𝑥. 𝑙, 𝑖, 𝐶, 𝑧. 𝑄) = 𝛼(𝑎𝑑𝑗[𝑧], 𝑖 + 1, 𝐶, 𝑧. 𝑄)
= 𝛼([ ], 𝑖, 𝑧, 𝑧. 𝑄) = 𝐶𝑂𝐿(𝑄, 𝐶[𝑧] = 𝑖)
𝐶𝑂𝐿(𝑧. 𝑄, 𝐶) = 𝛼(𝑎𝑑𝑗[𝑧], [], 𝐶, 𝑧. 𝑄)
𝐶𝑂𝐿 ([ ], 𝐶) = 𝐶
si on a pas de couleur :
𝐶[𝑥] = 0 → 𝛼(𝑥. 𝑙, 𝑅 𝐶 𝑧. 𝑄) = 𝛼(𝑙, 𝑅, 𝐶, 𝑧. 𝑄)
si il y en a, on l’ajoute à la liste R (liste des couleurs):
𝐶[𝑥] ≠ 0 → 𝛼(𝑥. 𝑙, 𝑅, 𝐶, 𝑧. 𝑄) = 𝛼(𝑙, 𝑅 + 𝐶[𝑥], 𝐶, 𝑧. 𝑄)
= 𝛼([ ], 𝑅 𝑧, 𝑧. 𝑄) = 𝐶𝑂𝐿(𝑄, 𝐶[𝑧] = 𝑚𝑖𝑛𝑡𝑟𝑜𝑢(𝑅))
 On demande le plus petit nombre qui n’est pas dans la liste de couleur
Code de l’algorithme
𝐶 = 𝑧𝑒𝑟𝑜𝑠(𝑛) → tableau de zero
𝑄 = [ ] → tableau de sommet
𝑄. 𝑎𝑝𝑝𝑒𝑛𝑑(𝑢) → ajout du premier sommet
𝑤ℎ𝑖𝑙𝑒 𝑄 ∶
→ (𝑄 ≠ 0)
𝑍 = 𝑄. 𝑝𝑜𝑝()
→ on prends le premier sommet de Q
𝑅=[ ]
→ on stock les couleurs adjacentes dans la liste R
𝑓𝑜𝑟 𝑥 𝑖𝑛 𝑎𝑑𝑗[𝑧] :
𝑖𝑓 𝐶[𝑥] ! = 𝑂 ∶
𝑅. 𝑎𝑝𝑝𝑒𝑛𝑑( 𝐶[𝑥])
𝑒𝑙𝑠𝑒 𝑄. 𝑎𝑝𝑝𝑒𝑛𝑑(𝑥)
𝐶[𝑧] = 𝑚𝑖𝑛𝑡𝑟𝑜𝑢(𝑅)
𝒪(𝑉 + 𝐸)
Algorithme
SSSM
(super x3
master)
Application du cours : partie TD
Organisation d’une session d’examen :
Créneaux : 8-10 / 10-12 / 13-15 / 15-17 / 17-19
Données : Etudiant / Professeur / Salle / Module
Sortie : Planning et liste
Nobre fini de module : C, Python, Ana2 ect …
Les modules sont représentés par une lettre
{𝐴 𝐹 𝐶 𝐻 } {𝐵 𝐸 𝐺 } {𝐷}
On a donc 3 créneaux suffisants
𝑛𝑜𝑚𝑏𝑟𝑒 𝑑 ′ é𝑞𝑢𝑖𝑣𝑎𝑙𝑒𝑛𝑐𝑒
= 𝑛𝑜𝑚𝑏𝑟𝑒 𝑑𝑒 𝑗𝑜𝑢𝑟 𝑛𝑒𝑐𝑒𝑠𝑠𝑎𝑖𝑟𝑒 𝑝𝑜𝑢𝑟 𝑐𝑎𝑠𝑒𝑟 𝑡𝑜𝑢𝑡 𝑙𝑒𝑠 𝑐𝑟𝑒𝑛𝑒𝑎𝑢𝑥
5
Problème : on cherche l’immédiatement supérieur : celui qui est juste au dessus du
nombre en gardant les mêmes chiffres, par permutation
Ex : 4235 < 4253 > 4325 ect …
Données : Un tableau L sur (𝐴, ≼)
Sortie : Immédiatement supérieur de L
𝑖←𝑛
𝑤ℎ𝑖𝑙𝑒 (𝑖 > 1 𝑒𝑡 𝐿[𝑖 − 1] ≥ 𝐿 [𝑖]) :
𝑖−−
𝑖𝑓 (𝑖 = 1)
𝑟𝑒𝑡𝑢𝑟𝑛 ⊥
j← 𝑖 − 1; 𝑘 ← 𝑚
𝑤ℎ𝑖𝑙𝑒 (𝐿[𝐾] ≤ 𝐿[𝑗]) :
𝑘−−
𝐿[𝑘 ↔ 𝑗]
l← 𝑖; 𝑚 ← 𝑛
𝑤ℎ𝑖𝑙𝑒 (𝑙 < 𝑚) :
𝐿[𝑙 ↔ 𝑚]
𝑙++
𝑚−−
𝑟𝑒𝑡𝑢𝑟𝑛 𝐿
Téléchargement