73
Institut Supérieur D’Informatique de Modélisation et de Leurs Applications BP 10125 63173 Aubière Cedex Rapport de projet de troisième année ISIMA Filière calcul et modélisation scientifiques Travail réalisé par : Merième BELLARBI et Rachid JARRAY Encadrant : Mr Christian LAFOREST Responsable de filière : Mr Vincent BARRA Lieu du projet : ISIMA Durée : 100 heures Performances de l'algorithme 2-BFS Etude et Implémentation d'un algorithme permettant de calculer le diamètre

Performances de l'algorithme 2-BFS - isima.fr · Remerciements A l’issue de notre projet de fin d’études, nous tenons à remercier chaleureusement Monsieur Christian LAFOREST,

  • Upload
    vuque

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

Institut Supérieur D’Informatique de Modélisation et de Leurs Applications

BP 10125 63173 Aubière Cedex

Rapport de projet de troisième année ISIMAFilière calcul et modélisation scientifiques

Travail réalisé par : Merième BELLARBI et Rachid JARRAY

Encadrant : Mr Christian LAFORESTResponsable de filière : Mr Vincent BARRA

Lieu du projet : ISIMADurée : 100 heures

Performances de l'algorithme 2-BFS

Etude et Implémentation d'un algorithme permettant de calculer le diamètre

d’un graphe

Institut Supérieur D’Informatique de Modélisation et de Leurs Applications

BP 10125 63173 Aubière Cedex

Rapport de projet de troisième année ISIMAFilière calcul et modélisation scientifiques

Travail réalisé par : Merième BELLARBI et Rachid JARRAY

Encadrant : Mr Christian LAFORESTResponsable de filière : Mr Vincent BARRA

Lieu du projet : ISIMADurée : 100 heures

Performances de l'algorithme 2-BFS

Etude et Implémentation d'un algorithme permettant de calculer le diamètre

d’un graphe

Remerciements

A l’issue de notre projet de fin d’études, nous tenons à remercier chaleureusement

Monsieur Christian LAFOREST, notre tuteur, pour sa disponibilité et son encadrement. Tout au long

de l’année universitaire, il nous a prodigué les conseils nécessaires pour l’aboutissement de notre

projet et nous a orientés afin que nous puissions prendre les meilleures décisions étape du projet.

Nous remercions également Monsieur LAVEDRINE, qui a répondu avec gentillesse à nos

sollicitations pour la mise en œuvre de tests statistiques malgré son emploi du temps chargé.

Résumé

Notre projet de fin d’études s’intitule « Performances de l’algorithme du 2-BFS ». Nous

avons étudié l’algorithme à l’ISIMA et nous étions encadrés par Mr. Christian LAFOREST, professeur

au LIMOS (Clermont-Ferrand, France).

Ce projet fait partie d’une étude nationale sur les graphes de grande taille. En effet, les

graphes ont plusieurs applications pratiques en informatique. Ils sont essentiellement utilisés pour

modéliser des réseaux de transports, des réseaux de communications …etc. Par conséquent, les

ingénieurs ont très souvent besoin de connaître certains paramètres des graphes tels que le

diamètre. Cependant, les algorithmes qui mesurent le diamètre d’un graphe, ont un temps

d’exécution très important. L’algorithme du 2-BFS propose une alternative intéressante pour les

programmeurs, car il propose une estimation du diamètre tout en réduisant le temps d’exécution.

Notre objectif est de tester la pertinence du 2-BFS afin de conclure sur son utilisation dans des

modèles réels.

Nous allons dans cette optique implémenter l’algorithme en C++ et en Matlab, puis nous allons

répondre aux questions ci-dessous :

- L’algorithme retourne t-il souvent le diamètre exact?

- Quelle est la marge d’erreur maximale du 2-BFS ?

- Peut-on faire confiance aux résultats proposés par le 2-BFS?

Abstract

Our third year project is entitled « 2-BFS algorithm performance ». We carried out the study of this

algorithm in ISIMA and we were supervised by Mr. Christian LAFOREST, professor at LIMOS

(Clermont-Ferrand, FRANCE).

This project was suggested as a part of a national study about large graphs. In fact, graphs have

many practical applications, in many computer science sub-fields. They are used to model

communication network, rapid transit, social network …etc. Thus, we often need to know the exact

value of some graph parameters such as the diameter. However, algorithms which measure the

exact diameter take too long. The 2-BFS algorithm produces an estimate of the exact graph

diameter, and the aim of our project is to evaluate the computational efficiency since the cost of

executing algorithms is a central problem in computer science.

We were asked to implement in Matlab and C++ the 2-BFS algorithm to compute its validity bounds

in order to answer the questions below:

- How often does the algorithm return the exact diameter?

- What are the worst case error bounds for 2-BFS computations?

- Can we trust the results displayed by the 2-BFS algorithm?

Table des figures

Figure 1 Présentation des différentes tâches.................................................................................4Figure 2: Exemple de graphe connexe...........................................................................................6Figure 3: Calcul de la distance.......................................................................................................7Figure 4 Algorithme de principe du BFS.........................................................................................9Figure 5 Algorithme de principe du diamètre exact.....................................................................10Figure 6: Présentation des évolutions des temps d'exécutions des deux algorithmes pour des Graphes de Erdos Reyni (de probabilité égale à 0.3)....................................................................11Figure 7 Algorithme de principe du 2-BFS....................................................................................12Figure 8 Simulation du premier BFS sur cas simple......................................................................12Figure 9 Simulation du second BFS sur un cas simple...................................................................13Figure 10 Simulation du 2-BFS sur un graphe qui retourne le bon résultat...................................15Figure 11Simulation du 2-BFS sur un graphe avec retour d'un résultat erroné.............................15Figure 12 Simulation du 2-BFS sur un chemin..............................................................................16Figure 13 simulation du 2-BFS sur une étoile (départ du centre)..................................................17Figure 14 simulation du 2-BFS sur une étoile (départ d'une extrémité)........................................17Figure 15 simulation du 2-BFS sur une grille................................................................................18Figure 16 Simulation du 2-BFS sur un graphe complet.................................................................19Figure 17 Schématisation de la structure utilisée pour stocker les résultats.................................20Figure 18 Graphe utilisé pour illustrer la structure.......................................................................21Figure 19: Tableau contenant tous les sommets échos dans le cas d'un graphe simple................21Figure 20: Tableau contenant l'ensemble des excentricités pour un exemple..............................21Figure 21 Graphe complet privé d'une arête................................................................................22Figure 22 graphe complet privé d'une arête................................................................................23Figure 23 Cas où le 2-BFS retourne 1...........................................................................................23Figure 24 Cas où le 2-BFS retourne la valeur 2.............................................................................24Figure 25: Copies d'écran présentant quelques résultats du calcul de l'espérance.......................25Figure 26: Copies d'écrans d'exécutions de l'algorithme pour des arbres de taille variant de 50 à 100 26Figure 27 Schéma pour illustrer un chemin de diamètre égal au diamètre exact..........................27Figure 28: Courbe présentant le rapport entre le diamètre exact et l'espérance des valeurs retournés avec un pas de 10........................................................................................................29 Figure 29: Illustration de quelques valeurs statistiques dans le cas où le graphe est dense......30Figure 30: Illustration de la différence entre diamètre exacte et valeur de l'algorithme..............31Figure 31 Evolution de la probabilité d'obtenir un résultat inexact en fonction du nombre d'arêtes pour un nombre de sommets égale à 40......................................................................................32

Table des matières

Remerciements…………………………………………………………………………………………Résumé/Abstract…………………………………………………………………………….................Table des figures…………………………………………………………………………….................. Table des matières.......................................................................................................................7 Introduction.................................................................................................................................11 Présentation du projet...............................................................................................................2

1.1 Contexte.......................................................................................................................................21.2 Travail demandé...........................................................................................................................21.3 Organisation du travail.................................................................................................................5

2 Eléments de la théorie des graphes............................................................................................62.1 Premières définitions...................................................................................................................6

2.1.1 Définition (Graphe)...............................................................................................................62.1.2 Définition (Graphe connexe)................................................................................................62.1.3 Définition (Matrice d’adjacence)..........................................................................................62.1.4 Définition (Distance)............................................................................................................72.1.5 Définition (Excentricité).......................................................................................................82.1.6 Définition (Diamètre)............................................................................................................82.1.7 Définition (Rayon)................................................................................................................9

2.2 Exploration des sommets d’un graphe.........................................................................................92.3 Algorithme de calcul du diamètre exact d’un graphe................................................................102.4 L’algorithme du 2-BFS..............................................................................................................11

2.4.1 Une alternative pour réduire le temps d’exécution.............................................................112.4.2 Exemple d’exécution de l’algorithme du 2-BFS................................................................12

3 Recherche Analytique...............................................................................................................143.1 Comportement de l’heuristique sur un cas simple.....................................................................143.2 Comportement du 2-BFS sur des familles de graphes particulières..........................................16

3.2.1 Les chemins........................................................................................................................163.2.2 Les étoiles...........................................................................................................................163.2.3 La grille...............................................................................................................................173.2.4 Le graphe complet...............................................................................................................18

3.3 Comportement du 2-BFS sur des graphes connexes aléatoires ................................................193.3.1 Description de la structure de données utilisée pour les calculs.........................................193.3.2 Etude de l’heuristique sur les bornes du nombre d’arêtes .................................................223.3.3 Etude du cas particulier des arbres......................................................................................253.3.4 Evaluation de l’erreur entre le diamètre exact et celui calculé par le 2-BFS......................273.3.5 Evaluation de la probabilité d’obtenir un résultat inexact..................................................313.3.6 Premières conclusions.........................................................................................................33

4 Prolongements et limites .........................................................................................................344.1 Prolongements et réflexions sur la suite des études à menées...................................................344.2 Limites différents résultats obtenus...........................................................................................354.3 Difficultés rencontrées lors de la réalisation du projet..............................................................35

Conclusion..................................................................................................................................36 Références.................................................................................................................................37Annexes…………………………………………………………………………………………………

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Introduction

Les graphes possèdent de nombreuses applications pratiques, dans des domaines

très variés. Ils permettent, par exemple, de modéliser un réseau de transport en commun,

de réseaux sociaux, des problèmes d’ordonnancement et de routage. La taille des graphes

peu être très importante, par conséquent il est nécessaire de les manipuler par le biais

d’algorithmes rapides. Ces algorithmes permettent au programmeur de calculer des

paramètres tels que le diamètre. Dans les cas des graphes sociaux, ces paramètres sont

utilisés pour mettre en évidence les relations qui peuvent exister entre certains groupes

d’individus ou simplement des propriétés particulières. Ainsi, l'expérience du «petit

monde » de Stanley Milgram stipule que deux personnes choisies aléatoirement sont reliées

au plus par six personnes intermédiaires (ce qui signifie que le diamètre ne pourrait pas

dépasser 6).

Notre projet de fin d’études, consiste à faire une étude de l’algorithme du 2-BFS. Ce

dernier calcule une estimation du diamètre d’un graphe donné et permet de pallier les

inconvénients des algorithmes exacts qui utilisent un espace mémoire très grand et ont un

temps d’exécution très long. A l’issu de cette étude, nous devons conclure sur la pertinence

du 2-BFS et sont utilisation sur des modèles réalistes.

1

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

1 Présentation du projet

Dans cette première partie nous décrivons le contexte et les objectifs du projet. Nous

détaillons aussi la façon dont nous avons organisé le travail en binôme au cours de l’année

universitaire.

1.1 Contexte

Les graphes ont de nombreuses applications dans divers domaines liés à

l’informatique (télécommunications, transport, etc.). Dans la pratique, le programmeur est

souvent amené à manipuler des graphes de très grande taille. Par conséquent, le temps

dédié au calcul de certains paramètres de ces graphes peut donc être très long.

Il existe néanmoins des algorithmes qui peuvent travailler rapidement sur des grands

graphes mais qui ne donnent pas toujours une réponse exacte. L’objectif de notre projet est

d’implémenter et de tester un tel algorithme. Cet algorithme, appelé 2-BFS, permet

d’estimer le diamètre d’un graphe. Notre objectif est de répondre aux questions suivantes:

Existe-t-il des familles de graphes pour lesquelles l’algorithme du 2-BFS peut ne

pas retourner la valeur exacte du diamètre ?

Si oui, retourne-il souvent une valeur erronée ?

Est-ce que le 2-BFS peut retourner des valeurs très éloignées du diamètre exact ?

Dans quels contextes applicatifs cet algorithme pourrait être utilisable ?

1.2 Travail demandé

Le cahier de charge a été défini lors de notre première réunion avec monsieur

LAFOREST. La figure ci-dessous présente les tâches qui nous ont été assignées.

2

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Exemple:

Evaluer, pour certains

types de graphes, l’écart

moyen entre le résultat

calculé par le 2-BFS et

la valeur exacte du

diamètre.

Recherche

expérimentale pour

déterminer dans quels

cas l'algorithme

retourne un mauvais

résultat.

Expérimentation du

programme sur ces

différents graphes en

prenant en compte la

densité des graphes.

Programmation des

générateurs de graphes

aléatoires et

particuliers (chemins,

arbres, grilles,..)

Programmation

de l’algorithme

du 2-BFS en C++

et en Matlab

Performances de

l’algorithme2-BFS

3

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 1 Présentation des différentes tâches

Evaluer, pour certains

types de graphes, l’écart

moyen entre le résultat

calculé par le 2-BFS et

la valeur exacte du

diamètre.

Recherche

expérimentale pour

déterminer dans quels

cas l'algorithme

retourne un mauvais

résultat.

Expérimentation du

programme sur ces

différents graphes en

prenant en compte la

densité des graphes.

Programmation des

générateurs de graphes

aléatoires et

particuliers (chemins,

arbres, grilles,..)

Programmation

de l’algorithme

du 2-BFS en C++

et en Matlab

Performances de

l’algorithme2-BFS

4

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

1.3 Organisation du travail

Afin de répondre au cahier de charge établi par Mr. LAFOREST, nous avons choisi de

travailler de façon parallèle sur les deux points suivants :

Réflexion théorique sur la qualité de l’algorithme du 2-BFS

Analyse expérimentale tester les hypothèses établies.

Nos résultats théoriques et notre expérimentation étaient régulièrement validés par notre

encadrant Mr. LAFOREST au cours de réunions hebdomadaires.

5

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

2 Eléments de la théorie des graphes

Dans cette seconde partie, nous abordons les notions élémentaires de la théorie des

graphes que nous avons utilisées dans notre projet.

2.1 Premières définitions

2.1.1 Définition (Graphe)

Un graphe est caractérisé par deux ensembles notés X et E qui désignent

respectivement les sommets et les arcs. Dans la cadre de notre projet, on travaillera

uniquement sur les graphes non orientés, c'est-à-dire les graphes où les arcs (i, j) et (j, i)

sont indiscernables. De plus, nous considérerons uniquement le cas des graphes non

pondérés, où chaque sommet a la même contribution.

2.1.2 Définition (Graphe connexe)

Un graphe G est dit connexe si et seulement si, pour tout couple de sommets (i, j)

appartenant à ce graphe, on peut trouver un chemin allant de i vers j dans G.

Figure 2: Exemple de graphe connexe

2.1.3 Définition (Matrice d’adjacence)

Soit G un graphe de n sommets. La matrice d’adjacence A est la matrice de

dimension n x n telle que : aij = 1 pour tout arc (i, j) du graphe G et aij = 0 pour tous les

autres éléments de la matrice A..

Remarque: Pour la suite du rapport, nous considérons uniquement les graphes connexes

6

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

non orienté. La matrice d’adjacence de ce type de graphe est symétrique.

Exemple: Dans le cas de la figure 1 la matrice d’adjacence sera alors :

0 1 0 0

1 0 1 1

0 1 0 1

0 1 1 0

2.1.4 Définition (Distance)

La distance entre deux sommets i et j d’un graphe G est le nombre minimum d'arêtes

qu'on doit parcourir pour aller de i vers j. C’est le nombre d'arêtes correspondant au chemin

le plus court de i vers j. On notera par la suite d (i, j) la distance entre i et j.

Exemple: La distance entre le sommet 1 et le sommet 4 vaut 2. Elle correspond au chemin

tracé en rouge.

Figure 3: Calcul de la distance

7

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

2.1.5 Définition (Excentricité)

L'excentricité d'un sommet i appartenant à un graphe G est la plus grande distance

séparant i d'un autre sommet j de ce graphe. Ecc(i)= max {d (i, j) : j ∊ V}.

Exemple:

Ecc(1) = 2

Ecc(2) = 1

Ecc(3) = 2

Ecc(4) = 2

2.1.6 Définition (Diamètre)

Le diamètre D d’un graphe G est la plus grande distance possible dans G.

D = max { Ecc(i), i ∈ V }

Exemple: Diamètre = max {2, 1, 2, 2} = 2

8

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

2.1.7 Définition (Rayon)

Le rayon R d’un graphe G est, à l’inverse du diamètre, le minimum des excentricités

des sommets de G.

Exemple: Si nous reprenons l’exemple précédent, nous obtenons R = min {2, 1, 2, 2} = 1.

2.2 Exploration des sommets d’un graphe

En théorie des graphes, il existe plusieurs algorithmes de parcours. Dans le cadre de

notre projet de fin d’études, nous utiliserons le parcours en largeur que l’on appelle aussi

BFS (Breadth First Search). Il permet d’explorer l’ensemble des sommets du graphe par

voisinage.

Algorithme de principe du BFS

- (a) On choisit un sommet de départ et on l’insère dans une file ;

- (b) On retire le premier sommet de la file et on le marque ;

- (c) On insère tous ses sommets adjacents qui ne sont pas marqués dans la file ;

- (d) Si la file est non vide, alors on revient au point (b).

Implémentation du BFS

Figure 4 Algorithme de principe du BFS

9

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Exemple: Considérons le graphe ci-dessous. Si on choisit le sommet 1 comme sommet de

départ.

Le BFS va parcourir dans l’ordre les sommets : 1, 2, 3, 4.

2.3 Algorithme de calcul du diamètre exact d’un graphe

On sait que le diamètre d’un graphe G est défini comme étant la plus grande distance

possible G. Pour calculer le diamètre exact d’un graphe, le premier algorithme auquel on

pourrait penser consiste à faire un parcours en largeur à partir de tous les sommets pour

connaître leur excentricité et de retourner ensuite le maximum des excentricités.

Figure 5 Algorithme de principe du diamètre exact

Dans la pratique, la mise en œuvre de cet algorithme glouton sur des graphes possédant de

nombreux sommets peut être très coûteuse en termes de temps de calcul.

10

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

2.4 L’algorithme du 2-BFS

2.4.1 Une alternative pour réduire le temps d’exécution

Le 2-BFS qualifié d’heuristique car il fait appel à l’aléatoire pour le choix des sommets

de départs. L’intérêt du 2-BFS par rapport à l’algorithme glouton et qu’il offre un temps

d’exécution plus court. De plus, les expérimentations menés sur les graphe d’Erdos Reyni,

nous on permis de constater une augmentation sensible du rapport des deux temps

d’exécutions en fonction nombre de sommets.

Figure 6: Présentation des évolutions des temps d'exécutions des deux algorithmes pour des Graphes de Erdos Reyni (de probabilité égale à 0.3)

11

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Le principe du 2-BFFS est le suivant :

Figure 7 Algorithme de principe du 2-BFS

2.4.2 Exemple d’exécution de l’algorithme du 2-BFS

Mettons en pratique le 2-BFS sur la figure 2.

Si on prend le sommet 1 comme sommet de départ alors on a :

Figure 8 Simulation du premier BFS sur cas simple

Le sommet le plus éloigné sont les sommets 3 et 4, on applique maintenant 2-BFS à partir du

sommet 4 par exemple.

12

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 9 Simulation du second BFS sur un cas simple

Le résultat retourné par le 2-BFS est donc 2 car cela correspond à la plus grade distance

obtenue lors de la deuxième exécution du BFS.

13

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

3 Recherche Analytique

Dans cette section, nous nous intéressons particulièrement à l’analyse théorique du

problème. Précédemment, nous nous sommes intéressés à des familles de graphes

particuliers. Nous, nous allons par la suite de prolonger ces analyses à des graphes de plus

grande taille générés de façon aléatoire.

3.1 Comportement de l’heuristique sur un cas simple

Initialement, nous avons simulé les exécutions de l’heuristique sur des graphes

simples pour répondre à la question théorique suivante:

Existe-t-ils des graphes pour lesquels l’algorithme du 2-BFS ne retourne pas le diamètre

exact ? (Q1)

Exemple1 : le 2-BFS retourne le bon diamètre

La figure ci-après représente un graphe aléatoire sur lequel nous allons simuler une

exécution du 2-BFS. Dans cette figure, les valeurs en rouge correspondent à la distance

entre G – choisi comme sommet de départ – et les autres sommets du graphe. Après

exécution du 2-BFS, on remarque que le sommet A est e plus éloigné de G. A est appelé

sommet «écho». Nous appliquons ensuite un deuxième BFS à partir de A. Le résultat

retourné correspond exactement à la valeur de diamètre.

14

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

- Diamètre retourné par le 2-BFS = 4

- Diamètre exact = 4

a

c

b

d f

e

g

0

1

2

2

3

4

3

0

1

2

1

2

3

4

Diamètre Exact = 4Diamètre Retourné = 4

Point « echo »Point de départ

Figure 10 Simulation du 2-BFS sur un graphe qui retourne le bon résultatExemple 2: le 2-BFS ne retourne pas le bon diamètre

On prend B comme sommet de départ.

- Diamètre exact = 4

- Diamètre retourné par le 2-BFS = 3

Figure 11Simulation du 2-BFS sur un graphe avec retour d'un résultat erroné

15

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Réponse à Q1 : Il existe bien des graphes dans lesquels l’algorithme peut ne pas retourner

le résultat exact.

3.2 Comportement du 2-BFS sur des familles de graphes particulières

3.2.1 Les chemins

Dans le cas du chemin, le 2-BFS retournait toujours le diamètre exact. En effet, quel que soit

le sommet de départ qu’on choisi, le sommet le plus éloigné est l’une des extrémités du

chemin. La deuxième exécution du BFS nous permet de conclure que la distance entre les

deux extrémités du chemin est la valeur exacte du diamètre.

Le schéma ci-dessous représente une exécution du 2-BFS sur un chemin. On choisit le

sommet 3 comme sommet de départ.

Figure 12 Simulation du 2-BFS sur un chemin- Diamètre exact = 5

- Diamètre retourné par le 2-BFS = 5

3.2.2 Les étoiles

Dans le cas d’une étoile, il y a 2 cas à tester. Soit on choisit le centre comme sommet de

départ, soit on choisit l’extrémité d’une branche comme sommet de départ. Les expériences

que nous avons menées, nous ont permis de constater que le 2-BS retournait le bon

diamètre dans les deux cas

Cas 1 : on prend le centre de l’étoile comme sommet de départ

16

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 13 simulation du 2-BFS sur une étoile (départ du centre)- Diamètre exact = 2

- Diamètre retourné par le 2-BFS = 2

Cas 2: on prend une extrémité (sommet C, par exemple) comme sommet de départ

Figure 14 simulation du 2-BFS sur une étoile (départ d'une extrémité)- Diamètre exact = 2

- Diamètre retourné par le 2-BFS = 2

3.2.3 La grille

Soit n le nombre de colonnes de la grille et p le nombre de lignes. On sait que le diamètre

correspond à la distance entre deux sommets de la grille. Les sommets les plus éloignés sont

les deux extrémités de la diagonale de la grille. Le diamètre exact est donc donné par la

formule suivante : D = (n–1) + (p–1) = n + p - 2.

Voici un exemple d’exécution du 2-BFS sur une grille de 3 lignes et 3 colonnes.

17

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 15 simulation du 2-BFS sur une grille- Diamètre exact = 3 + 3 – 2 = 4

- Diamètre retourné par le 2-BFS = 4

Etant donné que le diamètre exact correspond à la distance entre deux coins, si un BFS est

lancé à partir de n'importe quel coin alors la distance maximale retournée sera le diamètre

exact puisque pour tous les coins, il existe un chemin de distance maximale qui sera

considéré par le BFS. Donc si le point echo est un des coins, l'algorithme nous donnera

toujours le bon résultat. De plus, pour chaque sommet ne correspondant pas à un coin, le

sommet le plus éloigné correspond toujours à un coin. En conclusion, quel que soit le point

choisi on arrivera toujours au schéma nous renvoyant le diamètre exact. C'est pourquoi

l'algorithme est exact pour ce type de graphe

Remarque : Le chemin est un cas particulier de la grille. C’est une grille composée d’une

seule ligne.

3.2.4 Le graphe complet

Un graphe complet à n sommets est un graphe dont les sommets sont tous reliés deux à

deux par une arête. Ce graphe a 2

)1( −× nnarêtes.

Dans le cas d’un graphe complet, l’algorithme du 2-BFS, retourne toujours le diamètre exact.

En effet, tous les sommets sont deux à deux reliés par une arête, donc le distance entre

deux sommets différents est toujours égale à 1.

Voici un exemple qui permet d’illustrer cette propriété.

On prend A comme sommet de départ.

18

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 16 Simulation du 2-BFS sur un graphe complet

- Diamètre exact = 1

- Diamètre retourné par le 2-BFS = 1

Conclusion: Il existe donc des familles de graphes où l’heuristique devient un algorithme

exact.

Remarque: A l’inverse, on pourrait se demander s’il existe des familles de graphes le 2-BFS

se tromperait systématiquement. Cela n’est pas possible car il existe toujours une

probabilité non nulle d’obtenir le diamètre exact. En effet, notons u et v deux sommets qui

sont les plus éloignés d’un graphe G. Si l’on exécute l’algorithme du 2-BFS en partant de u,

alors on est sûr qu’un des sommets échos sera v puisqu’il est le plus éloigné de u. En

effectuant le deuxième BFS on est alors sûr de retourner la valeur exacte du diamètre.

3.3 Comportement du 2-BFS sur des graphes connexes aléatoires

Objectif: Nous avons précédemment établi l’existence de graphes pour lesquels le 2-BFS ne

retourne pas le diamètre exact. Nous devons maintenant évaluer cette erreur. On note DG le

diamètre exact du graphe G, et on note DG’ la plus petite valeur retournée par le 2-BFS. On

veut montrer l’assertion suivante :

∀G, ∃k tel que DG - DG’ = k (*)

Pour prouver l’équation (*), il est nécessaire de rappeler la propriété ci-après qui permet

d’encadrer le nombre d’arêtes d’un graphe connexe donné :

n–1 ≤ nombre d’arêtes ≤ 2

)1( −× nn (**)

3.3.1 Description de la structure de données utilisée pour les calculs

Pour optimiser la phase d’expérimentation du 2-BFS, nous avons tenté de trouver une

19

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

structure de données adéquate. Le choix de cette structure doit permettre de réduire le

temps d’exécution de l’algorithme. Nous avons donc opté pour l’utilisation de deux

tableaux. Le premier tableau est de longueur n, où n est le nombre de sommet du graphe G

considéré. Chaque cellule d’indice u contient un pointeur vers un autre tableau contenant

les sommets les plus éloignés du sommet u du graphe G. Quant au second tableau, il est

également de longueur n et sera utilisé pour stocker l’excentricité de chaque sommet de G.

Entrée : Graphe G= (V,E)

V= {1,...,n}

1

n

Tableau contenant les sommets les plus éloignés de u

1

n

Ecc(u)

Tableau contenant les excentricités de chaque sommet

Tableau 1

Tableau 2

Tableau 3

Figure 17 Schématisation de la structure utilisée pour stocker les résultats

Exemple:

20

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 18 Graphe utilisé pour illustrer la structureSi nous prenons le graphe ci-dessus comme exemple, le contenu des deux tableau est

comme suit :

Figure 19: Tableau contenant tous les sommets échos dans le cas d'un graphe simple

Figure 20: Tableau contenant l'ensemble des excentricités pour un exemple

21

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

3.3.2 Etude de l’heuristique sur les bornes du nombre d’arêtes

3.3.2.1 Etude sur un graphe complet privé d’une arête

Dans le cas d’un graphe complet G que l’on prive d’une arête, le diamètre exact du graphe

G’ obtenu est égal à deux. L’exécution du 2-BFS sur G’ retourne donc 1 ou 2. Nous allons

mesurer la probabilité d’obtenir chacune de ces deux valeurs.

Exemple:

Figure 21 Graphe complet privé d'une arête

Démarche scientifique: Nous allons calculer l’espérance du diamètre retourné par

l’algorithme du 2-BFS car c’est un bon indicateur de la performance de l’algorithme. Par

conséquent plus l’espérance sera proche du diamètre exact, plus l’algorithme sera

performant.

Définition (Espérance):

Si X est une variable aléatoire qui prend un nombre fini de valeurs réelles x1, x2, …, xn avec

des probabilités respectives p1, p2, …pn alors l’espérance de X est donnée par:

E(X) =∑=

=

ni

i

iixp1

Remarque importante: Lorsque l’espérance du diamètre retourné par l’algorithme du 2-

BFS, on peut conclure que ce dernier retourne le bon diamètre. Dans le cas contraire, on

peut seulement avancer que le

2-BFS peut ne pas retourner le diamètre exact.

Analyse: Revenons au graphe G’ obtenu après la suppression d’une arête d’un graphe

complet G. Lors de l’exécution du premier BFS sur G, si nous choisissons comme sommet de

départ un des sommets de l’arête supprimée, alors l’algorithme retournera certainement 2.

22

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Exemple 1: On choisit D comme sommet de départ

Figure 22 graphe complet privé d'une arête

SI nous choisissons D (ou C) comme sommet de départ, alors on est sûr que l'algorithme

retournera 2 comme résultat. En effet, le premier BFS nous retournera l'autre sommet

(c'est-à-dire C) comme étant le plus éloigné et le deuxième BFS nous retournera

l’excentricité de ces sommets qui vaut 2.

Exemple 2-a :

- Nous partons de A lors du premier BFS

- Nous partons de B lord du second BFS

- Le 2-BFS retourne la valeur 1

Figure 23 Cas où le 2-BFS retourne 1

23

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Exemple 2-b :

- Nous partons de A lors du premier BFS

- Nous partons de C lors du second BFS

- Le 2-BFS retourne la valeur 2

Figure 24 Cas où le 2-BFS retourne la valeur 2

On note D’ le diamètre retourné par le 2-BFS. Nous pouvons déduire que:

p(D’ = 1) =)1(

)3()2(

−×−×−

nn

nn

or E(D’) = p(D’ = 1) ×1 + p(D’ = 2) × 2 et de plus p(D’ = 2) + p(D’ = 1) = 1

d’où :

Espérance = )1(

)3)(2()1(2

−×−−−−×

nn

nnnn

Illustrations des calculs:

24

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 25: Copies d'écran présentant quelques résultats du calcul de l'espérance

Remarque: On peut préciser que lorsque n augmente, l’espérance tend alors vers 1 ce qui

veut dire que l’on se trompe de plus en plus souvent.

3.3.3 Etude du cas particulier des arbres

Dans le cas où le graphe est un arbre nous avons conjecturé que l’algorithme

retournait systématiquement le résultat exact. En effet nos résultats numériques

confirment cette conjecture. Néanmoins nous n’avons pas réussir à le prouver. La figure 26

illustre quelques copies d’écrans des résultats obtenus pour des arbres de différentes tailles.

25

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 26: Copies d'écrans d'exécutions de l'algorithme pour des arbres de taille variant de 50 à 100

26

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

3.3.4 Evaluation de l’erreur entre le diamètre exact et celui calculé par le 2-BFS

Nous avons à-priori établi l’hypothèse suivante:

2

GD ≤ D’ ≤ DG. où D’ représente le diamètre retourné par le 2-BFS et DG le diamètre

exact du graphe G.Preuve de l'encadrement:

Nous allons d’abord montrer l’inégalité suivante: D’ ≤ DG.

On sait que le diamètre retourné par le BFS est l’excentricité du sommet écho. Or, par

définition, le diamètre exact est le maximum des excentricités des sommets du graphe.

D’où l’inégalité D’ ≤ DG.

Il nous reste à prouver que : 2

GD ≤ D’. Pour cela, considérons le schéma ci-dessous:

Figure 27 Schéma pour illustrer un chemin de diamètre égal au diamètre exact

On a d(s, r) ≤ Ecc(r) et d(r, t) ≤ Ecc(r) pour tous les sommets r du graphe G. En effet,

toutes les distances de s à r sont majorées par son excentricité.

D’où :

d(s, r) + d(r, t) ≤ 2×Ecc(r)

De plus d(s, t) ≤ d(s, r) + d(r, t) (inégalité triangulaire)

Cela implique que d(s, t) ≤ d(s, r) + d(r, t) ≤ 2×Ecc(r)

Dans le graphe que nous avons considéré, les sommets les plus éloignés sont s et t.

Donc, le diamètre exact est DG = d(s, t).

L’inégalité étant valable pour tous les sommets du graphe G, elle est donc valable pour

27

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

toutes les exécutions possibles du 2-BFS.

DG <= 2×D’ c’est à dire 2

GD ≤ D’.

On peut donc conclure la formule établi :

2

GD <= DG ≤ DG

Remarque: Il existe des graphes pour lesquels la valeur retourné par l’algorithme du 2-BFS

peut valoir exactement2

GD. Cf. cas du graphe complet privé d’une arête.

Expérimentation: Nous avons pris n=100 et nous sommes passés progressivement de

l’arbre à (n-1) arêtes au graphe complet à 2

)1( −× nn arêtes.

Justification: Nous avons confronté la propriété (* encadrement) à une expérimentation.

Pour cela, nous avons généré aléatoirement des graphes dont le nombre d’arêtes varie de

n-1 à 2

)1( −× nn où n= 100 est le nombre de sommets. A chaque itération (pas 10), on

calcule le diamètre exact avec l’algorithme glouton décrit dans le paragraphe.

Ensuite on récupère l’espérance en appliquant la méthode de calcul (cf. calcul de

l’espérance ci –dessus). Finalement on représente le rapport diamètre exact / espérance.

Ainsi, la figure 28 illustre graphiquement une exploration.

- lorsque Diamètre exact/espérance = 1 ⇒ Algorithme est exact.

- sinon il y a susceptibilité d’obtenir un résultat inexact.

28

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 28: Courbe présentant le rapport entre le diamètre exact et l'espérance des valeurs retournés avec un pas de 10

Remarque: On constate donc que l’inégalité est vérifiée. On remarque également deux

zones susceptibles de retourner un mauvais résultat aux extrémités du graphique. Nous

avons donc affiné les calculs en choisissant un pas de 1 et en calculant d’autres valeurs

numériques. Ainsi dans la figure ci-dessous, on représente dans la zone de perturbation

proche de l’arbre (entre 4000 et 4900 arêtes), l’espérance (en haut à gauche), l’écart

type(en bas) et le pourcentage de certitude absolue (pourcentage de cas où toutes les

exécutions retournent le diamètre exact).

29

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 29: Illustration de quelques valeurs statistiques dans le cas où le graphe est dense

Le fait que l’on puisse encadrer la valeur du diamètre retourné entre le diamètre

exacte divisé par 2 et le diamètre exacte est un premier début pour justifier que l’algorithme

ne se trompe pas de beaucoup. Cependant cet encadrement n’est plus pertinent lorsque le

diamètre du graphe devient trop important.

Il semblerait aussi que la différence entre le diamètre exact et la valeur retournée

n’excède que de très peu. Ci-après, une illustration numérique où l’on a représenté en

abscisse le nombre d’arêtes et en ordonnée la différence entre le diamètre exact et la plus

petite valeur susceptible d’être retourné par le 2-BFS. (On a choisi 40 sommets)

N.B. On retrouve de la même façon que dans la figure 28, une zone où il semblerait que l’on

retrouve constamment le bon résultat.

30

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 30: Illustration de la différence entre diamètre exacte et valeur de l'algorithme

3.3.5 Evaluation de la probabilité d’obtenir un résultat inexact

Nous avons vu précédemment que lorsque l’on se trompe, l’écart entre la valeur

retourné et le diamètre exact était peu élevé. La question que l’on se pose est de savoir si

on est capable de se tromper de beaucoup. Un des éléments de réponse réside dans le fait

que lorsque l’on explore l’ensemble des graphes connexes, il existe des graphes où lequel la

probabilité de se tromper avoisine les 95 % de pourcentage d’erreurs. On a donc

assurément l’existence de graphe où l’on peut se tromper très régulièrement. La figure ci-

dessous en illustre l’existence.

31

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Figure 31 Evolution de la probabilité d'obtenir un résultat inexact en fonction du nombre d'arêtes pour un nombre de sommets égale à 40

32

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

3.3.6 Premières conclusions

Nous allons maintenant tenter de résumer, l’ensemble des résultats obtenus.

1. Il existe des familles de graphes pour lesquels l’algorithme retourne un diamètre

inexact,

2. Néanmoins, quel que soit le graphe la probabilité d’obtenir le diamètre exact résultat

est non nulle,

3. Il existe des familles de graphes pour lesquels l’algorithme retourne systématiquement

la valeur exacte.

4. Il semblerait que le 2-BFS se trompe de peu.

5. Il existe des graphes où la probabilité de se tromper est très élevé.

6. On a aussi remarqué la présence d’une zone pour lequel le 2-BFS retourne toujours le

bon diamètre. Comme on peut le voir sur la figure, ce domaine va de 1500 à 4500

arêtes. (dans cette zone on ne se trompe pas souvent)

7. Les bornes établis théoriquement sont relativement intéressante pour des petits

diamètres (pour des grands diamètres, l’écart entre les bornes devient important).

33

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

4 Prolongements et limites

Cette section présente les possibilités de prolongements nos calculs. Enfin nous

évoquerons dans une troisième partie les difficultés rencontrées tout au long du projet.

4.1 Prolongements et réflexions sur la suite des études à menées

A travers ce projet, nous avons répondu à certaines questions avec certitude.

Néanmoins, il est à noter que certains résultats n’ont pas des conclusions définitives et

doivent être soumises à des études plus complètes.

En premier lieu, nous avons évoqué dans nos résultats l’existence d’une zone de

palier, où l’algorithme renvoie systématiquement le diamètre exact. Il serait intéressant

d’étudier de manière plus précise cette zone de confiance, car elle a été constatée sur

certains tests (en particulier n = 100 sommets). La question à se poser serait :

Questions : Est-ce qu’il y a constamment présence d’une zone de confiance quel que soit

la taille du graphe ? Est-ce qu’elle évolue ? Est-elle périodique ?

En second lieu, nous avons montré dans les précédents résultats qu’il existait des

graphes où l’on pouvait se tromper souvent. Il serait donc intéressant de déterminer si ces

graphes ont une caractéristique particulière. On pourrait alors se poser les questions

suivantes :

Questions : Il y a-t-il plus de graphe où l’on se trompe souvent que de graphe où l’on se

trompe peu ? Peut-on borner dans certaines zones la probabilité que l’on obtient un

résultat inexact ?

Nous avons aussi évoqué le fait que l’inexactitude des valeurs de l’algorithme était

selon vraisemblance peu élevé. Néanmoins, il reste à démontrer de manière générique que

l’on peut affiner la borne qui minimise les valeurs retournées pour certains graphes. On

peut donc proposer comme question de prolongement :

Questions : Quels sont les familles de graphes où les erreurs de l’heuristique sont

marginales ?

Enfin, dans un souci d’apporter des résultats encore plus concrets, il aurait été

intéressant de s’intéresser au comportement de l’heuristique pour des graphes sociaux. 34

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Faute de temps, nous n’avons pu étudier des graphes sociaux de grandes tailles. Nous avons

d’ailleurs récemment découvert qu’un groupe d’étudiants de deuxième année s’intéressait

plus particulièrement dans leur projet aux graphes sociaux. Même si ces graphes ne sont

pas connexes, il aurait été intéressant d’apporter des analyses complémentaires.

4.2 Limites différents résultats obtenus

Malgré nos résultats expérimentaux, nous tenons à être très prudent sur les

conclusions que nous pouvons déduire. En effet, pour certaines de nos conclusions, il s’agit

uniquement de constatations. Elles doivent donc pour être définitivement validées, être

sujettes à des démonstrations suffisamment rigoureuses. C’est pourquoi, il est nécessaire

d’effectuer des études plus approfondies pour justifier de leur pertinence.

4.3 Difficultés rencontrées lors de la réalisation du projet

Au cours de notre projet, nous avons confronté les programmes réalisés en Matlab et

en C++. De cette confrontation, nous avons conclu qu’il était plus judicieux de faire appel à

une libraire préalablement implémentée. Cela permet de pallier la réflexion concernant le

choix de la meilleure structure de données. Le programme réalisé en Matlab grâce à la

bibliothèque BGL, a donc été plus rapide et efficace que celui réalisé en C++. Le tableau ci-

dessous représente le temps d’exécution des deux programmes en fonction du nombre de

sommets des graphes. Plus le nombre de sommets est grand, plus le rapport entre les temps

d’exécution devient considérable.

En Matlab En C++

Graphe de 20 sommets 0.00124 secondes 0.01233 secondes

Graphe de 70 sommets 0.00241 secondes 2.4 secondes

Graphe de 100 sommets 0.012478 secondes 60 secondes

On a finalement décidé d’effectuer l’ensemble de nos calculs sur Matlab.

35

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Conclusion

Notre projet de fin d’études nous a permis de déployer les techniques de

programmation que nous avons acquises en C++ et en Matlab. Il nous a également permis

d’approfondir nos connaissances en théorie des graphes Nous avons été confronté à une

étude sur des modèles de graphes de très grande taille. On retrouve ce type de graphes

dans des cas réels de l’informatique industrielle ou en télécommunications. Cette

expérience a été un enrichissement pour notre culture en recherche opérationnelle.

D’un point de vue humain, nous avons rencontré des difficultés de communication

liées au travail d’équipe puisqu’il a fallu régulièrement faire une comparaison entre les

résultats obtenus de chaque côté. Ces difficultés ont été surmontés car nous nous avions de

chaque côté la volonté que ce projet puisse aboutir.

36

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Références

[1] Documentation de la librairie matlab_bgl http://www.stanford.edu/~dgleich/programs/matlab_bgl/matlab_bgl_v2.1.pdf)

[2] Daniel Broderick Arneson et piotr rudnicki Recognizing Chordal Graphs : Lex BFS and MCS http://www.mizar.org/fm/2006-14/pdf14-4/lexbfs.pdf

[3] Sylvie Hamel, Université de Montréal, 2009http://www.iro.umontreal.ca/~hamelsyl/parcoursA09_4.pdf

[4] Derek G .CORNEIL, Fredor F .DRAGAN, Michel HABIB et Christophe Paul, Diameter Determination on Restricted Graph Familieshttp://www.springerlink.com/content/yr3tg81ckgljgh4d/fulltext.pdf

37

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Annexes : Présentation des codes sources

Matlab

Réalisation du programme en Matlab

Afin de réaliser la conception de l'algorithme, nous avons utilisé une librairie qui

permet de manipuler facilement les graphes. La toolbox utilisée s'appelle matlab_bgl et est

téléchargeable à cette adresse :http://www.stanford.edu/~dgleich/programs/matlab_bgl/

Structure des fichiers

La conception du programme est séparée en plusieurs fichiers. Certains fichier

permettent de construire des graphes en particulier (arbre.m pour la création d'un arbre),

d'autres se concentrent sur l'algorithme (exact.m pour l'algorithme retournant le diamètre

exact, deux_bfs pour l'implémentation de l'algorithme deux_bfs), enfin Statistiques.m est le

fichier d'exécution qui permet via un menu de choisir les tâches à effectuer. Il y a en plus de

cela des scripts permettant d’explorer un certain nombre de graphes en calculant

différentes données.

i

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Arbre .m

%--------------------------------------------------------------------------% Fonction permettant de créer un arbre à partir d'un graphe complet%-------------------------------------------------------------------------- function [complet] = arbre(complet,n) %Pour avoir de bonnes valeures aléatoiresrand('twister',sum(100*clock)); nb_arete = n*(n-1)/2;test = 1; %--------------------------------------------------------------------------%Tant que l'on a pas obtenu un arbrewhile nb_arete > n-1 bool = 1; while bool==1 bool = 0; %---------------------------------------------------------------------- %On choisit une arête au hasard u = ceil(n*rand); v = ceil(n*rand); val = complet(u,v); %Si on peut enlever l'arête if (val==1) %On l'enlève... complet = retirer_arete(complet,u,v); %------------------------------------------------------------------------- %...En regardant la connexité!!! %On effectue un bfs sur un sommet au hasard r = ceil(n*rand); [d,dt,pred] = bfs(complet,r); %Si un des prédecesseurs(exceptés celui choisi) est nul cela veut dire %que ce n'est pas connexe for i=1:length(pred) if i~=r if pred(i)==0 test = 0; end end end % On remet l'arête si le graphe n'est plus connexe et on

ii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

% recommence la recherche d'arête if test==0 complet(u,v) = 1; complet(v,u) = 1; bool = 1; test = 1; end % Dans le cas où l'arête n'existe pas on teste une autre arête else bool = 1; end end nb_arete = nb_arete - 1; endend

iii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Calcul.esperance.m

%-----------------------------------------------------------------------% Fonction qui permet de calculer numériquement l'espérance d'un graphe%----------------------------------------------------------------------- function esp = calcul_esperance(S,n,diametre,tab) %Initialisation du calcul de l'espéranceesp = 0; %On applique la formule de l'espérance dans le cas discret on va donc%évaluer à chaque fois la probabilité que le diamètre vaut k for k=1:diametre %Initialisation du calcul de la probabilité p = 0; for i=1:n %On récupère les sommets echos vec = S{1,i}; l = length(vec); %On évalue la probabilité en tenant compte de la taille du vecteur %contenant les sommets echos p = p + length(find(tab(vec)==k))/l; end % On n'oubli pas de diviser par n car le premier choix du sommet est % choisi de manière équiprobable p= p/n; % On met à jour la valeur de l'espérance esp = esp + k*p; end

iv

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

creation_graphe.m

% Fonction qui permet de générer un graphe à n sommet et m arêtes.% Pour cela on part du graphe complet à n sommet.% Puis on enleve des arêtes en gardant le graphe connexe. function [graphe] = creation_graphe(n,m,complet) %Pour avoir de bonnes valeures aléatoiresrand('twister',sum(100*clock)); cpt = n*(n-1)/2;test = 1; while cpt > m %---------------------------------------------------------------------- %On choisit une arête au hasard u = ceil(n*rand); v = ceil(n*rand); val = complet(u,v); %Si on peut enlever l'arête if (val==1) %On l'enlève... complet = retirer_arete(complet,u,v); %------------------------------------------------------------------------- %...En regardant la connexité!!! %On effectue un bfs sur un sommet au hasard r = ceil(n*rand); [d,dt,pred] = bfs(complet,r); %Si un des prédecesseurs(exceptés celui choisi) est nul cela veut dire %que ce n'est pas connexe for i=1:length(pred) if i~=r if pred(i)==0 test = 0; end end end % On remet l'arête si le graphe n'est plus connexe et on % recommence la recherche d'arête if test==0 complet(u,v) = 1; complet(v,u) = 1; test = 1; else cpt = cpt - 1;

v

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

end end endgraphe = complet; end

vi

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

deux_bfs.m

%--------------------------------------------------------------------------% Fichier M edité par Rachid dans le cadre du projet deux_bfs 2009-2010% Pour toute questions n'hésitez pas à nous contacter à l'adresse% [email protected]%-------------------------------------------------------------------------- function [diam]=deux_bfs(A) % Pour obtenir le nombre de sommetsn = size(A,1);% Pour avoir de bonnes valeurs aléatoires (la graine change régulièrement% d'où l'indépendance des résultats) rand('twister',sum(100*clock)); % Récupération d'un sommet aléatoirer = ceil(n*rand); % Exécution du premier BFS[d,dt,pred] = bfs(A,r); % Récupération des sommets les plus éloignés[y,L] = max(d);long = length(L); if long>=2 % Si on a plusieurs sommets echos on en choisit un aléatoirement s = ceil(long*rand); [d,dt,pred] = bfs(A,L(s)); diam = max(d);else % Si on en a qu'un seul [d,dt,pred] = bfs(A,L); diam = max(d);end end

vii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

exact. m

%Fichier M edité par Rachid dans le cadre du projet deux_bfs 2009-2010%Pour toute questions n'hésitez pas à nous contacter à l'adresse%[email protected] [diam]=exact(A) %chdir('Projet ZZ3/matlab_bgl'); n = size(A,1); % Pour obtenir le nombre de sommetsdiam = 0; for i=1:n [d,dt,pred] = bfs(A,i); y = max(d); if y>=diam diam = y; endend end

exact_liste

%Fichier M edité par Rachid dans le cadre du projet deux_bfs 2009-2010%Pour toute questions n'hésitez pas à nous contacter à l'adresse%[email protected]%% S contient une structure contenant le sommet % tab est un tableau contenant les excentricités de chaque sommet%-------------------------------------------------------------------------- function [tab,S]=exact_liste(A) % Pour obtenir le nombre de sommetsn = size(A,1); for i=1:n [d,dt,pred] = bfs(A,i); y = max(d); vec = find(d==y); S{1,i}= vec; tab(i)=y;end end

viii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

graphe_alea.m

%Fichier M edité par Rachid dans le cadre du projet deux_bfs 2009-2010%Pour toute questions n'hésitez pas à nous contacter à l'adresse%[email protected] function [res]=graphe_alea(n,p) %Génére un graphe aléatoire nombre de sommet n, probabilité p %On génere un graphe aléatoire de erdos_reynires = erdos_reyni(n,p);bool = 0;%On choisit un sommet au hasardr = ceil(n*rand); %Tant que l'on a pas trouvé un graphe connexewhile bool==0 bool=1; %On effectue un bfs sur le sommet chosii [d,dt,pred] = bfs(res,r); %Si un des prédecesseurs(execptés celui choisi) est nul cela veut dire %que ce n'est pas connexe for i=1:length(pred) if i~=r if pred(i)==0 bool = 0; end end end %Si ce n'est pas connexe on en regenère un autre et on va tester dans %la boucle suivante si ce nouveau graphe est connexe if bool==0 res = erdos_reyni(n,p); endend end

ix

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

grille .m

function [M]=grille(n,p) % n représente le nombre de colonnes% p représente le nombre de lignes % Initialisation de la matrice d'incidenceM=sparse(n*p,n*p); % On va s'occuper des arêtes sur les lignes err=n; for i=1:(n*p)-1 if i~=err M(i,i+1)=1; else err=err+n; endend % Puis on s'occupe de celle des colonnes for i=1:n*(p-1) M(i,i+n)=1; end % Pour obtenir la matrice symétrique désirée M=max(M,M'); end

x

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

retirer_arete_alea.m

%-----------------------------------------------------------------------% Fonction qui permet de retirer alétoirement une arête d'un graphe%----------------------------------------------------------------------- function [graphe]=retirer_arete_alea(graphe,n) val=0;while val~=1 u = ceil(n*rand); v = ceil(n*rand); val = graphe(u,v);endgraphe(u,v) = 0;graphe(v,u) = 0; end

xi

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

statistiques.m

%Fichier M edité par Rachid dans le cadre du projet deux_bfs 2009-2010%Pour toute questions n'hésitez pas à nous contacter à l'adresse%[email protected]%-------------------------------------------------------------------------- %--------------------------------------------------------------------------%Script pour faire des statistiques sur les graphesclear all;clc; n=100;p=10;q=1; choix = menu('Choix du Graphe et des donnnées','Graphe Aléatoire(Erdos_Reyni)','Grille','Graphe Complet - 1 arête','Arbre');if(choix==1) graphe = graphe_alea(n,0.3); taille = n;elseif(choix==2) graphe = grille(p,q); taille=p*q; elseif(choix==3) %-------------------------------------------------------------------------- % Création du graphe Complet taille = n; graphe = ones(n) - eye(n); graphe = sparse(graphe); %-------------------------------------------------------------------------- % Pour tester la formule de l'esperance on va enlever aléatoirement une % arete graphe = retirer_arete_alea(graphe,n); elseif(choix==4) %------------------------------------------------------------------------- %Créer un arbre en partant du graphe complet taille = n; %------------------------------------------------------------------------- %Création du graphe complet complet = ones(n) - eye(n); complet = sparse(complet); graphe = arbre(complet,n); end

xii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

%--------------------------------------------------------------------------% Calcul a faire commun à tous les choix [tab,S] = exact_liste(graphe);diametre = max(tab);donnee = []; %--------------------------------------------------------------------------% Affichage des propriétés du graphe disp('********************************');disp('Nombre de sommets du Graphe :');disp(n);disp('Rayon du Graphe :');disp(min(tab));disp('Diametre du Graphe :');disp(max(tab));disp('********************************'); val = menu('Choix du type de Statistiques','Statistique sur un nombre d''essais','Statistiques à partir de l''ensemble des valeurs possibles du graphe'); if (val==1) [d,dt,pred]=bfs(graphe,1); %-------------------------------------------------------------------------- %Satistiques à partir d'un échantillon r = input('Combien voulez vous de tests : '); for i=1:r donnee = [donnee deux_bfs(graphe)]; end Dmoy=mean(donnee); disp('Valeur moyenne égale à');disp(Dmoy); %-------------------------------------------------------------------------- %Statistiques à partir de l'ensemble des valeurs possibles du grapheelse % Construction des données for i=1:taille temp = S{1,i}; vect = tab(temp); for j=1:length(temp) donnee = [donnee vect(j)]; end end if (choix==3) % Calcul des deux espérances proba_theo = (n-2)*(n-3)/(n*(n-1)); esperance_prat = calcul_esperance(S,n,diametre,tab); esperance_theo = proba_theo + (1-proba_theo) * 2;

xiii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

disp('----------- Affichage des différents résultats-----------'); disp('Valeur theorique de l''esperance :');disp(esperance_theo); disp('Valeur calculée de l''esperance :');disp(esperance_prat); else for i=1:taille temp = S{1,i}; vect = tab(temp); for j=1:length(temp) donnee = [donnee vect(j)]; end end end Dmin=min(donnee); Dmax=max(donnee); Dmoy=mean(donnee); % disp('Valeur minimum égale à');disp(Dmin); % disp('Valeur moyenne égale à');disp(Dmoy); % disp('Valeur maximum égale à');disp(Dmax); chx=menu('Souhaitez vous un affichage graphique des résultats','Oui','Non'); if (chx==1) for i=1:length(donnee) y(i)=length(find(donnee==i)); end bar(y,0.1); text(Dmin,0,'Dmin'); text(Dmax,0,'Dmax'); xlabel('Valeur des diamètres retournés'); ylabel('Nombre de fois où on atteint la valeur'); end end

xiv

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

variation.m

% Script qui va permettre d'explorer le monde des graphes par intervalles% réguliers.% Pour cela :% -On génère au départ un graphe complet à 100 sommets.% -On retire m arêtes% -On calcul le rapport Diametre réel / Moyenne du diametre retourné% -On affiche le résultat graphiquement % Modifications 1 : On va "lisser" les résultats en effectuant une moyenne% sur l'ensemble des valeurs%%% Attributs du graphe clc;clear all; cd('Projet ZZ3/matlab_bgl'); n = 10;test = 1;pas = 1; donnee_temp =[];abs =[];ord_1 =[];ord_2 =[];ord_3 =[]; a = 1980;b = 2000;nb_moy = 10; fid = fopen('resultat_2.txt','wt'); % Création du graphe complet qui sera notre point de départ. complet = ones(n) - eye(n);complet = sparse(complet); for i=a:pas:b for x=1:nb_moy graphe = creation_graphe(n,i,complet); % Procédure de calcul du graphe pour effectuer les statistiques %---------------------------------------------------------------------- % Calcul a faire commun à tous les choix [tab,S] = exact_liste(graphe); diametre = max(tab); donnee = []; %------------------------------------------------------------------

xv

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

% Procédure de calcul de l'espérance for u=1:n temp = S{1,u}; vect = tab(temp); for j=1:length(temp) donnee = [donnee vect(j)]; end end %On souhaite calculer le pire des valeurs atteignables on cherche %donc le minimum des valeurs possibles valeur_min = min(donnee); donnee_temp = [donnee_temp (diametre / valeur_min)]; end % Calcul de l'espérance temp = mean(donnee_temp); % Calcul du pourcentage de certitude vec = find(donnee_temp == 1); pourcent = length(vec) * 10 ; % Calcul de l'écart type A = donnee_temp - temp; ecart_type = mean(A.*A); graphe_1 = [i temp]; graphe_2 = [i pourcent]; graphe_3 = [i ecart_type]; fprintf(fid,'%f %f %f %f \n',graphe_1,pourcent,ecart_type); ord_1 = [ord_1 temp]; ord_2 = [ord_2 pourcent]; ord_3 = [ord_3 ecart_type]; abs = [abs i]; % Affichage sur la ligne de commande des différents résults disp('--------------------------------------'); disp ('Iteration : ') ; disp(i-a+1); disp ('Rapport diam/ esp (moyenne de 10) ');disp(temp); disp ('Pourcentage de certitude absolue : ');disp(pourcent); disp ('Ecart type de : ');disp(ecart_type); % Réinitialisation des données donnee_temp = []; vec = []; endfclose(fid); % Dessin du premier graphesubplot(2,2,1);plot(abs,ord_1); axis([a b 0.7 2.2]);xlabel('Nombre d''aretes du graphe');ylabel('Diametre réel / Esperance des valeurs possibles retournée par

xvi

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

l''algo sur 10 valeurs'); % Dessin du deuxième graphesubplot(2,2,2);plot(abs,ord_2); axis([a b 0 100]);xlabel('Nombre d''aretes du graphe');ylabel('pourcentage où l''on est sûr du résultat'); % Dessin du troisième graphesubplot(2,2,3);plot(abs,ord_3); axis([a b 0 max(ord_3)+0.001]);xlabel('Nombre d''aretes du graphe');ylabel('Ecart type');

xvii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

variation_ecart.m

% Procédure de calcul du graphe pour effectuer les statistiques %---------------------------------------------------------------------- % Calcul a faire commun à tous les choix [tab,S] = exact_liste(graphe); diametre = max(tab); donnee = []; %------------------------------------------------------------------ % Procédure de calcul des données for u=1:n temp = S{1,u}; vect = tab(temp); for j=1:length(temp) donnee = [donnee vect(j)]; end end %On souhaite calculer le pire des valeurs atteignables on cherche %donc le minimum des valeurs possibles valeur_min = min(donnee); % On calcule enfin l'écart res = diametre - valeur_min ; % Stockage des résultats sous fichier graphe_1 = [i res]; fprintf(fid,'%f %f n',graphe_1); % Stockage de l'abscisse et de l'ordonnée ord_1 = [ord_1 res]; abs = [abs i]; % Affichage sur la ligne de commande des différents résults disp('--------------------------------------'); disp ('Iteration : ') ; disp(i-a+1); disp ('Diametre exact ');disp(diametre); disp ('Ecart ');disp(res); end fclose(fid); % Dessin du grapheplot(abs,ord_1); axis([a b 0 4]);xlabel('Nombre d''aretes du graphe');ylabel('Diametre réel - plus petit diametre retourné par l''algorithme');

xviii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

variation_probabilité.m % Script qui va permettre d'explorer le monde des graphes par intervalles% réguliers.% Pour cela :% -On génère au départ un graphe complet à 100 sommets.% -On retire m arêtes% -On calcul la probabilité que le graphe se trompe% -On affiche le résultat graphiquement% -On va stocker le résultat sous le fichier resultat.txt clc;clear all; n = 30;test = 1;pas = 1; donnee_temp =[];abs =[];ord_1 =[]; a = n-1;b = n*(n-1)/2;nb_moy = 10; fid = fopen('resultat_2.txt','wt'); % Création du graphe complet qui sera notre point de départ. complet = ones(n) - eye(n);complet = sparse(complet); for i=a:pas:b graphe = creation_graphe(n,i,complet); % Procédure de calcul du graphe pour effectuer les statistiques %---------------------------------------------------------------------- % Calcul a faire commun à tous les choix [tab,S] = exact_liste(graphe); diametre = max(tab); donnee = []; %------------------------------------------------------------------ % Procédure de calcul de la probabilité %Initialisation du calcul de la probabilité p = 0; for h=1:n %On récupère les sommets echos vec = S{1,h}; l = length(vec); %On évalue la probabilité en tenant compte de la taille du vecteur %contenant les sommets echos p = p + length(find(tab(vec)~=diametre))/l;

xix

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

end p = p/n; graphe_1 = [i p]; fprintf(fid,'%f %f\n',graphe_1); ord_1 = [ord_1 p]; abs = [abs i]; % Affichage sur la ligne de commande des différents résults disp('--------------------------------------'); disp ('Iteration : ') ; disp(i-a+1); disp ('Probabilité de se tromper ');disp(p); endfclose(fid); % Dessin du grapheplot(abs,ord_1); axis([a b 0 1]);xlabel('Nombre d''aretes du graphe');ylabel('probabilité de se tromper');

xx

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

C++

Fichier .hpp

xxi

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

xxii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

Fichier .cpp

xxiii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

xxiv

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

xxv

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

xxvi

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

xxvii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

xxviii

Etude et Implémentation d'une heuristique permettant de calculer le diamètre

xxix