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.