# Cour 6 -- Algorithme ###### tags `cour` `M1 S1` `Algorithme` [Somaire](/ueYXUIJIQ6C6hcYzKYeojA#)\ [precedent](/iv7_YjPzRnKPIGlFmtuPOA) > [time= 5 oct 2020] [TOC] ## Ensemble indépendant maximum (suite) - Maximum independant set - stable maximum ### 1er astuce Si le voisinage de v = {v} (deg=0)\ On fait 2 fois le même appel récursif: On modifie l'algo pour ne pas le faire 2 fois $$ T_1(N) \leq \begin{cases} 1 & \text{si } N = 0\\ T_2(N - 1) + N^2 &\text{si } deg(v)=0\\ T_2(N - 1) + T_2(N - 2) + N^2 &\text{si } deg(v) > 0\\ \end{cases} $$ Ca ressemble a **fibonacci** $$ T_1(N) \leq \frac{N^2}{\sqrt{5}} \left(\frac{1 + \sqrt{5}}{2}\right)^N\\ \varphi = \frac{1 + \sqrt{5}}{2} \approx 1,62 $$ ### astuce 2 Si **v** a un seul voisin dans **G** alors on peut toujours supposer que **v** est dans un stable max. S'il ne l'était pas:\ ++**w** y était++: on peut remplacer **w** par **v** sans "casser" le stable ($v \not\sim u \: u \neq w$ en particulier c'est vrai pour tous les sommets **u** du stable)\ ++**w** n'y est pas++ on peut rajouter **v** ```python= def EIM3(G): if len(G): return 0; #prendre un sommet v v = G.un_sommet() # sommet isolé if v.deg == 0: return EIM3(G.sans(v)) + 1 # cas qu'on viens de voir elif v.deg == 1: return EIM3(G.sans_voisinage(v)) + 1 else: # deg >=2 avec = EIM3(G.sans_voisinage(v)) + 1 sans = EIM3(G.sans(v)) return max(avec, sans) ``` $$ T_3(N) \leq \begin{cases} 1 & \text{si } N = 0\\ T_3(N - 1) + N^2 &\text{si } deg(v)=0\\ T_3(N - 2) + N^2 &\text{si } deg(v)=1\\ T_3(N - 1) + T_3(N - 3) + N^2 &\text{si } deg(v) \geq 2\\ \end{cases} $$ Pire cas: $$ T_3(N) \leq T_3(N - 1) + T_3(N - 3) + N^2 $$ Pour simplifier éliminous N^2^ lors de la récurence Comment résoudre cette récurrence?\ Par induction $$ \begin{align} &\text{Supposons } T_3(N) = \alpha^N\\ &\text{remplacons } T_3(N) \text{ par } \alpha^N \text{dans la récurrence}\\ &\left(\alpha^N = \alpha^{N - 1} + \alpha^{N - 3}\right) / \alpha^{N - 3}\\ & \alpha^3 = \alpha^2 + 1\\ & \alpha^3 - \alpha^2 - 1 = 0\\ & \text{la plus grande racine est:}\\ & \alpha \approx 1, 4655 \end{align} $$ On conclut que $T_3(N) \leq (1,4655)^N$ ### astuce 3 Notre pire cas se produit lorsque *deg(v) = 2*\ On pourrait améliorer la récurrence.\ Si on prenait toujours un sommet de degré $\geq 3$\ Pire cas: Tous les sommets sonts de degré 2 ! or c'est tres facile si c'est le cas:\ le graph est une union de cycles! ```graphviz Digraph impaire { label="graph avec cycle impair" node [shape=circle] layout="circo"; pi1 [label="", style=filled] pi2 [label=""] pi3 [label="", style=filled] pi4 [label=""] pi5 [label="", style=filled] pi6 [label=""] pi7 [label=""] pi1 -> pi2 -> pi3 -> pi4 -> pi5 -> pi6 -> pi7 -> pi1 } ``` ```graphviz Digraph pair { label="graph avec cycle impair" node [shape=circle] layout="circo"; pp1 [label="", style=filled] pp2 [label=""] pp3 [label="", style=filled] pp4 [label=""] pp5 [label="", style=filled] pp6 [label=""] pp7 [label="", style=filled] pp8 [label=""] pp1 -> pp2 -> pp3 -> pp4 -> pp5 -> pp6 -> pp7 -> pp8 -> pp1 } ``` $$ \newcommand{\floor}[1]{\left\lfloor #1 \right\rfloor} $$ Pour chaque cylce de taille M stable max est toujours $\floor{\frac{N}{2}}$ ```python= def EIM4(G): if len(G) == 0: return 0 # si g contien un sommet v de degré deg(v) <= 1 if (v:=g.contien_v_inf_eq_1()): return EIM4(G.sans_voisinage(v)) # g est 2 régulier elif g.est_2_regulier(): #décoposer en cycle de taille m1, ... mx return sum(map(lambda m : foor(m / 2), g.decompose_cycle()) else: # prendre un sommet dans g v = G.un_sommet() avec = EIM3(G.sans_voisinage(v)) + 1 sans = EIM3(G.sans(v)) return max(avec, sans) ``` $$ T(N) \leq T(N - 1) + T(N - 4) (*) $$ Pour résoudre cette récurrence on suppose $$ \begin{align} &T(N) \approx \beta^N \text{, je substitue dans (*)}\\ &\left(\beta^N = \beta^{N-1} + \beta^{N-4}\right) / \beta^{N - 4}\\ &\beta^4 = \beta^3 + 1 \\ &\text{il reste à trouver une racine de:}\\ &\beta^4 - \beta^3 - 1 =0\\ &\text{on trouve la plus grande racine:}\\ &\beta \approx 1,38^N \end{align} $$ Si on exécute $\approx 10^{11}$ instructions par seconde.\ On dispose de 10^t^ secondes: **Algo 1:** - $2^N = 10^t \times 10^{11}$ - N = 33 + 3t **Algo 2:** - $1,62^N = 10^t \times 10^{11}$ - $N \approx 4,77 (11 + t)$ **Algo 4:** - $1,38^N = 10^t \times 10^{11}$ - $N \approx 7,14 (11 + t)$ ## P vs NP les problèmes réputés difficiles La grande question: :::success Existe t-il un algorithme polynomial (en $O(N^{[]})$ et non $O([]^{N}))$ pour des problèmes réputés difficiles? (Comme EIM) ::: ### Cook - Levin 1971 On démontré: Il existe un problème **SAT** qui partage les propriétés des problèmes réputés difficiles si on savait résoudre SAT en temps polynomial, alors on saurait résoudre en temps polynomial, tous ces autres problèmes "réputés difficiles" ### Exemple de problèmes réputés difficile - EIM (Ensemble indépendant maximum) - 3COL (3 colorabilité) - CLIQUE (MaxClique) - HAM (existe-t-il un circuit hamiltonien dans G) - SUBSET SUM Pour simplifier les choses on va se limiter à un **problème de décision**, ceux dont la réponse est **vrai ou faux**. ##### EIM - en entré - G (graph) - k (entié) - en sortie - VRAI si il existe un stable de taille k - FAUX sinon ##### 3COL - en entré - G - en sortie - Décidé **si il existe une coloration** telle que:\ aucune arréte n'a 2 extrémités de la meme couleur (prédicat de vérification) ##### Clique - en entré - G - en sortie - Décidé **s'il existe un ensemble de sommets S** t.q: \ toutes les paires de sommets dans S sont reliés par une arrète(prédicat de vérification) ## Probleme P On dit qu'un problème de décision est P(polynomial) s'il existe un algorithme pour ce problème dont la complexité est un polynome N^c^. ou c est une constante On dit qu'il est décidable en temps polynomial. ## Probleme réputé difficile NP :::success On dit qu'un problème de décision est NP si il sécrit sous la forme: $$ \begin{align} & \text{Sur entrée } X: \text{décider si}\\ & \exists \Pi : V(X, \Pi)\\ \end{align}\\ \textbf{ET}\\ \text{V doit être réalisable en temps polynomial étant donné en entrée X et } \Pi $$ ::: - $\Pi$: ex: une coloration, un sous-ensemble de sommet ... - $V(X, \Pi)$: le prédicat de vérification [suivant](/oMYgG0ACSsK_UFQxu9-SkA)