Techniques de réduction

Transcription

Techniques de réduction
Chapitre 7
Techniques de réduction
1. Introduction
Le principe des techniques de réduction consiste à transformer un problème donné, pour le
résoudre, en un autre problème équivalent dont on connaît la solution. Dans ce chapitre, nous
allons passer en revue quelques transformations pour illustrer cette idée de réduction. Les plus
utilisées sont celles qui consistent à passer par un programme mathématique ou par un problème
de graphe.
Le problème central de cette approche réside dans le choix du problème vers qui il faudrait
réduire le problème que nous voulons résoudre. De plus, si nous voulons que nos efforts soient
d’une portée pratique, il faudrait :
1. l’algorithme de réduction soit efficace
2. le problème vers lequel nous avons réduit notre problème de départ doit posséder un
algorithme de résolution efficace.
En un mot, pour considérer cette approche, il faut que l’ensemble de deux point ci-dessus aient
une meilleure complexité que l’algorithme direct de résolution (s’il en existe un) du problème
considéré.
2. La réduction par l’exemple
Dans cette section, nous allons illustrer la technique de réduction à travers des exemples.
2.1 Calcul du plus petit multiple commun
Rappelons que le plus petit multiple commun de deux nombres entier n et m, noté par
PPMC(n,m), est défini comme étant le plus petit entier qui est divisible par n et m. Par exemple,
le PPMC(124,60) = 120 ; PPMC(11,55) = 55.
Pour déterminer le PPMC de deux nombre n et m, il existe un algorithme simple qui est comme
suit :
Supposons que m < n. l’algorithme consiste à multiplier m par les nombres successifs de 1 à n.
On obtient le PPMC dès que le produit obtenu est un multiple de n. L’algorithme est comme suit :
int function PPMC(int n,m){
int temp,i ;
if m > n {
temp = m;
m=n;
n = temp ;
} // fin du if
i = 1 ; temp = m ;
while (i < n) && ( temp % n != 0)
{
temp = m * i;
i++ ;
}
return(temp) ;
} // fin de la fonction
Il est clair que la complexité de dans le pire cas cet algorithme est en O(max(n,m)). Pour
améliorer cette complexité, on utilise le résultat suivant. Si PGCD(n,m) représente le PGCD des
nombre n et m, alors, nous avons :
PPMC =
n×m
PGCD (n, m)
Or, nous avons un algorithme (d’Euclide) qui détermine le PGCD de n et m en O(log max (n,m)).
Autrement dit, pour calculer le PPMC de deux nombre, il est préférable de passer par le calcul de
leur PGCD.
2.2 Calcul du nombre de chemins ou de cycles dans un graphe
Dans certaines situations, nous pourrions être intéressés par le calcul du nombre de chemins ou
de cycles d’une certaine longueur. La structure de données de la matrice adjacente peut être
directement utilisée pour répondre à cette interrogation.
Théorème Soit G = (X,A) un graphe orienté, avec X = {x1 , x 2 ,..., x n }; de matrice d'adjacence
M = (mij ) . Pour tout entier naturel k, non nul notons M k la kème puissance de la matrice. La
valeur de m k ij représente le nombre de chemins de longueur k du sommet xi au sommet xj .
Démonstration
Effectuons une récurrence sur k : m1ij = mij désigne bien le nombre de chemins allant de xi à xj.
Supposons le résultat vrai pour l'entier k − 1 . Comme M k = M k −1 × M , on a par définition :
n
mij = ∑ mil
k
l =1
k −1
× mlj
Par hypothèse de récurrence, mil
k −1
est le nombre de chemins de longueur k − 1 allant de xi à xl
et mlj est égal à 1 si ( xi , x j ) est une arête de G et à 0 sinon. Observons que mil
k −1
× mlj est le
nombre de chemins de longueur k
allant de xi à x j dont la dernière arête est ( xl , x j ) . La somme de ces termes est donc bien le
nombre de chemins de longueur k allant de xi à x j .
Exemple Déterminons le nombre de chemins de longueur 2 allant de v1 à v4 dans le graphe G1
v3
e8
v2
e4
v4
e3
e5
v5
e1
e7
e2
v6
La matrice d’adjacence de G1 est
X=
v1
0
1
0
0
1
1
v1
v2
v3
v4
v5
v6
e6
v1
v2
1
0
0
1
1
0
v3
0
0
0
1
0
0
v4
0
1
1
0
1
1
v5
1
1
0
1
0
0
v6
1
0
0
1
0
0
Le nombre de chemins cherché est l’élément qui est à ligne 1 et la colonne 2 de la matrice
2
X =
c'est-à-dire 3.
v1
v2
v3
v4
v5
v6
v1
3
1
0
3
1
0
v2
1
3
1
1
2
2
v3
0
1
1
0
1
1
v4
3
1
0
4
1
0
v5
1
2
1
1
3
2
v6
0
2
1
0
2
2
2.3. Les problèmes d’optimisation
Définition 1 : Si un problème consiste à rechercher un maximum d’une certaine fonction f, nous
dirons que c’est un problème de maximisation.
Définition 2 : Si un problème consiste à rechercher un minimum d’une certaine fonction f, nous
dirons que c’est un problème de minimisation.
Supposons maintenant qu’on veut minimiser une fonction f(x), et que nous connaissons un
algorithme qui maximise cette fonction. Comment peut-on utiliser de l’algorithme de
minimisation pour résoudre notre problème de maximisation. La réponse est donnée par le
résultat suivant qui reste vrai quelque soit la fonction f définie sur un domaine quelconque D. :
min f ( x) = − max[− f ( x)]
En d’autre termes, minimiser une fonction revient à maximiser sa fonction négative.
Dans ce qui suit, nous allons discuter d’un type de réduction liée aux problèmes de la
programmation linéaire et de la théorie des graphes. Ces techniques de réduction sont de loin les
plus répandues dans la réduction des problèmes. La raison principale est qu’il existe dans ces cas
des algorithmes efficaces de résolution. De plus, un nombre important de problèmes pratiques
sont naturellement modélisés à l’aide de ces deux problématiques.
2.4. Réduction par la programmation mathématique
Cette technique consiste à modéliser le problème étudié en un problème de programmation
mathématique, c’est à dire à l’exprimer sous forme d’une fonction de variables à optimiser sujette
à des contraintes sur ces variables. Ensuite, résoudre le problème de départ revient à résoudre le
problème mathématique ainsi formulé. Dans cette section, on parlera plus d’un modèle le plus
connu qui est celui de la programmation linéaire. Il est utile de signaler que la fonction (objectif)
à optimiser et les contraintes sur les variables sont, dans ce cas, des fonctions linéaires. Ce
problème est résolu par plusieurs algorithmes. Néanmoins, ce plus connu d’entre eux est
l’algorithme du simplexe. Signalons par ailleurs que dans les autres cas (cas non linéaires, cas
des variables entières), il existe des techniques pour leur résolution. Seulement, d’un point de vue
de la complexité de calculs, la résolution de ces problèmes, dans la plupart des cas, est difficile.
Définition 1 : Un problème de programmation linéaire est un problème qui a la forme suivante :
n
min f ( x) = ∑ ci xi
i =1
sous les contraintes suivantes :
a11 x1 + a12 x 2 + .... + a1n x n = b1
a 21 x1 + a 22 x 2 + .... + a 2 n x n = b2
a31 x1 + a32 x 2 + .... + a3n x n = b3
……………………….. ……
……………………………..
a m1 x1 + a m 2 x 2 + .... + a mn x n = bm
x1 , x 2 ,..., x n ≥ 0
où aij , ci , bi , n, m sont des constantes. Les variables x1 , x 2 ,..., x n sont des réelles. Si elles venaient
à être des entiers, alors on dit que nous avons un programme linéaire en nombres entiers. Dans ce
dernier cas, il n’existe pas d’algorithme polynomial pour résoudre ce dernier.
Exemple 1 : Rappelons le problème du sac à dos fractionnaire que nous avons déjà discuté dans
le chapitre des algorithmes voraces.
Soit un ensemble de n objets N = {1,2,..., n} , et un sac à dos ayant une capacité maximale W.
Chaque objet a un poids wi et un gain vi . Le problème consiste à choisir un ensemble d'objets
parmi les n objets, au plus un de chaque, de telle manière que le gain total soit maximisé, sans
dépasser la capacité W du sac.
Si xi représente la quantité de l’article i à mettre dans le sac, alors il n’est pas difficile d’arriver à
la formulation suivante.
n
max ∑ vi xi
i =1
n
∑w x
i =1
i
i
≤W
xi ≤ 1; i = 1,2,.., n
xi ≥ 0; i = 1,2,.., n.
la première équation représente la quantité à maximiser si xi est la quantité choisie pour l’article
i. La deuxième équation représente la capacité de poids de l’ensemble des article choisis ne
devant pas dépasser la capacité totale. Le reste des équations signifient que les quantités xi ne
doivent pas dépasser l’unité et doivent être non négatives.
Si on revanche, on insiste qu’un objet est soit choisi soit ignoré. Autrement dit, les objets sont
indivisibles, et de ce fait nous ne pouvons pendre une portion d’un objet dans le sac, alors dans
ce cas, la formulation ci-dessus devient comme suit :
n
max ∑ vi xi
i =1
n
∑w x
i =1
i
i
≤W
xi = 0,1, i = 1,2,..., n..
L’intégralité des objets rend ce problème difficile à résoudre. La stratégie vorace proposée dans
le chapitre précédent ne fonctionne plus dans ce cas.
Exemple 2. Considérons un agriculteur qui possède des terres, de superficie égale à H hectares,
dans lesquelles il peut planter du blé et du maïs. L'agriculteur possède une quantité E d'engrais et
I d'insecticide. Le blé nécessité une quantité E1 d'engrais par hectare et I1 d'insecticide par
hectare. Les quantités correspondant pour le maïs sont notées E2 et I2.
Soit P1 le prix de vente du blé et P2 celui du maïs. Si l'on note par x1 et x2 le nombre d'hectares à
planter en blé et en maïs, alors le nombre optimal d'hectare à planter en blé et en maïs peut être
exprimé comme un programme linéaire:
maximiser P1 x1 + P2 x 2 ; (maximiser le revenu net)
Sous les contraintes suivantes
x1 + x 2 ≤ H ;
(borne sur le nombre total d'hectares)
E1 x1 + E 2 x 2 ≤ E ; (borne sur la quantité d'engrais)
I 1 x1 + I 2 x 2 ≤ I ;
(borne sur la quantité d'insecticide)
x1 ≥ 0; x 2 ≥ 0 ;
(on ne peut pas planter un nombre négatif d'hectares)
Exemple 3. Un artisan fabrique deux type d’objets, disons A et B. La réalisation d'un objet A
demande 30$ de matière première et 125$ de main-d'œuvre, tandis que celle de B demande 70$
et 75$, respectivement. Les profits réalisé sont de 54$ par objets A, et de 45$ par objet B. La
dépense journalière en matière première ne doit pas dépasser 560$. La dépense journalière en
main-d'oeuvre ne doit pas dépasser 1 250 $. Déterminer la quantité journalière d’objets A et B à
produire de telle manière à maximiser le profit.
Si x est le nombre d'objets A et y le nombre d'objets B, les contraintes sont:
Ce qui se simplifie en :
Le bénéfice journalier de l'entreprise est donné par:
F(x ; y) = 54x + 45y .
Graphiquement, on aura ce qui suit :
La solution est donc : x = 7 ; y = 5 ; F(x,y) = 603.
2.5. Réduction par les problèmes de graphe
Elle consiste à ramener le problème étudié à une problématique de graphe pour laquelle une
solution existe. Dans cette section, on verra quelques transformation dans ce sens.
Problème 1. Le problème des ponts de Königsberg La ville de Königsberg en Prusse
(maintenant Kaliningrad) comprenait 4 quartiers, séparés par les bras du Prégel. Les habitants de
Königsberg se demandaient s’il était possible, en partant d’un quartier quelconque de la ville, de
traverser tous les ponts sans passer deux fois par le même et de revenir à leur point de départ. Le
plan de la ville peut se modéliser à l’aide d’un graphe ci-dessous, les quartiers sont représentés
par les 4 sommets, les 7 ponts par des arêtes :
Ce problème n’est en fait que celui du chemin eulérien qui consiste à trouver dans un graphe
donné un chemin qui passe par tous les arcs de ce graphe une et une seule fois. Ce problème
possède une solution bien connue dans la théorie des graphes.
Problème 2. Choix d'un itinéraire Sachant qu'une manifestation d'étudiants bloque la gare de
Poitiers, et connaissant la durée des trajets suivants :
Nantes 4 h
Bordeaux
Bordeaux
Marseille 9 h
Bordeaux
Lyon 12 h
Nantes
Paris-Montparnasse 2 h
Nantes
Lyon 7 h
Paris Montparnasse Paris Lyon 1 h (en autobus)
Paris-Lyon
Grenoble 4 h 30
Marseille
Lyon 2 h 30
Grenoble 4 h 30
Marseille
Lyon Grenoble 1 h 15
Comment faire pour aller le plus rapidement possible de Bordeaux à Grenoble ?
Les données du problème sont faciles à représenter par un graphe dont les arêtes sont
étiquetées par les durées des trajets :
Il s'agit de déterminer, dans ce graphe, le plus court chemin (ou l'un des plus courts chemins, s'il
existe plusieurs solutions) entre Bordeaux et Grenoble. Ce problème est résoluble par
l’algorithme du plus court chemin dans un graphe ayant des poids positifs (par exemple
l’algorithme de Dijkstra)..
Problème 3 Organisation d'une session d'examens
Des étudiants A, B, C, D, E et F doivent passer des examens dans différentes disciplines, chaque
examen occupant une demi-journée :
Chimie : étudiants A et B
Électronique : étudiants C et D
Informatique : étudiants C, E, F et G
Mathématiques : étudiants A, E, F et H
Physique : étudiants B, F, G et H
On cherche à organiser la session d'examens la plus courte possible.
On peut représenter chacune des disciplines par un sommet, et relier par des arêtes les sommets
correspondant aux examens incompatibles (ayant des étudiants en commun) :
Il s'agit alors de colorier chacun des sommets du graphe en utilisant le moins de couleurs
possible, des sommets voisins (reliés par une arête) étant nécessairement de couleurs. Cette
problématique est bien étudiée dans la théorie des graphes et est connue sous le connue de
coloration de graphes.
Problème 4. Planification de travaux
Pour rénover une maison, il est prévu de refaire l'installation électrique (3 jours), de réaménager
(5 jours) et de carreler (2 jours) la salle de bains, de refaire le parquet de la salle de séjour (6
jours) et de repeindre les chambres (3 jours), la peinture et le carrelage ne devant être faits
qu'après réfection de l'installation électrique. Si la rénovation est faite par une entreprise et que
chacune des tâches est accomplie par un employé différent, quelle est la durée minimale des
travaux ?
On peut représenter les différentes étapes de la rénovation sur un graphe dont les arcs sont
étiquetés par la durée minimale séparant deux étapes
On peut représenter les différentes étapes de la rénovation sur un graphe dont les arcs sont
étiquetés par la durée minimale séparant deux étapes
Il s'agit de déterminer la durée du plus long chemin du début à la fin des travaux. Ce problème
peut être résolu par la méthode CPM-PERT.
Problème 5. Affectation du personnel à des tâches
Définition 1: Un graphe biparti est un graphe dont l’ensemble de ses sommets V sont divisées en
deux ensemble disjoints, A et B tels que l’ensemble de ses arcs est celui qui relie juste un des
sommets de A et un des sommet de B.
A
B
A
B
Définition 2: Deux arcs sont dit adjacents dans un graphe si, et seulement si, ils possèdent en
commun une de leurs extrémités.
Définition 3 : un couplage dans un graphe biparti est l’ensemble des arcs non adjacent reliant les
sommets de A à ceux de B.
Soir le graphe biparti suivant :
Un couplage est représenté par l’ensemble ci-dessous d’arcs coloriés en noir:
Définition 4: Un couplage est dit maximum si on ne peut pas ajouter d’arcs sans détruire la
notion de couplage.
Le couplage de la figure précédente est maximum.
Il existe plusieurs algorithmes efficaces qui déterminent un couplage maximum (maximum
matching) dans un graphe biparti.
Exemple. Soient un ensemble de n travailleurs et un ensemble de m machines. Chaque
travailleur est qualifié à opérer sur un sous-ensemble de machines. Chaque travailleur ne peut être
affecté qu’à une seule machine et une machine ne peut être affectée à plus d’un travailleur. Notre
problème consiste à affecter le plus de machines possibles aux travailleurs pouvant les faire
marcher.
Si on représente l’ensemble des machines et des travailleurs par des sommets. Un sommet
représentant les travailleurs est relié à un sommet représentant ceux des machines à chaque fois
que ce travailleur est qualifié à travailler sur cette machine. On construit ainsi un graphe biparti.
Affecter le plus de machines possibles aux travailleurs pouvant les faire opérer revient alors à
trouver un couplage maximum dans ce graphe.