Corrige Examen Algo Complexite Janvier 2015
Corrige Examen Algo Complexite Janvier 2015
Corrige Examen Algo Complexite Janvier 2015
D’ALGORITHMIQUE ET COMPLEXITE
Master Informatique, première année, janvier 2015
a
1 2
4
0 b
Le coût (ou longueur) de l’arc 0a est 1, celui de l’arc ab est 2, celui de 0b est 4.
Exprimez le calcul des distances (longueurs des plus courts chemins) des
sommets a et b au sommet source 0 comme un problème de programmation
linéaire. Appelez a la distance du sommet a à la source. Appelez b la distance
du sommet b à la source. Nommez a′ , b′ , b′′ les variables d’écart. Résolvez par la
méthode du simplexe ce problème de programmation linéaire.
Réponse.
max : a + b
a ≤ 1 ⇒ a + a′ = 1
b ≤ 4 ⇒ b + b′ = 4
b ≤ a + 2 ⇒ b − a + b′′ = 2
Résolvons par la méthode du simplexe :
max : a + b max : 1 − a′ + b max : 4 − 2a′ − b′
a′ = 1 − a a = 1 − a′ a = 1 − a′
b′ = 4 − b b′ = 4 − b b = 3 − a ′ − b′
b′′ = 2 + a − b b′′ = 3 − a′ − b b′ = 1 + a′ + b′′
1
C’est terminé. On trouve bien les distances correctes : a = 1, b = 3.
A
1 2
c
a
4
0 b B
2
3 Graphes et probabilités
Par définition, la somme de la probabilité de mort et de la probabilité de
survie pour un arc ou un chemin vaut 1. Dans le graphe suivant, chaque arc est
étiqueté avec la probabilité de mourir quand l’arc est emprunté. Quelles sont
les probabilités de survie des deux chemins 0, a, b et 0, b ? Quel est le chemin le
plus sûr ? Aucune justification n’est demandée, et le recours à la programmation
linéaire n’est pas requis.
a
1/4 1/4
1/2
0 b
4 Problème de la somme
n entiers naturels (donc non négatifs) ei , avec i ∈ 1..n, sont donnés, ainsi
qu’un entier naturel S.
a. Comment décider si S est la somme d’un des sous-ensembles des ei ?
Chaque entier ei ne peut être utilisé qu’une seule fois. Réduisez ce problème au
problème du sac à dos, que nous avons résolu par programmation dynamique.
P
P Réponse. Pour réduire au problème du sac à dos : max i xi ui avec
i xi pi ≤ S, xi ∈ {0, 1}, i ∈ {1, . . . n}, prendre les utilités ui et les poids
(ou volumes) pi égaux aux entiers ei : ui = pi = ei , ∀i.
Ci-dessous, une réponse plus détaillée, qui n’était pas demandée.
Dans le problème du sac à dos, un alpiniste doit choisir quels éléments
prendre dans son sac à dos. Chaque élément i a une utilité uiP≥ 0 ∈ R et un poids
pi ∈ N. L’alpiniste doit maximiser la somme des utilités xi ui (xP
i ∈ {0, 1})
des éléments du sac à dos, avec la contrainte que la somme des poids xi pi des
éléments du sac ne dépasse pas un poids maximal donné S. Si ei = ui = pi , alors
3
P
ce problème est égal au problème de la somme : max :
P xi ei avec la contrainte
xi ei ≤ S, i = 1, . . . n, et xi ∈ {0, 1}.
Le problème de la somme peut être résolu avec l’algorithme par program-
mation dynamique (vu en TD et programmé en TP). Notons Ω(i, s) la somme
maximale plus petite ou égale à s ∈ N faisable avec les i premiers éléments (donc
i ∈ 1 . . . n). Alors
Les valeurs de Ω peuvent être stockées dans une table de hachage. Ceci
permet de ne les calculer qu’une seule fois, et seulement quand ceci est nécessaire.
Ceci simplifie aussi le programmation : il suffit de demander la valeur voulue de
Ω, sans que le programmeur ait se soucier de l’ordre des calculs.
b. La méthode fonctionne-t-elle pour des entiers relatifs (dans Z) ? On sup-
pose que S reste un entier positif.
Réponse. Non. Voici un exemple simple où la méthode précédente ne
fonctionne pas avec des ei entiers négatifs. Supposons i = 1, e1 < 0, et S ≥ 0,
alorsPle résultat de laPméthode est Ω(1, S) = e1 , mais le résultat correct (de
max xi ei avec max xi ei ≤ S) est 0.
NB. Cela ne prouve pas qu’aucune méthode de programmation dynamique
n’existe pour résoudre ce problème. Cela prouve seulement que la méthode pré-
cédente ne fonctionne pas.
Le problème de la somme (ou du sac à dos) peut aussi être résolu par re-
cherche arborescente (backtrack), avec élagage (branch and bound) avec des ei
réels et éventuellement négatifs.
4
bleau suivant que T (n = 3k ) = (k + 1)n = O(n log n) :
k n = 3k T (n) (k + 1)n
0 1 1 1
1 3 6 6
2 9 27 27
3 27 108 108
CQFD.
Est-elle meilleure que celle de la méthode classique ? Donnez la complexité
de la méthode classique.
Réponse. La méthode classique est elle aussi en O(n log n). La méthode
classique et celle d’Arthur ont la même complexité.
5
Réponse. Par un parcours en profondeur à partir du sommet source ω,
calculer un arbre couvrant : ceci oriente les arêtes de la source ω vers tous les
autres sommets. Il suffit ensuite de propager : D(ω) = 0, D(s) = soit p =
father(s) dans D(p) + L(ps). Le tableau D contient la distance à la source, et
L(ps) est la longueur de l’arc p → s. Le temps est en O(A + S) = O(A) = O(S),
meilleur que la méthode de Dijkstra (qui est plus générale).
Un algorithme par programmation dynamique (comme celui utilisé pour les
dates au plus tôt et au plus tard) fonctionne aussi, avec les mêmes performances,
ssi les arêtes sont orientées de ω vers tous les autres sommets ; cette bonne
orientation est indispensable : si les arêtes donnent deux arcs opposés, il y a des
cycles et l’algorithme boucle.
Remarque : les algorithmes de Prim ou Kruskal calculent un arbre couvrant
optimal, et donc calculent bien un arbre couvrant, mais leur complexité n’est
pas linéaire.
Remarque : les algorithmes fonctionnent si des coûts sont négatifs et donnent
les longueurs des chemins simples (sans répétition) les plus courts. Il n’y a qu’un
seul chemin simple dans un arbre entre deux sommets : c’est donc le plus court.
On rappelle que la longueur d’un chemin non simple peut être aussi petite que
l’on veut s’il y a une arête de coût négatif dans le graphe : il suffit d’aller et
venir suffisamment le long de l’arête de coût négatif.
8 Réseau
Rappels. On note N l’ensemble des entiers naturels : 0, 1, 2, 3 . . .. On note Z
l’ensemble des entiers relatifs : . . . , −3, −2, −1, 0, 1, 2, 3 . . .. Q est l’ensemble des
rationnels.
6
Le dessin suivant montre une partie d’un réseau R généré par deux vecteurs
A = (5, 3) et B = (4, 1). R est l’ensemble des points (les disques noirs sur le
dessin) aA + bB avec a ∈ Z, et b ∈ Z. R est aussi généré par I = (1, 2) et
J = (−3, 1), qui sont plus courts que A et B. Il n’existe pas de base strictement
plus courte que ±I, ±J.
q Rappels. La longueur, ou norme euclidienne, de A = (Ax , Ay ) est ||A|| =
A2x + A2y . L’aire du parallélogramme généré par A, B est la valeur abosolue
du déterminant
Ax Ay
Bx By = Ax By − Ay Bx
Propriété : toutes les bases d’un même réseau génèrent des parallélogrammes de
même aire (au signe près).
I (1, 2)
J (−3, 1)
A (5,3)
B (4, 1)
7
Alors la base la plus courte est I = (1, 0), J = (0, 1) mais O(α) réductions
sont nécessaires, ce qui est exponentiel dans la taille des données (la taille des
données est log α).
La suite n’était pas demandée.
Voici une méthode plus efficace.
Soit P = qB la projection orthogonale de A sur B (avec q ∈ R ; alors A − qB
et B sont perpendiculaires :
A.B
(A − qB) . B = 0 ⇒ q =
B .B
A
R
B
−1B −2B −3B −4B −5B
Rappel : A . B est le produit scalaire de A et B. Il vaut Ax Bx + Ay By .
Soit qe = ⌊q⌋ ou bien qe = ⌊q⌉ l’entier le plus proche de q (arrondir arbi-
trairement si q ∈ Z/2). Alors soit le "reste" R = A − qe B ; dans la base (A, B),
A est remplacé par le vecteur le plus court dans {A, R} ; la méthode termine
quand R n’est pas strictement plus court que A.
Chaque étape de réduction de la base s’exprime matriciellement :
Bx By 0 1 Ax Ay A.B A.B
= avec qe = ou
Rx Ry 1 −qe Bx By B .B B .B
ou bien, si on préfère :
qe 1 Bx By Ax Ay A.B A.B
= avec qe = ou
1 0 Rx Ry Bx By B .B B .B
8
confusions) avec q = ⌊a/b⌋ (utiliser q = ⌊a/b⌉ comme Gauss le faisait est correct
aussi) et se formule matriciellement de la même façon :
jam jak
b 0 1 a
= avec q = ou
r 1 −q b b b
ou bien, si on préfère :
jam jak
q 1 b a
= avec q = ou
1 0 r b b b
Pour que tous les qe soient positifs, comme les q = ⌊a/b⌋ de l’algorithme
classique d’Euclide, il suffit d’intercaler des phases qui remplacent le vecteur B
par −B quand A . B est négatif ; ce changement de signe ne peut pas se produire
deux fois de suite ; il ne modifie donc pas la complexité (le nombre d’étapes) et
accentue la similitude entre les deux méthodes.
Cette similitude entre la réduction de la base d’un réseau 2D et l’algorithme
d’Euclide nous permet de réutiliser l’étude de la complexité de l’algorithme
d’Euclide (théorème de Lamé) :
Dans le cas qui nécessite le plus de réductions, que ce soit pour la méthode
d’Euclide ou pour la réduction de base, tous les q, ou qe , valent 1. Pour la
méthode d’Euclide, cela se produit quand a et b sont deux nombres de Fibonacci
consécutifs, comme l’a remarqué Lamé. D’ailleurs, on reconnaît alors dans la
matrice contenant qe ou q la "matrice de Fibonacci" (ou son inverse) : celle
dont la puissance permet de calculer les termes de la suite de Fibonacci. La
matrice de Fibonacci est F :
1 1 φ 0
F = = R−1 R
1 0 0 φ′
avec
φ φ′ −1 1 1 −φ′
R= et R =√
1 1 5 −1 φ
9
c. Le caractère entier relatif des coordonnées de A et B est-il indispensable ?
Réponse. Non. Ce qui importe est que ces coordonnées sont calculables
(par exemple elles sont dans Q, ou algébriques), que le réseau est l’ensemble
des aA + bB avec a ∈ Z, b ∈ Z. Cela implique que, dans un disque de rayon
fini (par exemple max(||A||, ||B||)) ou un carré, le réseau ne peut avoir qu’un
nombre fini de points 1 . En passant, un théorème de Minkowski sur les réseaux
quantifie cela. Il n’y a donc qu’un nombre fini de bases à envisager.
En haute dimension, le calcul du vecteur le plus court d’un réseau, le calcul
de la base la plus courte (ou raisonnablement courte), le calcul du nombre de
points d’un réseau dans un convexe sont des problèmes difficiles. Ces problèmes
se posent en cryptographie, en cryptanalyse, en combinatoire, en optimisation
discrète, en théorie des nombres.
c1
c2
c0
c4
c3
10
c6 c7
c3 c2
c4
a
c5
c1 b
11
c7=15
c6=18
c3=7 c2=8
c4=4
a=1
c5=14
c1=10 b=9
Remarquez que, de façon plus générale, chaque trait intérieur maximal donne
une équation linéaire, par exemple c4 + c6 = c3 + c7 pour le trait vertical en
haut presque au milieu. On admettra qu’il y a toujours une équation de moins
que d’inconnues.
b. Le dessin d’un pavage d’un rectangle en carrés est donné ; il faut calculer
les longueurs entières minimales (non nulles) des carrés. Proposez en trois lignes
au plus le principe d’une méthode, ou bien identifiez le problème mathématique
sous-jacent.
Réponse. Une des longueurs est initialisée à 1. Nous admettons que le
système linéaire a alors autant d’équations que d’inconnues. Il est résolu dans les
rationnels (Q). Soit C le vecteur rationnel solution ; soit p le PPCM (plus petit
commun multiple) des dénominateurs des Ci ; alors pC est, algébriquement, la
solution entière non nulle la plus petite du système linéaire ; mais il faut vérifier
que pC est géométriquement réalisable, autrement dit que toutes les longueurs
pCi ∈ Z sont positives.
Ceci suggère une méthode pour trouver les pavages de rectangles par des
carrés : générer toutes les topologies possibles, puis résoudre. C’est un sujet
possible pour les projets.
12