2020COAZ4041
2020COAZ4041
2020COAZ4041
Composition du jury :
Rapporteurs
Marie-José Huguet, Professeure des Universités, Institut National des Sciences Appliquées
Xavier Lorca, Professeur des Universités, Institut Mines-Télécom
Examinateurs
Invité
Je tiens à remercier Pr Marie-José Huguet et Pr Xavier Lorca, qui m’ont fait l’honneur d’être
les rapporteurs de ces travaux de thèse.
Mes plus grands remerciements vont à mon encadrant, Arnaud Malapert, avec qui j’ai eu
la chance de travailler pendant ma thèse. Arnaud m’a appris énormément d’un point de vue
scientifique, parfois dans des domaines que je n’aurais jamais pensé explorer. Et plus que des
connaissances techniques, il m’a inculqué une véritable démarche scientifique, une manière de
penser. Plus personnellement, je le remercie grandement pour ses conseils, ses encouragements,
et pour les nombreux conseils et les riches discussions que nous avons eues ensemble avec Carine
Fidèle. Vous avez fait de ces trois années et demi une bien belle expérience.
Carine, je ne te remercierai jamais assez pour tout le soutien que tu m’as donné durant les
dernières années de cette thèse sur le plan scientifique aussi bien que sur le plan humain. Tu n’es
pas uniquement une co-encadrante pour ma thèse, tu es une amie...
Je remercie également Christophe Imbert pour m’avoir accueillie à Milanamos et pour avoir
encouragé l’esprit d’innovation à travers ce travail de thèse. Je remercie également Rémi Jolin
pour son aide et ses conseils, sans oublier Valentin qui, bien que tôt parti de l’entreprise, m’a
beaucoup aidé au début de la thèse. Chez Milanamos, j’ai également côtoyé plusieurs autres
personnes auprès desquelles j’ai beaucoup appris sur le secteur aérien. Merci donc à Christophe
Ritter, Natalya et Stéphane.
Un grand merci à tous les amis et membres du Laboratoire I3S qui m’ont chaleureusement ac-
cueilli et m’ont permis de travailler dans une ambiance aussi conviviale. Merci tout spécialement
à Sandra, Rémi, Nico, Lætitia, Lætitia 2, Samvel, Oussama, Guillaume, Heytem, Ophélie, Ingrid,
Piotr, Sara et Marie pour son aide et sa bonne volonté. C’était un plaisir pour moi de vous avoir
connus.
Le meilleur est pour la fin dit-on. Je suis et je serai toujours reconnaissante à mes parents
sans qui je n’en serai pas là aujourd’hui. Maman, papa, je vous remercie pour votre amour et
votre soutien inconditionnel tout au long de cette carrière. Je vous aime. Merci à ceux que j’aime :
mes beaux-parents, mes sœurs, mes neveux et mes nièces d’avoir toujours cru en moi. Sans vous
tous, ce travail n’aurait certainement pas vu le jour.
i
Enfin, tous les mots ne suffiront pas pour remercier la personne qui m’a le plus encouragé
à faire cette thèse, qui a toujours cru en moi, qui a été présente à mes côtés dans les hauts et
les bas, dans les joies et les tristesses, qui m’a appris à prendre du recul et à faire la part des
choses, mon cher mari Mohamed El Afouani...Merci pour ton soutien inconditionnel, ton aide, tes
encouragements, tes conseils et tes critiques constructives tout au long de la thèse....Cette thèse
est aussi la tienne...
Je dédie également la thèse à mes adorables enfants Ahmed-Ali et Aline qui ont supporté mon
absence et mes sauts d’humeur... Mes trésors, un jour vous lirez peut être la thèse de votre maman
et vous en serez fiers...
Résumé
Les problèmes rencontrés dans l’industrie aérienne sont divers et compliqués. Leur résolution
réduit les coûts et maximise les revenus tout en améliorant la qualité de service, par exemple,
en capturant de nouveaux passagers sur des vols existants ou sur de nouveaux marchés. La
sélection des nouveaux marchés permet de définir la structure du réseau à opérer, et d’estimer
le flux des passagers, leurs choix d’itinéraires ainsi que les revenus et les coûts impliqués par
ces décisions. Nos travaux concernent l’amélioration du calculateur de parts de marché dans
l’application PlanetOptim de la startup Milanamos. Cet outil permet aux décideurs des
aéroports et des compagnies aériennes d’analyser l’historique des données et de simuler des
marchés afin de trouver une opportunité économique. Ces travaux sont orientés vers les niveaux
de décision stratégiques et tactiques. Grâce à une analyse poussée des données, le réseau aérien
a pu être modélisé par un graphe indépendant du temps stocké dans une base de données
orientée graphe Neo4j. Tout d’abord, nous avons défini le Flight Radius Problem, dans le
cadre de la sélection des marchés, dont la résolution permet de déterminer un sous-réseau
centré autour d’un vol pour lequel les parts de marchés du vol sont non négligeables. Plusieurs
méthodes de résolution ont été proposées basées sur des requêtes ou des algorithmes de plus
courts chemins couplés à des techniques d’accélération et de parallélisme. Nos algorithmes
identifient rapidement un ensemble de marchés prometteurs centré sur un vol. Ensuite, pour
accélérer le calcul des parts des marchés, nous avons proposé une nouvelle méthode basée sur
le modèle logit. L’intégration de la théorie des graphes dans les bases de données ouvre de
nouvelles perspectives pour l’analyse et la compréhension de grands réseaux.
Mots-clés : transport aérien, choix d’itinéraire, graphe indépendant du temps, base de données
orientée graphe, plus court chemin, parallélisme, logit.
Abstract
In the airline industry, problems are various and complicated. Solving these problems aims at
reducing costs and maximizing revenues. Revenues can be increased while improving the qual-
ity of service. For example, one way is to catch new passengers on existing flight connections
or on new markets. The selection of new markets consists in determining network structure
to operate, and to estimate passengers flow, their choice of itineraries as well as incomes and
costs incurred by these decisions. Our research is about improving market planner engine.
Milanamos develops an application for the analysis and simulation of markets intended for
airports and airlines. It offers its customers a decision-making tool to analyze historical data
and to simulate markets in order to find an economic opportunity. This project takes place
earlier in the decision process. Thanks to a thorough data analysis, the air transport network
could be modelized as a time-independent graph and stored in the Neo4j graph database. The
first step consists in defining the Flight Radius problem which resolution allows to determine
a sub-network centered around a flight for which market shares of the flight are meaningful.
Several methods have been proposed based on queries or on shortest path algorithms combined
with acceleration and parallelism techniques. Our algorithms identify some new markets for
a flight. The second step consists in calculating market shares, a method has been proposed
based on logit model to reduce a combinatorial on itineraries to evaluate. Combining graph
theory with databases offers new opportunities for analyzing and studying large networks.
Keywords: air transportation, itinerary choice, time-independant graph, graph database, shortest-
path, parallelism, logit.
Table des matières
1 Introduction 1
1.1 Analyse du problème industriel et scientifique . . . . . . . . . . . . . . . . . . . 3
1.1.1 Contexte industriel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.2 Problématique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Objectifs de la thèse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1 Objectifs généraux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.2 Objectifs spécifiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Complexité du problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Méthodologie de la résolution . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Organisation du manuscrit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Notations 9
Sigles et Abréviations 13
2 Contexte industriel 15
2.1 Présentation de Milanamos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.1 Historique de l’entreprise . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.2 Organigramme de l’entreprise . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.3 Chiffres clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.4 Clients et partenariats . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 Présentation du produit de Milanamos : PlanetOptim . . . . . . . . . . . . . 18
2.2.1 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2 Description des modules de PlanetOptim . . . . . . . . . . . . . . . 21
2.2.3 Architecture logicielle de PlanetOptim . . . . . . . . . . . . . . . . 29
2.3 Évolution du module Simulator . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3.1 Au début de la thèse en 2016 . . . . . . . . . . . . . . . . . . . . . . . . 30
2.3.2 À la fin de la thèse en 2019 . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.4 Analyse des besoins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.4.1 Cadre de la thèse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.4.2 Exemple de motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.5 Motivations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.6 Problématique de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
État de l’art
v
vi TABLE DES MATIÈRES
vi
TABLE DES MATIÈRES vii
Contributions
vii
viii TABLE DES MATIÈRES
viii
TABLE DES MATIÈRES ix
8.4 Méthodes basées sur les algorithmes des plus courts chemins . . . . . . . . . . . 213
8.4.1 Méthodes basées sur la parallélisation . . . . . . . . . . . . . . . . . . . 213
8.4.2 Méthodes séquentielles . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
8.5 Expériences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
8.5.1 Description des données . . . . . . . . . . . . . . . . . . . . . . . . . . 224
8.5.2 Protocole des expériences . . . . . . . . . . . . . . . . . . . . . . . . . 224
8.5.3 Résultats des expériences . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Bibliographie 261
Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Annexes
A Description des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
B Programme 2-hops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
C Résultats des requêtes en Neo4j . . . . . . . . . . . . . . . . . . . . . . . . . . 288
C.1 Création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
ix
x TABLE DES MATIÈRES
x
C HAPITRE 1
Introduction
Le transport aérien connaît depuis plusieurs décennies un très fort taux de croissance. En 2018,
le trafic de passagers a augmenté de 6,4% : 8,8 milliards de passagers se sont déplacés en avion 1 .
Cette croissance a poussé les compagnies aériennes à améliorer leur qualité de service à travers la
maîtrise de plusieurs facteurs sensibles comme la fréquence, le prix, ou la concurrence.
Afin de capturer un flux important de passagers, les compagnies aériennes proposent des vols
correspondant aux attentes de leurs passagers ; elles se concentrent principalement sur la planifi-
cation des vols. Cette étape est l’un des éléments importants et implique des décisions complexes.
Elle prend en compte la demande des passagers, les caractéristiques des aéroports et des avions,
puis génère une sélection de segments de vol maximisant leur profit en fonction des contraintes
de ressources (capacité des avions et des aéroports, heures de travail maximales, temps minimal
au sol, etc.). Un segment de vol est défini par trois attributs [Belobaba et al., 2015] : une paire
origine-destination (OD), une paire heure de départ-heure d’arrivé et le type d’avion.
L’étape de la planification des vols vise à répondre aux questions suivantes :
1. Quelles destinations la compagnie peut-elle desservir ?
2. À quelle fréquence la compagnie peut-elle offrir ?
3. À quelle date peut-elle proposer ?
4. Quelle capacité fournir sur chaque vol ?
5. Quels sont les choix des vols concurrents ?
6. Quels sont les horaires des vols proposés ?
La décision prise est très importante pour une compagnie aérienne, la qualité du service et les
prix proposés influencent l’attraction des passagers. Pour cela, la compagnie aérienne doit prendre
en considération le choix des passagers. En fait, elle doit tenir compte des critères tels que le prix
du billet, le temps de trajet, mais également le type de vol. Par exemple, un homme d’affaires est
intéressé par le temps de voyage, un étudiant souhaite minimiser le coût dépensé et un visiteur
souhaite éviter le vol avec correspondance. Les passagers ont donc des préférences différentes sur
les critères qui sont propres à leurs cultures et besoins.
Ce processus consiste à prendre des décisions à différentes étapes concernant l’ajout de nou-
veaux vols ou l’ouverture de nouvelles routes. Cette dernière nécessite une prévision de la de-
mande du marché desservi qui n’est pas basée sur des données historiques puisqu’inexistantes.
Par conséquent, la demande peut être calculée avec des modèles de part de marché et la meilleure
décision est choisie. Quand elle possède un historique des données, en revanche elle se base sur
des techniques de l’apprentissage automatique.
1. Rapports annuels de IATA et ICAO.
1
2 C HAPITRE 1 — Introduction
compte des dépendances des autres problèmes, notamment, l’estimation des parts de marchés. Vue
l’importance de l’interaction entre la sélection des marchés et l’estimation des parts de marchés,
il est préférable de résoudre simultanément ces deux problèmes : mais cela demeure un grand défi
en raison d’un grand volume de données qui sont non structurées et incomplètes. En effet, lorsque
le nombre de marchés augmente, la taille du problème et le temps de calcul augmentent rapide-
ment puisqu’il s’agit d’évaluer simultanément l’ensemble des itinéraires des marchés lors de la
résolution, qui est potentiellement exponentiel. C’est un des défis qui nous intéressent dans cette
thèse : estimer les parts de marchés sur un grand réseau pour plusieurs marchés en temps réel.
1.1.2 Problématique
Étant donné une origine et une destination, l’application PlanetOptim affiche tous les aé-
roports reliés par un arc vers l’origine ou issus de la destination. Ce sous-graphe est souvent trop
grand et dense pour être visualisé correctement dans l’application. De plus, certains chemins du
sous-graphe n’ont aucun intérêt en pratique. Par exemple, un trajet New York-Paris-Los Angeles
n’est pas une alternative réaliste pour relier New York à Los Angeles. Ensuite, l’application estime
la part de marché capturée par le nouveau vol entre la paire OD avec le modèle QSI.
Le modèle actuel estime la part de marché en tenant compte des vols avec une seule corres-
pondance. Par ailleurs, il ne prend pas en considération les marchés influencés par l’ajout de ce
nouveau vol. En effet, le processus d’estimation est compliqué et long car les formules écono-
miques ne passent pas à l’échelle.
Notre objectif est d’aider le décideur à sélectionner des marchés qui représentent l’ensemble
des paires OD telles que la part de marché est non négligeable, puis d’estimer la part de marché.
Ce calcul prend en compte l’ensemble des itinéraires reliant l’origine à la destination ainsi que
l’ensemble des marchés impactés par le nouveau service, et il doit être réalisé en quelques secondes
dans la pratique.
C’est dans ce cadre que nous avons défini un nouveau problème, appelé : Flight Radius Pro-
blem (FRP). C’est un problème d’aide à la décision ayant un aspect multicritère qui permet de
déterminer un sous-graphe de chemins valides. Un chemin valide passe par l’arc entre l’origine et
la destination en limitant, par exemple, la perte de temps ou le surcoût par rapport aux meilleurs
chemins. Cela permettra d’améliorer la visualisation et accélérer le calcul des parts de marché.
4 C HAPITRE 1 — Introduction
conséquent, une bonne manière de résoudre le problème est d’utiliser des outils d’aide à la dé-
cision qui considèrent un maximum de facteurs objectifs et d’évaluer les facteurs subjectifs en
mettant en œuvre les différents scénarios possibles sur la base d’une expérience solide de l’indus-
trie aérienne.
❈❤❛♣✐tr❡ ✶ ❈❤❛♣✐tr❡ ✷
❈♦♥t❡①t❡ ■♥❞✉str✐❡❧
■♥tr♦❞✉❝t✐♦♥
➱t❛t ❞❡ ❧✬❛rt
❈♦♥tr✐❜✉t✐♦♥s
❈♦♥❝❧✉s✐♦♥
4. Théorie des graphes - ce chapitre présente une revue de la littérature sur la théorie des
graphes. Nous présentons ainsi les algorithmes fondateurs, Dijkstra et Bellman ainsi que
les différentes techniques d’accélération proposées dans la littérature. Parmi ces techniques, nous
avons opté pour l’algorithme de hub labeling qui a connu un grand succès [Delling et al., 2014,
Bast et al., 2016].
5. Notions sur les bases de données - dans ce chapitre, nous abordons quelques notions sur
les bases de données. Nous présentons les différents types qui existent actuellement, à savoir, les
bases relationnelles et les bases NoSQL. Parmi les bases NoSQL, il y a les bases orientées graphe.
Nous avons choisi la base orientée graphe Neo4j pour stocker notre graphe.
6. Analyse des données aériennes - ce chapitre est consacré principalement à l’analyse des
données aériennes. Les données provenant du monde réel présentent souvent des soucis. En fait,
résoudre une problématique réelle nécessite de faire une certaine analyse pour proposer des hy-
pothèses, comprendre l’évolution des données dans le temps et bien choisir la méthode adéquate
pour résoudre le problème de recherche.
9. Modèle d’estimation des parts de marchés - ce chapitre commence par présenter le mo-
dèle actuel utilisé par Milanamos pour estimer les parts de marchés, qui est basé sur le modèle
QSI ainsi que ses limites. Ensuite, nous introduisons notre modèle proposé, basé sur le modèle
multinomiale logit. Ce modèle permet d’estimer les parts des marchés identifiés par le FRP sur le
graphe condensé. Finalement, nous concluons par les études de cas réalisées pour évaluer notre
approche.
Notations
Modèles de choix
X variables explicative
S part d’un itinéraire
J ensemble des itinéraires d’un marché
QSI score d’un itinéraire
S
ηQSI élasticité de la part par rapport au score
ǫ erreur de l’observation
U fonction de l’utilité d’un itinéraire
V utilité observée d’un itinéraire
i alternative i
j alternative j
n individu (passager)
k attribut (critère) de l’alternative
N ensemble des individus
K ensemble des critères d’une alternative
y variable binaire pour le choix
G(0, γ) loi de Gumbel avec un mode 0 et un écart-type γ
F fonction de répartition
f fonction de densité
D domaine de définition d’une variable
A événement
9
10 Introduction
13
C HAPITRE 2
Contexte industriel
Dans ce chapitre, nous présentons le contexte industriel de la société Milanamos. Nous
commençons par présenter l’entreprise et son produit PlanetOptim. Ensuite, nous
décrivons en détail le module qui nous intéresse dans ce travail de thèse et abordons les
motivations de cette thèse.
15
2.1 – Présentation de Milanamos 17
optimode, contenant plus de 4 milliards de lignes afin de fournir des informations synthétiques
et pertinentes à son outil PlanetOptim.
PlanetOptim dispose de huit modules qu’on décrit dans la prochaine section : Analysis,
Simulator, KPIS, Hub, Route, Opp Finder, 225, Explorer.
PlanetOptim propose un certain nombre d’outils à ses utilisateurs :
1. l’analyse de marché, en fonction d’un trajet donné ;
2.2 – Présentation du produit de Milanamos : PlanetOptim 19
Pax,Rev,
Rev_min Jours
d’opér.
Comp.
(MK,OP)
Cap,Frq
Analyser
un marché Afficher les
Origines plans de vols
Plan. de destinations
la fré-
quence
Taux
aug. De-
mande
Simuler /Rev.
un marché Rev.
Part de
marché
Planetoptim
Prédire la
demande
Coûts,
revenus PAER.
Explorer
le réseau Nombre
dest.
comp. aér. Alliance
Comparer
aéroports
comp.aér.
Comparer Nombre
Nombre
Jours
Frq. routes comp.aér.
d’opér.
hebd.
Capacité
Type de
Cap. comp.
app.
Abréviation Désignation
comp. aér. Compagnie aérienne
mk. Commercialisante (marketing)
op. Opérante (operating)
opér. Opérations
cap. Capacité
dest. Destination
Rev. Revenu
org. Origine
PAER. Prix-élasticité
hebd. Hebdomadaire
app. Appareil
PlanetOptim a pour but également d’aider ses clients à chercher des routes les plus ren-
tables en faisant des analyses de marché, de fournir des simulations et des prévisions lors d’une
ouverture de nouvelles routes, de maximiser les connexions de vols jusqu’à 12 mois dans le futur,
et d’aider des compagnies à choisir les meilleurs réseaux de partenaires. Les résultats sont pré-
sentés de manière simple à travers plusieurs options d’affichage comme des tables (Dashboard),
des graphiques, des diagrammes et des cartes. Par ailleurs, les données livrées par cet outil sont
exportables dans n’importe quel format et sont réutilisables par les clients.
En effet, la gestion du transport aérien peut être vue de deux façons : Une vision O&D basée
sur le marché des O&D et une vision Segment basée sur le marché des segments. Un marché O&D
est défini par le point d’entrée et sortie du passager dans le système de réservation de la compagnie
aérienne. Cette vision est importante pour la compagnie aérienne, car cela lui permet de connaître
combien de passagers voyagent entre deux villes pendant une certaine période de temps. Toutefois,
l’information sur le marché Segment concerne plutôt une route spécifique opérée par un avion
sur un vol sans escale entre une origine et une destination. Plus concrètement, le marché O&D
est une vision de passagers alors que le marché Segment est une vision d’équipement. C’est la
raison pour laquelle les données sur le marché O&D nous informent sur l’ensemble des itinéraires
possibles pour rejoindre une destination depuis une origine quelconque. Donc, on retrouve toutes
les données sur les aéroports de correspondance, ce qui permet de suivre le flux des passagers et
savoir par où ils passent. D’ailleurs, nous trouvons également des informations sur la compagnie
qui ne fait que commercialiser le vol dans le cas d’un partage de codes, puisque ce type de marché
se base sur une vision marketing. Contrairement au marché des segments, ce type de marché se
22 C HAPITRE 2 — Contexte industriel
base sur les informations collectées pour une route spécifique entre deux aéroports donnés. Cela
correspond plutôt à des vols directs (voir les figures 2.5a et 2.5b).
L’affiche des résultats se fait de toutes façons sur plusieurs options : tables et graphiques (voir
la figure 2.6).
2.2.2.2 Simulator
Le module Simulator est le module principal de l’application PlanetOptim. Il a été appelé
par Milanamos, PlanetOptim.Futur, car il permet aux utilisateurs de prédire l’avenir à tra-
vers la simulation. L’objectif du simulateur (en anglais Simulator) est d’étudier la rentabilité d’une
route en comparant des routes existantes. Ainsi, une compagnie aérienne qui voudrait créer une
nouvelle route pourrait estimer les parts de marchés attendues.
Le travail de cette thèse est basé sur ce module qui a connu plusieurs évolutions depuis 2016.
Nous décrivons plus en détail l’évolution de ce module dans les sections à venir (voir la figure 2.7).
2.2 – Présentation du produit de Milanamos : PlanetOptim 23
2.2.2.3 KPIS
PlanetOptim fournit pour ses utilisateurs les indicateurs clés de performance (KPI), pour
les deux perspectives de marchés : Segment et O&D. Ces clés permettent de mesurer la rentabilité
d’une route. Parmi ces clés, on trouve : le nombre total de passagers transportés, le revenu total
et la répartition des compagnies aériennes opérant cette route. Dans ce module, la comparaison se
fait avec la période de l’année précédente.
2.2.2.4 Hub
Le module Hub aide les utilisateurs à évaluer les connexions potentielles sur un aéroport
donné. Il fournit des informations opérationnelles et commerciales détaillées pour trouver l’heure
optimale d’arrivée et de départ à n’importe quel endroit, pour augmenter le potentiel de circulation
avant et après le trafic.
2.2.2.5 Route
Le module Route fournit une vue détaillée du calendrier des routes pour chaque semaine
d’opération de vol disponible dans la base de données, soit dans le passé (à partir de la semaine
1 de 2002) jusqu’au moins 12 mois en avance, si ces informations sont communiquées par les
compagnies aériennes exploitantes. Deux vues différentes sont disponibles :
— Planification de route : fournit les horaires pour un segment spécifique et une semaine de
l’année ;
— Programme de route : fournit le programme de vol pour un segment et une période spéci-
fiques et met en évidence les changements d’horaire par rapport à une semaine de base.
F IGURE 2.11 – Module Opp Finder. Sur l’exemple, l’aéroport CDG a 305 destinations et FRA 346
destinations.
2.2.2.7 225
Le module 225 a été développé pour répondre aux besoins d’un client. Ce module permet de
comparer plusieurs vols selon les informations suivantes :
1. compagnie qui opère ;
2. compagnie qui commercialise le vol ;
3. jour de la semaine d’opération ;
4. capacité ;
5. fréquence.
2.2.2.8 Explorer
Ce module consiste à afficher le réseau d’une compagnie aérienne à travers le monde pour un
mois donné. Par exemple, la compagnie AirFrance opère la route Paris Charles De Gaulle/France
(CDG)-Bangkok/Thaïlande (BKK) (voir la figure 2.13).
2.2 – Présentation du produit de Milanamos : PlanetOptim 29
FRONTEND
BACKEND DATABASE
Client
entry
USER ACTION
DATA RESPONSE
USER FRONTEND API BACKEND
DATABASE
INTERFACE FUNCTIONS MANAGEMENT LOGIC
DATA REQUEST
Lorsque l’utilisateur effectue une action sur l’interface, la partie « Vue » du Frontend appelle
la fonction du « contrôleur » qui lui est associée. En général, l’objectif de cette fonction est de
générer un appel pour récupérer des données de la base, et enfin les traiter. On trouve donc dans
ces fonctions un appel à un service qui va se charger d’interroger le Backend. C’est donc via une
30 C HAPITRE 2 — Contexte industriel
API propre que la fonction adéquate va être appelée dans le Backend. Cette dernière n’aura plus
qu’à effectuer la requête sur la base, et les données pourront remonter toute la chaîne jusqu’au
Frontend, qui affichera les éléments demandés par l’utilisateur.
La deuxième étape consistait à afficher le résultat de la simulation qui sont les aéroports en
amont de l’aéroport d’origine et en aval de l’aéroport de destination. Par exemple dans la fi-
gure 2.16, le passager qui vient de CDG et qui souhaite rejoindre ICN, peut faire une connexion
à NCE pour prendre le nouveau vol de NCE à BKK, ensuite une deuxième connexion à BKK pour
atteindre sa destination finale.
F IGURE 2.16 – Correspondances du nouveau vol NCE-BKK. L’arc bleu représente le nouveau vol,
les couleurs des aéroports référent leurs positions géographiques selon la boussole.
Le processus pour déterminer ces aéroports consiste à chercher tous les aéroports qui sont
similaires aux aéroports origine et destination en termes de revenu et nombre de passagers (Pax).
Ensuite, on regarde toutes les routes qui existent entre les deux ensembles amont et aval.
Leakage
Une fois que la route étudiée est saisie, la première étape consiste à chercher d’autres aéroports
qui sont proches des aéroports origine-destination pour pouvoir proposer un vol à partir de ces
aéroports.
Clusters
Cette étape consiste à rechercher d’autres aéroports similaires à l’aéroport d’origine et à l’aé-
roport de destination afin de se concentrer spécifiquement sur les similitudes du marché desservi
par chacun d’eux. La sélection des aéroports similaires est basée sur une analyse multicritères afin
de garantir que les paramètres de volume de trafic et de rendement soient pris en compte. L’objectif
de cette phase est de fournir une liste d’aéroports comparables à l’origine et à la destination.
Routes
Market
Plan
Cette phase consiste à modifier le programme de vol, à savoir, la fréquence d’opération heb-
domadaire ainsi que mensuelle et la capacité vendue.
Connections
Ce créateur de connexions fournit des connexions entrantes et sortantes pour le vol régulier,
pour toutes les compagnies aériennes potentielles ou uniquement pour certains transporteurs limi-
tés identifiés par l’utilisateur. Ces informations seront ajoutées au trafic local point à point.
Pendant cette phase, le système détermine la part de marché potentielle de la compagnie aé-
rienne en activité. Il utilise à la fois des paramètres quantitatifs et qualitatifs, ainsi que la métho-
dologie de l’indice de qualité de service (QSI) et la part de marché historique de la compagnie
aérienne (ou des compagnies aériennes appartenant au même groupe de compagnies aériennes)
sur des marchés comparables. Différents paramètres QSI doivent être définis par l’utilisateur pour
les éléments qualitatifs ou calculés automatiquement par le système en fonction des données dis-
ponibles.
Revenue
Sur la base de la part de marché pour le trafic point à point et du potentiel de flux de passagers
estimé, le système calcule le revenu total attendu en utilisant le prix moyen actuel du marché pour
l’origine et la destination. En outre, les frais de billets, les recettes annexes sont estimés à partir
d’un ensemble de données du transporteurs.
Costs
Cette phase estime le coût d’exploitation des opérations en fonction de divers paramètres et
variables de coûts.
Results
34 C HAPITRE 2 — Contexte industriel
Cette étape fournit un rapport sur les profits et les dépenses pour les trois premières années
à partir du lancement du service proposé, ainsi que tous les indicateurs clés de performance qui
doivent être disponibles pour être discutés avec un aéroport ou une compagnie aérienne partenaire.
Compare
La méthode actuelle pour afficher les correspondances consiste à récupérer tous les aéroports
dont les vols ont comme destination NCE et les vols arrivant à BKK sans tenir compte de la fai-
sabilité de l’itinéraire. De plus, le calcul des parts de marché se fait uniquement sur l’ensemble
des itinéraires reliant l’origine à la destination avec une seule correspondance. Par ailleurs, l’étape
Connections est indépendante de l’étape M.S..
Les éléments principaux ressortent donc de l’étude de l’existant :
1. la nécessité de filtrer l’ensemble des aéroports à afficher (voir la figure 2.18) ;
2. le calcul des parts de marché uniquement sur l’ensemble des routes intéressantes ;
3. la nécessité d’inclure les marchés impactés par ce nouveau vol.
F IGURE 2.18 – Correspondances non réalistes. Les aéroports barrés représentent des aéroports
dont les routes ne correspondent pas à des itinéraires réalistes.
36 C HAPITRE 2 — Contexte industriel
2.5 Motivations
La start-up Milanamos a trois objectifs principaux : améliorer la visualisation, sélectionner les
marchés potentiels à desservir et estimer les parts de marché attendues.
Le calcul des parts de marché est une étape longue, car il faut regarder tous les itinéraires
possibles pour aller de l’origine à la destination. Ce qui donne une explosion exponentielle. Pour
l’instant, Milanamos se contente des routes à une seule correspondance sans tenir compte de l’en-
semble des marchés impactés par ce nouveau service. Actuellement, la start-up a choisi le modèle
QSI pour le calcul des parts de marché. En effet, Milanamos utilise une moyenne pondérée dont
les poids sont fixés par l’utilisateur. Ce qui néglige l’interdépendance des critères. On reviendra
plus tard au chapitre 9 pour présenter les limites du modèle existant (voir la section 9.1.3).
À la lumière des objectifs cités, on propose d’intégrer des algorithmes d’aide à la décision
dans le processus de calcul des parts de marché qui tiennent compte des impacts sur la répartition
des passagers dans le réseau et de l’interaction des marchés impactés par cette prise de décision.
Les performances des algorithmes doivent respecter les contraintes sur le temps de réponse de
l’application.
Pour calculer efficacement les parts de marché, on propose de sélectionner les marchés po-
tentiels vis-à-vis des préférences des passagers pour éliminer ceux avec une part de marché né-
gligeable. En se basant sur le nouveau réseau qui contient uniquement les routes avec des parts
de marché non négligeable, une méthode sera développée pour améliorer le modèle de calcul des
parts de marché de Milanamos. On propose le modèle le plus récent, logit, qui a connu un grand
sucés selon la littérature grâce à ses performances. Pour réduire la complexité combinatoire sur
les itinéraires de chaque marché, on regarde uniquement ceux passant spécifiquement par des aé-
roports de type hub. Pour cela, une approche sera mise en place pour identifier les hubs.
Ce projet de thèse est à l’intersection des cinq disciplines : l’aérien, l’aide à la décision, les
modèles économiques, la théorie des graphes et les bases de données.
Il s’agit d’appliquer des méthodes d’aide à la décision à l’aérien en gérant une masse énorme
de données et en modifiant des modèles économiques qui sont souvent proposés sans tenir compte
de la combinatoire.
♦♦ ♦♦
♦ ❞ ♦ ❞
41
42 C HAPITRE 3 — Les problèmes décisionnels dans l’aérien
Processus de planification
Planification de la flotte
Types de décisions
Horizon de Temps
Par la suite, nous donnons brièvement une description de chaque étape. Pour commencer la
description, nous présentons quelques définitions (dont la plupart ont été tirées de [Belobaba et al.,
2015] ) du secteur aérien qui seront utilisées par la suite.
44 C HAPITRE 3 — Les problèmes décisionnels dans l’aérien
Définition 3.1.2 (Marché). Un marché (en anglais market) est défini par une demande entre un
aéroport d’origine et un aéroport de destination pendant une période donnée. Il représente la de-
mande des passagers qui voyagent d’une origine à une destination pendant une période donnée.
Par exemple, les personnes voulant se rendre à Paris depuis Nice au mois de juin représentent
le marché de Nice & Paris pour juin.
Définition 3.1.3 (Taille de marché). Une taille de marché (en anglais market size) indique le
nombre total de passagers (volume de passagers) qui ont l’intention de voyager par avion sur ce
marché.
Définition 3.1.4 (Escale). Une escale est un arrêt dans un aéroport intermédiaire où le passager ne
change pas d’avion. Ce type de vol est appelé vol avec escale (en anglais direct flight) où le même
vol assure plusieurs dessertes, mais uniquement avec le même avion. Quand il s’agit d’une seule
escale, le vol comporte deux segments de vol.
Définition 3.1.6 (Vol direct). Un vol direct (en anglais non-stop flight) est un vol sans escale et
sans correspondance, le passager se rend directement à l’aéroport de destination depuis l’aéroport
d’origine.
Les vols directs et avec escale se caractérisent par un numéro de vol unique.
Définition 3.1.7 (Horaire de vols). Un ensemble de vols définis par une paire d’origine et de
destination (paire OD) constitue un horaire de vols (en anglais schedule) : chaque vol est caractérisé
par un ensemble d’informations incluant l’heure de départ et l’heure d’arrivée. La gestion des
horaires de vols fait partie des décisions opérationnelles où les compagnies aériennes proposent
de construire un horaire de vols qui est cyclique sur une semaine.
Définition 3.1.8 (Itinéraire de passager). Un itinéraire de passager est une séquence finie dans le
temps de segments de vols que le passager emprunte pour rejoindre l’aéroport de sa destination
finale depuis l’aéroport d’origine de son point de départ.
Un itinéraire de passager peut être :
— direct : l’itinéraire ne comporte qu’un seul segment de vol ;
3.1 – Processus de planification dans une compagnie aérienne 45
Définition 3.1.9 (Route). Une route d’avion est une séquence finie de segments de vols consé-
cutifs réalisés par un type spécifique d’avion partant d’un aéroport origine et allant à un aéroport
destination.
Définition 3.1.10 (Partage de code). Un partage de code (en anglais code sharing) est une action
commerciale qui consiste à établir un partenariat entre les compagnies aériennes pour le partage de
tronçons de vol. On parle de cette action quand une compagnie aérienne A vend des sièges sur le
vol opéré par une compagnie aérienne B. On distingue ainsi deux types de compagnies aériennes
pour ce vol : compagnie opérante (B) (en anglais operating airline) et compagnie commercialisant
le billet de vol (A) (en anglais marketing airline).
Compte tenu de la table des vols sélectionnés ainsi que les horaires établis, cette étape a pour
objectif de présenter une offre qui répond mieux à la demande. En effet, le problème d’affecter
les types d’avions aux vols (en anglais Fleet assignment) vise à déterminer pour chaque segment
de vol du réseau opéré quel type d’avion est le plus approprié de façon à maximiser le profit de
la compagnie pour satisfaire les contraintes de la demande des passagers, de la composition de la
flotte, et de la balance [Barnhart and Cohn, 2004]. Cette dernière contrainte permet la conservation
de flot à chaque point du réseau pour chaque flotte. Il existe généralement trois types de contraintes
à satisfaire dans ce problème :
1. couverture des vols ;
2. conservation de flot ;
3. disponibilité des avions.
Une fois l’affectation des types d’avions aux segments de vol établie, le problème de construc-
tion des routes d’avion (en anglais Aircraft routing) a pour but de trouver pour chaque avion une
séquence de segments de vols (routage) de façon à couvrir chaque segment de vol exactement une
seule fois tout en respectant les contraintes d’entretien et de maintenance.
Planification d’équipages
Ensuite, une fois le problème de construction des rotations d’équipages résolu, on construit
les horaires mensuels pour chaque membre de l’équipage (en anglais Crew assignment) tout en
prenant en considération ses contraintes de travail (vacances, formation, congés, etc.).
Ces deux sous-problèmes ne sont pas indépendants. En effet, le problème de construction des
rotations d’équipages a pour objectif d’assembler les rotations générées précédemment aux ho-
raires des membres d’équipages de sorte à maximiser le niveau de satisfaction du personnel [Be-
lobaba et al., 2015].
tion de la rentabilité des routes se fait en vérifiant la faisabilité de chaque segment de vol et en
veillant à minimiser les coûts de chaque vol. Afin d’améliorer le calendrier des vols construit, ces
deux dernières étapes sont répétées jusqu’à ce qu’aucune amélioration ne puisse être apportée. Les
compagnies aériennes doivent déterminer certains aspects tels que les marchés prévus desservis,
le type de vols (vols sans escale ou vols avec correspondance) et la fréquence des vols sur chaque
marché.
des points de concentration ou focus. Il est prévu que les vols se rencontrent dans ces villes
cibles dans un laps de temps prédéfini pour permettre des correspondances. Cette structure
est connue sous le nom de structure de réseau hybride. La structure du réseau de la compa-
gnie aérienne hybride inclut à la fois les caractéristiques de la structure de réseau en étoile
et point à point. Ainsi, ces compagnies aériennes ont des destinations principales qui fonc-
tionnent comme des hubs, où elles assurent des vols à destination et en provenance de ces
hubs. Ils relient également les destinations liées directement avec des vols sans escale.
Exemple 3.2.1 (Types de réseau aérien). La figure ci-dessous représente les deux types de mo-
dèles : le modèle Point à point (voir la figure 3.4) et le modèle Hub & Spoke (voir la figure 3.5).
H1
Dans l’exemple de la figure 3.5, il y a 5 vols qui arrivent (arcs de couleur rouge) et 5 vols
qui partent (arcs de couleur bleue). Chaque segment de vol arrivant ou partant du hub dessert six
marchés O&D y compris le marché local entre le hub et le spoke, ainsi que 5 marchés « en corres-
pondance » supplémentaires. Ce qui permet de desservir au total 35 marchés avec simplement 10
3.2 – Planification des vols 51
segments de vols et seulement 5 avions traversant le hub, sous l’hypothèse que l’avion effectue le
retour pour revenir à la case de départ. Alors que dans le modèle Point à point (voir la figure 3.4)
qui fournit des services directs, il faudra 35 segments de vols et des centaines d’avions en fonction
des contraintes de planification.
D’une manière générale pour n segments de vols et 1 hub connectant ses segments de vols, il
y a : n2 + 2 × n marchés desservis dans le modèle Hub & Spoke. Ainsi, les passagers qui transitent
par un hub sont plus rentables pour les compagnies aériennes.
Estimation de part de
Part de Marché
marché par itinéraire
Demande sans
Taille du Marché
contraintes par itinéraire
Demande sous
Débordement & Récupération
contraintes par itinéraire
La première étape consiste à générer des itinéraires réalistes entre l’ensemble des paires
origine-destination (O&D) choisies, la génération des itinéraires se fait en connectant les seg-
ments de vols. Les données sont obtenues à partir des données de l’OAG (Official Airline Guide),
une entreprise qui analyse les horaires et les fréquences des compagnies aériennes du monde en-
tier. Elles contiennent des informations pour chaque vol incluant la compagnie opérante, l’origine,
la destination, le numéro de vol, l’heure de départ et d’arrivée, l’équipement, les jours d’opération
et le temps de vol. Les itinéraires sont définis comme un vol ou une séquence de vols utilisé pour
voyager entre la paire d’aéroports. En général, lors de la génération des itinéraires, les algorithmes
vérifient deux points :
1. la distance en se basant sur la logique de circuit pour éliminer les itinéraires non raison-
nables.
3.2 – Planification des vols 53
2. les temps minimum et maximum de connexion pour assurer que les correspondances irréa-
listes ne sont pas autorisées.
Cette étape consiste à calculer la part de marché pour chaque itinéraire généré. En effet, il
existe différents types de modèles de part de marché qui sont utilisés en pratique et peuvent être
caractérisés de manière générale selon la méthode sur laquelle ils s’appuient. Les deux types de
modèles de part de marché sont abordés dans la section 3.3 :
— des méthodes qualitatives utilisant le modèle QSI ;
— des méthodes de choix discrets basées sur la fonction logit.
Une fois que les parts des marchés sont calculées, la demande des passagers pour chaque
itinéraire est obtenue en multipliant la part de marché estimée, qui représente le pourcentage des
passagers attendus, par la demande totale prédite, ou bien le nombre des passagers voyageant entre
la paire d’aéroports si la compagnie aérienne possède un historique de données sur ce marché.
Pour mieux optimiser le processus et mieux se projeter dans le cas réel, les modèles
spill&recapture sont appliqués pour faire une réallocation des passagers. En effet, un déborde-
ment (en anglais spill) se produit quand la demande excède la capacité disponible sur certains
vols. Pour ne pas perdre ces passagers, la compagnie cherche à proposer d’autres alternatives pour
les récupérer, nous parlons alors de récupération (en anglais recapture). À la fin de cette étape, la
compagnie aérienne estime deux types de demandes [Lohatepanont and Barnhart, 2004, Abdel-
ghany and Abdelghany, 2018b]. :
— demande contrainte, soumise à des contraintes de capacité ;
— demande non contrainte, c’est-à-dire la demande maximale que la compagnie aérienne est
capable de capturer.
Finalement, des modèles d’allocation des revenus et coûts sont utilisés pour déterminer la
rentabilité de l’ensemble des itinéraires choisis.
mathématique et la théorie de l’utilité [Barnhart et al., 2003a, Grosche, 2009b, Eltoukhy et al.,
2017].
L’objectif principal reste de trouver une solution qui minimise les coûts ou maximise les profits
selon des contraintes opérationnelles. La tâche est compliquée et voici une liste non exhaustive de
divers éléments à prendre en cause :
1. Plusieurs aéroports avec des contraintes diverses.
2. Plusieurs types d’avions avec différentes caractéristiques : coût, capacité et maintenance.
3. Nombreux personnels avec des contraintes de disponibilités et de préférences à gérer.
4. Un large choix de marchés O&D à opérer, quand et comment. Chaque marché a une taille
différente.
Les modèles proposés dans la littérature tiennent compte de ces éléments et proposent de
résoudre une combinaison des sous-problèmes. La plupart proposent la modélisation du problème
RD avec le problème d’affectation des vols. En effet, ces deux problèmes partagent les mêmes
contraintes : la structure du réseau opéré, les origines, les destinations et la fréquence. Le marché
à servir ne peut pas être déterminé sans avoir pris en considération la fréquence et la demande.
D’autres proposent des modèles pour la localisation du hub pour une compagnie aérienne. Certains
se basent sur des modèles économiques et d’autres proposent des modèles mathématiques. Nous
distinguons, ainsi, quatre types d’études suivant :
1. Des études portent sur la modélisation de la structure du réseau à opérer. Dans ce genre
d’études, on distingue deux objectifs :
(a) la conception du réseau, y compris la sélection des routes à supprimer ou ajouter ;
(b) la localisation du hub.
2. Des études portent sur l’étude d’une opportunité économique. Dans ce genre d’études, les
auteurs utilisent des modèles économiques pour modéliser le choix de la sélection des itiné-
raires.
3. Une approche hybride entre les modèles de conception du réseau et les modèles de choix ;
4. Des études ont pour objectif la conception du réseau couplée à l’affectation des vols.
Catégorie 1
Dans la littérature, la plupart des modèles impliquent le choix à partir d’un ensemble de mar-
chés proposés. Typiquement, les vols sont représentés par des arcs. Un passager allant de Paris
à Londres est représenté différemment d’un passager qui va de Nice à Paris. Ce modèle contient
deux types de variables, une variable discrète pour modéliser la décision sur le choix et une va-
riable continue pour modéliser la décision sur le flux [Magnanti and Wong, 1984].
Kim and Barnhart [1999] présente trois modèles pour le problème de la conception du réseau
et propose une méthode de la génération des colonnes pour le résoudre.
Certains chercheurs comme [Jaillet et al., 1996] ont proposé des programmes mathématiques
en nombres entiers pour modéliser des réseaux aériens avec capacité. La matrice des demandes
sur les villes origine-destination est fournie. Ensuite, le réseau conçu en Hub & Spoke est renvoyé.
3.2 – Planification des vols 55
Catégorie 2
Sha et al. [2015] ont proposé un modèle de choix discret utilisant la théorie de l’utilité. La
fonction d’utilité est modélisée comme une combinaison linaire de plusieurs variables corrélées.
Ainsi, les préférences de chaque variable sont estimées en utilisant des données historiques. Les
auteurs modélisent la décision de la sélection des routes comme une variable binaire.
Catégorie 3
Dobson and Lederer [1993], Lederer and Nambimadom [1998] ont étudié ce problème couplé
avec la planification des vols en tenant compte de la concurrence. Ainsi, les chercheurs calculent
la demande pour chaque route comme une fonction de la qualité de service et le prix de toutes les
routes concurrentes. En outre, ils proposent une heuristique pour trouver les prix des routes avec
les horaires qui maximisent le profit de la compagnie aérienne. La plupart des études s’adressent
généralement à des problèmes de minimisation des coûts. Cette étude tient en compte deux vi-
sions : le passager et la compagnie aérienne. La demande est calculée pour chaque route avec la
fonction de la régression logistique (logit). Par ailleurs, Adler [2005] ont utilisé la théorie des jeux
pour modéliser l’aspect de la concurrence.
Catégorie 4
Budhiraja et al. [2006], Zhang et al. [2016] ont proposé un modèle qui résout le problème de
développement des routes avec le problème d’affectation d’avions aux vols. Le modèle intègre les
préférences des passagers pour tenir compte de la concurrence. Afin de modéliser ces préférences,
les auteurs utilisent la fonction de la régression logistique pour le calcul de la part de marché.
Les chercheurs traitent la demande dynamiquement en fonction de l’offre et considèrent les deux
types de demandes, contrainte et non contrainte. Le problème défini par les auteurs considère un
ensemble d’itinéraires possibles sur un marché donné et la décision porte sur quels itinéraires la
compagnie aérienne va opérer en tenant compte de la flotte disponible (le nombre d’avions, et le
type de chaque avion). Ainsi, les auteurs ne traitent que le développement local c’est-à-dire au
niveau d’un marché quelconque et non pas le réseau global de la compagnie aérienne.
Lohatepanont and Barnhart [2004] proposent une version du problème d’affectation d’avions
aux vols permettant de sélectionner des segments de vols à inclure dans le but de maximiser le
profit. Ils ont prouvé qu’il y a un gain potentiel dans le revenu. Généralement, la génération des
horaires se fait manuellement au début dû à la complexité du problème. Ensuite, des techniques
d’optimisation viennent pour optimiser, c’est-à-dire, supprimer des vols non rentables et les rem-
placer par de nouveaux rentables.
Schön [2007] a proposé un modèle orienté marché qui résout le problème RD avec le problème
de planification des vols. Le problème a été modélisé sous forme d’un programme mixte binaire
tel que la fonction objectif est concave avec des contraintes linéaires. De plus, le modèle intègre
des informations sur la tarification suivant les classes des passagers.
Di Wang et al. [2014] étudient l’effet du spill&recapture dans le cas de la planification de la
capacité. En effet, le spill est un phénomène qui survient quand la demande dépasse la capacité ou
bien quand l’itinéraire en question n’est plus disponible et donc cela revient à voir les autres iti-
néraires disponibles (recapture). Les auteurs proposent un nouveau modèle d’affectation d’avions
56 C HAPITRE 3 — Les problèmes décisionnels dans l’aérien
aux vols. Comme mentionné par les auteurs, la décision concernant la sélection des marchés est
plus compliquée car cela engendre un coût supplémentaire lié à l’entrée de ce marché. Les auteurs
proposent, ainsi, un ensemble des marchés potentiels qui présentent des bénéfices pour l’ensemble
des vols du réseau. La sélection des marchés à entrer s’appuie sur la sélection de la fréquence. En
fait, l’identification d’itinéraires à marquer détermine naturellement si un marché doit être ouvert.
Méthodes de résolution
RD
Taille ≫
Des modèles mathématiques ont été largement utilisés pour modéliser les problèmes de la pla-
nification dans une compagnie aérienne. Trois problèmes d’optimisation combinatoire principaux
sont utilisés pour la modélisation :
— problème de partition ;
— problème de flot multi-commodités ;
— problème d’Euler.
3.3 – Planification des vols 57
Le problème d’Euler est résolu en temps polynomial tandis que les autres sont des problèmes
NP-complet. Des méthodes exactes comme l’algorithme de séparation et évaluation (en anglais
Branch & Bound) ont été utilisées. Quand il s’agit des problèmes de grandes tailles, d’autres tech-
niques de résolutions sont appelées comme la génération des colonnes. Le problème pour trouver
l’affectation d’avion ou l’équipage aux vols consiste à trouver le flot à coût minimum. Quand il y
a plusieurs types d’avions, des versions de problème flot comme multi-commodités sont utilisées.
Quand le problème devient grand, des techniques spécifiques comme la relaxation Lagrangienne
ou la décomposition de Dantzig-Wolf sont utilisées pour les LP relaxations [Eltoukhy et al., 2017].
3.2.3.4 Résultats
Bien que les considérations concernant les aéroports, les avions, le nombre personnel et les
marchés constituent à elles seules un énorme défi pour les responsables des compagnies aériennes,
la tâche de planification des horaires des vols est rendue encore plus difficile par deux facteurs
principaux :
— l’ampleur du problème (les grandes compagnies aériennes exploitent des milliers de vols
avec des centaines d’équipages et d’avions) ;
— le fait que le système est sujet à des incertitudes affectant la demande de passagers, les prix
et les opérations des compagnies aériennes, entre autres.
À notre connaissance, tous les travaux de recherche menés sur le problème de planification
des horaires ne se résolvent pas en temps réel, car les temps de calcul sont très importants. Ainsi,
ils partent d’une solution de départ établie manuellement. Ensuite, ils essayent de l’améliorer avec
les modèles d’optimisations couplés à des outils de simulation. Par exemple, [Lohatepanont and
Barnhart, 2004] résolvent les problèmes d’une grande compagnie aérienne qui contient environ
800 segments de vol potentiels pour l’étude, 65 000 itinéraires et 165 avions, résultant en des
formulations avec 30 000 à 60 000 lignes et 50 000 à 65 000 colonnes, et des temps de solution
allant de 12 heures à plus de 3 jours.
Néanmoins, en raison de l’incapacité de ces modèles d’optimisation à résoudre le problème
en temps réel, même pour une résolution partielle qui réduit sans doute la complexité du pro-
blème mais génère des solutions de moindre qualité. Il est encore difficile à ce jour de résoudre un
sous-problème en temps réel indépendamment des autres. Les chercheurs ainsi se contentent juste
d’évaluer le gain généré.
Auteurs Problème étudié Objectifs Formulation Méthodes de Résolution
[Magnanti and network design concevoir la topologie du réseau aérien MIP B&B
Wong, 1984]
58
[Jaillet et al., 1996] network design trouver le réseau optimal PLNE heuristique
[Kim and Barnhart, problème de flot analysez la concurrence vis-à-vis du prix, logit génération des colonnes
1999] multi-commodités fréquence et taille des avions
théorie de l’utilité données historiques
[Sha et al., 2015] planification des sélectionner des routes à ajouter ou à sup-
choix discrets estimation
routes primer
[Dobson and Lede- network design, maximiser le profit en tenant compte de la logit heuristique
rer, 1993] schedule design concurrence
[Lederer and Nam- network design, maximiser le profit en tenant compte de la logit heuristique
bimadom, 1998] schedule design concurrence
[Adler, 2005] network design analysez la concurrence vis-à-vis du prix, logit théorie des jeux
fréquence et taille des avions
3.3.1 Utilités
Les modèles d’estimation de parts de marché MS (en anglais Itinerary Market Share Models)
sont utilisés pour estimer la probabilité qu’un passager sélectionne un itinéraire spécifique reliant
une paire d’aéroports [Garrow, 2016]. Les itinéraires sont les produits finalement achetés par les
passagers. Un itinéraire peut être simplement un vol direct ou bien un vol avec escale ou cor-
respondance. Les vols directs, avec escale ou avec correspondance représentent l’ensemble des
itinéraires que le passager peut choisir. L’objectif de ces modèles est de mesurer l’attractivité de
chaque itinéraire pour un seul passager. Cette attractivité peut être interprétée comme la part de
marché de l’itinéraire. La part de marché d’une compagnie aérienne A est définie par la proportion
de la demande totale du marché que la compagnie aérienne peut capturer [Belobaba et al., 2015].
La compagnie aérienne utilise ce type de modèles pour estimer la part de marché attendue d’un
vol donné sur un marché O&D donné. Ces modèles mesurent la profitabilité de ce vol. Un moyen
éprouvé est de refléter le processus de décision des passagers, sur la base des données empiriques
des passagers réels. Prenons l’exemple 3.3.1.
Exemple 3.3.1 (Cas d’étude de part de marché). Supposons qu’un passager veuille acheter un
billet pour aller de Nice/France (NCE) à Bangkok/Thaïlande (BKK). En pratique, le passager se
rend dans une agence de voyage à Nice et demande s’il existe une possibilité pour se rendre à
Bangkok. Le système de réservation de l’agence de voyage affichera toutes les possibilités dispo-
nibles, notamment les vols sans escale et avec correspondance pour faire le transfert. Générale-
ment, le transfert se fait via CDG, FRA, AMS, LHR, et d’autres hubs de correspondance. La question
qui se pose est sur quels types de critères de choix le passager se basera pour choisir l’itinéraire
le plus attrayant ? Probablement, le passager comparera la durée totale du voyage, la réputation
de la compagnie aérienne concernée, l’heure de départ et d’arrivée et le tarif proposé (voir la fi-
gure 3.8). En fonction de l’importance de ces critères, le passager décidera finalement l’option qui
correspond le plus à ses critères.
Dans la figure 3.8, la formule pour estimer la part de marché correspond à la formule utilisée
dans le cas des modèles basés sur la fonction logit (voir la section 3.3.2.2).
60 C HAPITRE 3 — Les problèmes décisionnels dans l’aérien
Étapes Descriptions
1- Étude du profil de la de- Trajet demandé : NCE-BKK
mande
durée de trajet * β1
"Utilité" attendue
3 - Estimation de l’utilité du + arrêts * β2
de l’itinéraire i (util(i)) =
choix + prix* β3 + ...
Part de Marché capturée P exp(util(i))
4 - Estimation de la part de
sur l’itinéraire i = exp(util(j))
marché probable j∈J
F IGURE 3.8 – Schéma du fonctionnement des modèles de MS basés sur les modèles logit
Les modèles MS sont similaires à ceux de revenue management dans le sens où ils estiment
la demande pour le transport aérien. Ces modèles sont utilisés pour aider à prendre des décisions
concernant les destinations à servir, le type d’équipement à utiliser et prédire le comportement
de l’évolution de la demande en fonction de la fréquence de vol, du niveau de service et du type
d’appareil [Garrow, 2016]. Ces modèles se rapportent aux modèles de la prévision de la demande
puisque la demande totale pour un itinéraire spécifique est représentée par l’ensemble des choix
faits par les passagers.
Cette approche se distingue des techniques statistiques traditionnellement utilisées par les
compagnies aériennes pour la prévision de la demande. La prévision de la demande se présente
sous deux formes : prévision du marché total et prévision de la part de marché capturée par
la compagnie aérienne sur un itinéraire. Ces approches classiques se basent essentiellement sur
l’historique ou bien sur des facteurs démographiques et économiques en l’absence de l’historique.
Cependant, elles sont limitées pour trois raisons :
— la plupart se base principalement sur l’historique qui n’est pas toujours disponible ;
— Les facteurs utilisés n’expliquent pas le choix des passagers ;
— Elles ne permettent pas d’estimer la demande sur un niveau plus détaillé que la demande
globale du marché.
Par ailleurs, les modèles MS peuvent bien être couplés avec ces modèles classiques pour bien
estimer une demande spécifique. Multiplier la demande totale par la part de marché estimée donne
alors la demande estimée pour un itinéraire spécifique.Ainsi, le calcul de la demande pour un
itinéraire se fait en deux étapes :
— estimer la part de marché (l’étape 2 de la figure 3.6) ;
— estimer la demande totale sur le marché (l’étape 3 de la figure 3.6).
Aujourd’hui, il y a une forte demande de ces modèles dans le secteur aérien. Comme le choix
des passagers est l’itinéraire, il est donc indispensable de se focaliser sur les caractéristiques de ces
3.3 – Modèles de part de marché : MS 61
itinéraires. En faisant leur choix d’itinéraire, les passagers font des compromis entre les critères
qui définissent chaque itinéraire, à savoir : durée de vol, prix de vol, nombre de correspondance,
type d’appareil, etc. Ainsi, la modélisation de ces compromis est cruciale pour bien estimer la
demande.
Les anciennes études ont identifié deux catégories principales des modèles de calcul de part
de marché [Barnhart and Smith, 2012] que l’on peut classer selon la nature de l’approche :
— Méthodes quantitatives : basées sur les modèles de choix discret (ou logit) ;
— Méthodes qualitatives : basées sur le modèle de QSI.
Les modèles de choix discret sont également appliqués dans l’aérien pour modéliser le choix
de passager, ce choix porte sur l’itinéraire. Cela permettra d’estimer la part de marché pour la
compagnie aérienne [Coldren, 2005, Koppelman et al., 2008, Grosche, 2009a, Goedeking, 2010,
Barnhart and Smith, 2012, Garrow, 2016, Barnhart and Smith, 2012, Busquets et al., 2018].
Les premiers modèles de part de marché sont les modèles de QSI (en anglais Quality of Service
Index). Les modèles de QSI, développés par le gouvernement américain en 1957 dans le cadre de
la réglementation des compagnies aériennes, associent la part des passagers d’un itinéraire à sa
qualité vis-à-vis de la qualité des autres itinéraires. C’est un modèle qualitatif qui mesure la qualité
d’un itinéraire, où la qualité est exprimée en fonction des différents critères suivant leurs poids de
préférences correspondants. Pour un modèle de QSI donné, ces poids de préférences peuvent être
obtenus à l’aide des méthodes statistiques et/ou d’une intuition d’analyste [Coldren, 2005]. Le
modèle de QSI est un modèle subjectif qui laisse plus de liberté à l’utilisateur de définir le modèle
qui colle le mieux à son positionnement sur le marché considéré.
Une fois que les poids des critères sont fixés, le résultat obtenu est un score de l’itinéraire
observé vis-à-vis des autres itinéraires du marché considéré. Le score QSI est exprimé sous forme
d’une équation linéaire ou multiplicative.
Formule de calcul
Le QSI est calculé pour chaque itinéraire possible comme une somme ou un produit pon-
déré de critères. Ainsi, la probabilité qu’un passager utilise un itinéraire i est exprimée comme
suit [Coldren, 2005, Garrow, 2016, Jacobs et al., 2012].
Exemple 3.3.2 (Modèle QSI). Supposons qu’on ait un modèle QSI mesurant la qualité de l’itiné-
raire en fonction de quatre critères de service :
1. nombre de correspondances ;
2. tarif ;
3. type de compagnie aérienne ;
4. type d’appareil.
62 C HAPITRE 3 — Les problèmes décisionnels dans l’aérien
Ces critères sont représentés par des variables indépendantes X1 , X2 , X3 , X4 et leurs poids
correspondants β1 , β2 , β3 , β4 :
QSIi = (β1 X1 + β2 X2 + β3 X3 + β4 X4 )
Le modèle de QSI pose des problèmes pour deux raisons [Barnhart and Smith, 2012, Garrow,
2016] :
— l’interdépendance des critères ;
— la concurrence entre les itinéraires.
D’une part, les poids sont fixés d’une manière indépendante des autres poids. Ainsi, les mo-
dèles de QSI ne prennent pas en compte les interactions qui existent entre les critères d’un itiné-
raire. À titre d’exemple, le temps de voyage est fortement corrélé avec le nombre de correspon-
dance.
D’autre part, les modèles de QSI ne permettent pas de mesurer la concurrence entre les iti-
néraires qui existent. Cette problématique peut être constatée en analysant l’équation d’élasticité
croisée 3.6 par la variation de la part des passagers pour l’itinéraire j, Sj , en raison de la modifica-
tion du score de QSI de l’itinéraire i, QSIi . En économétrie, l’élasticité croisée est calculée pour
le critère de prix et permet ainsi de mesurer la variation relative du prix d’un bien à la suite d’une
augmentation relative du prix d’un autre bien [Louviere et al., 2000] :
Sj ∂Sj QSIi
ηQSI = = −Si
i ∂QSIi Sj
Pour calculer l’élasticité pour le modèle QSI, on commence par appliquer la règle de la dérivée
∂f (x) ∂g(x)
∂ f (x) (g(x))−(f (x)) ∂x
d’un quotient ( ∂x ( g(x) ) = ∂x
(g(x)) 2 ). On obtient :
∂Sj ∂ QSIj
= (P ) (3.1)
∂QSIi ∂QSIi k∈J QSIk
P
∂Sj (0)( k∈J QSIk ) − QSIj
= P (3.2)
∂QSIi ( k∈J QSIk )2
∂Sj QSIj
=− P (3.3)
∂QSIi ( k∈J QSIk )2
3.3 – Modèles de part de marché : MS 63
S ∂Sj QSIi
j
ηQSI = = −Si (3.6)
i ∂QSIi Sj
Tel que :
QSIi
Si = P
k∈J QSIk
D’après l’équation 3.6, on constate que le résultat de l’élasticité ne dépend pas de l’indice
j. On peut traduire ça par le fait que varier la qualité du QSI de l’itinéraire i n’impacte pas la
proportion des passagers capturés des autres itinéraires reliant la paire d’aéroports. Ce qui n’est
pas réaliste. En effet, si le prix d’un itinéraire reliant la paire d’aéroports a baissé, il est probable
qu’il y aura plus de passagers empruntant cet itinéraire. Donc, cela va impacter la proportion des
passagers restant sur les autres itinéraires du marché considéré.
En résumé, les modèles de QSI ne peuvent pas capturer les interactions entre les itinéraires du
marché.
Pour l’équation 3.6 de l’élasticité croisée du modèle QSI, les deux livres cités dans cette sec-
tion [Barnhart and Smith, 2012, Garrow, 2016] présentent l’erreur suivante :
Sj ∂Sj QSIi
ηQSI = = −Si QSIi
i ∂QSIi Sj
Il faut se référer à la publication originale de l’auteur [Coldren, 2005].
Modèle S-curve
Dans la littérature, il existe un autre modèle pour le calcul d’une part de marché : S-curve. Ce
modèle établit la relation entre la part du marché d’une compagnie aérienne et la part de la fré-
quence (en anglais Frequency Share) [Belobaba et al., 2015]. Ce modèle suppose que la fréquence
de la compagnie aérienne est variable tandis que toutes les autres variables (prix du billet, type de
service) restent les mêmes pour toutes les compagnies aériennes.
Le modèle ressemble à celui du QSI, ce dernier inclut plus de critères qui permettent de se
rapprocher au maximum de la réalité.
Les modèles de choix discrets sont utilisés pour modéliser le comportement des clients et
« prédire la probabilité qu’un décideur choisisse une alternative parmi un ensemble fini d’alterna-
tives mutuellement exclusives et collectivement exhaustives » [Barnhart and Smith, 2012, Coldren,
64 C HAPITRE 3 — Les problèmes décisionnels dans l’aérien
2005, Garrow, 2016]. Ces modèles peuvent être caractérisés par quatre éléments [Barnhart and
Smith, 2012, Coldren, 2005] : un décideur, un ensemble d’alternatives disponibles, les attributs
des alternatives et une règle de décision.
Premièrement, le décideur est une personne ou groupe de personnes qui prend la décision
de choisir l’une des alternatives possibles. Ces alternatives possibles constituent un ensemble fini
d’alternatives mutuellement exclusives et collectivement exhaustives. Les attributs sont les ca-
ractéristiques des alternatives que les décideurs considèrent lors du processus de choix. Enfin, la
règle de décision considérée par la plupart des décideurs est de choisir l’alternative qui maximise
leur utilité. L’utilité représente la valeur que le décideur attribue à différents attributs et illustre
comment le décideur fait des compromis entre différentes alternatives [Barnhart and Smith, 2012,
Coldren, 2005].
Comme expliqué avant, le décideur doit choisir l’alternative qui maximise leur utilité. Dans le
cas de notre domaine d’application, on considère un ensemble de passagers confrontés au même
ensemble d’alternatives, qui sont les itinéraires reliant une paire d’aéroports sur un marché.
Comme l’analyste ne connaît pas l’utilité réelle. L’utilité de chaque alternative pour une déci-
sion donnée est décomposée en deux composantes : une composante déterministe qui représente
les attributs observables des alternatives, et une composante aléatoire ǫ représentant ce qui n’a pas
été observé. En d’autres termes, ǫ représente l’erreur de l’observation [Coldren, 2005].
Ui = Vi + ǫi (3.7)
k=n
X
Vi = βk Xki (3.8)
k=1
Vi est l’utilité observée de l’alternative i qui est supposée une combinaison linéaire des va-
riables explicatives Xki (k ième attribut de l’alternative i) et des paramètres estimés βk .
Notation
La règle de décision est alors la suivante : l’individu n choisit une des deux alternatives si
l’utilité qu’il en retire est supérieure à l’utilité attendue de l’autre alternative. Reprenons notre
exemple 3.3.1. Le passager n peut choisir l’itinéraire qui est un vol direct entre Nice et Bangkok
opéré par la compagnie aérienne LH, si l’utilité de cet itinéraire est plus grande que les autres
itinéraires, typiquement, l’itinéraire opéré par la compagnie AF (voir la figure 3.8). Soit y une
variable binaire modélisant l’alternative choisie :
3.3 – Modèles de part de marché : MS 65
(
1, si l’individu n choisit l’alternative i
yni = (3.9)
0, sinon
Dans la logique de cette approche, on suppose que le décideur sélectionne l’alternative parmi
les différentes alternatives qui maximise son utilité, et que l’analyste considère que l’utilité est
aléatoire. Cette hypothèse de choix aléatoire se traduit par la nécessité de calculer la probabi-
lité que le décideur choisisse une alternative i parmi l’ensemble des alternatives possibles dans
J, P (i : J) [Coldren, 2005] :
Définition de l’ensemble
J Analyse des alternatives
des itinéraires (alternatives)
Comme présenté dans le paragraphe 3.3.2.2, les modèles de choix discrets tels que le modèle
MNL est un modèle basé sur la théorie de l’utilité aléatoire. Il est considéré comme un modèle
économique de choix discrets [Garrow, 2016]. C’est une généralisation du modèle de la régression
logistique binomiale qui est utile dans le cas où on souhaite classer des objets en fonction des
valeurs d’un groupe de variables à prédire. Ainsi, on distingue des variables explicatives et des
variables à expliquer.
Dans la logique de cette approche, les passagers choisissent un itinéraire parmi un ensemble
fini d’itinéraires qui sont mutuellement exclusifs et collectivement exhaustifs (c’est-à-dire décri-
vant toutes les éventualités possibles). L’individu choisit l’alternative maximisant son utilité. Dans
3.3 – Modèles de part de marché : MS 67
le cas de ce modèle, l’attraction mesurée qui est la part des passagers capturée sur l’itinéraire i, Si
est :
eVi
S i = Pi = P (3.11)
j∈J eVj
Tel que :
Preuve 3.3.1. Tout d’abord, on commence par rappeler la distribution de la loi standard de Gum-
bel, qui est une loi continue. Soit X une variable aléatoire continue, X ∼ G(0, 1) [Louviere
et al., 2000] :
(
F (x) = exp(− exp(−x)) (3.12a)
f (x) = exp(−x). exp(− exp(−x)) (3.12b)
Tel que :
F (x) est la fonction de répartition et f (x) est la fonction de densité ∀x ∈ D(X). D(X) est le
domaine de définition de la variable X, qui est définie sur tout l’ensemble des réels : R.
D’après l’équation 3.10, on a pour un certain ǫi :
En appliquant la loi de probabilité totale pour le cas des variables aléatoires mixtes [Gubner,
2006] :
+∞
Z
P (Y ∈ A) = P (Y ∈ A|X = x)dFx (x) (3.18)
−∞
Comme f (x) = dFx (x)/dx ∀x ∈ D(X) et A est un événement. En substituant cette loi
dans l’équation 3.17 :
+∞
Z
Pi = Pni|ǫi f (ǫi )dǫi (3.19)
−∞
Bien sûr ǫi n’est pas donné, alors la probabilité de choix de Pi est l’intégrale de Pni|ǫi sur
toutes les valeurs possibles de ǫi pondérées par leurs densités 3.12b, rappelons que ǫi est une
variable continue qui représente l’erreur et yni est une variable aléatoire discrète définie dans
l’équation 3.15 :
+∞
Z Y
Pi = ( exp(− exp(−(ǫi + Vi − Vj ))))f (ǫi )dǫi (3.20)
−∞ j6=i
En remplaçant la densité fǫi par son expression définie dans l’équation 3.12b :
+∞
Z Y −(ǫi +Vi −Vj ) −ǫi
Pi = ( e−e )(e−ǫi .e−e )dǫi (3.21)
−∞ j6=i
Rappelons que le produit des exponentiels est simplement l’exponentiel de la somme de ses
Q P
exposants : j exp(xj ) = exp( j xj )) et que : exp(−s) = exp(−(s + Vi − Vi )) car Vi − Vi = 0,
cela nous permet d’inclure le cas où j = i. Donc, on peut l’inclure dans le produit :
3.3 – Modèles de part de marché : MS 69
+∞
Z Y −(s+Vi −Vj )
Pi = ( e−e )e−s ds (3.23)
−∞ j
+∞
Z X
Pi = exp(− e−(s+Vi −Vj ) )e−s ds (3.24)
−∞ j
+∞
Z X
Pi = (exp(−e−s e−(Vi −Vj ) e−s ds (3.25)
−∞ j
(3.26)
Pour calculer la primitive, on passe par un changement de variable.
Posons t = exp(−s)⇐⇒dt = − exp(−s)ds
t −−−−→ +∞
s→−∞
Et
t −−−−→ 0
s→+∞
Z0 X
Pi = (exp(−t e−(Vi −Vj ) ))(−dt) (3.27)
+∞ j
+∞
Z X
= (exp(−t e−(Vi −Vj ) ))dt (3.28)
0 j
(3.29)
R 1
On sait que la primitive de la fonction exponentielle est exp(ax+b)dx = a exp(ax+b)+C.
P
soit a = − j e−(Vi −Vj ) :
P−(Vi −Vj ) ) t=+∞
exp(−t je
Pi = P +C (3.30)
− j e−(Vi −Vj ) t=0
(3.31)
La constante C = 0 car Pi est nulle quand t tend vers +∞.
P −(Vi −Vj ) ) t=+∞
exp(−t je
Pi = P −(Vi −Vj )
(3.32)
− je t=0
exp(−∞) − exp(0)
Pi = P (3.33)
− j e−(Vi −Vj )
−1
Pi = P −(V −V ) (3.34)
− je i j
(3.35)
En multipliant le numérateur de l’équation par exp(Vi ) alors on trouve la formule de la part
de marché pour le modèle MNL présentée dans l’équation 3.11 :
−eVi
Pi = P
−eVi j e−(Vi −Vj )
70 C HAPITRE 3 — Les problèmes décisionnels dans l’aérien
eVi
Pi = P Vj (3.36)
je
Dans la littérature, différents types de modèles de choix discrets ont été utilisés dans plusieurs
domaines d’application y compris le transport aérien [Garrow, 2016]. Le modèle MNL constitue
un cadre de référence incontournable pour la modélisation des choix discrets individuels au sein
d’une catégorie de produits. Le modèle a été appliqué pour la première fois dans le domaine du
marketing et a été appliqué par la suite à la modélisation des choix des itinéraires des passagers
pour une paire d’aéroports. L’étude publiée par [Coldren et al., 2003] est parmi les premières
études publiées sur les modèles MNL. Les auteurs ont utilisé une approche agrégée au niveau
régional pour estimer la part de marché de tout itinéraire reliant chaque paire de villes aux États-
Unis.
Les données utilisées dans ce travail proviennent de trois sources différentes. Les données de
réservation (CRS : Système de réservation centralisé (en anglais Computer Reservation System))
contiennent des enregistrements détaillés sur les itinéraires réservés [Jacobs et al., 2012]. Les don-
nées de CRS contiennent les informations suivantes pour chaque itinéraire : origine/destination
du voyage, segments de vols, numéro de vol, heure départ/arrivée, date de départ/arrivée et la
compagnie aérienne. La deuxième source est les données de l’OAG (Official Airline Guide). Cette
source fournit les informations suivantes : la compagnie qui opère, le partage de code (s’il y a eu
un partage de code), jour d’opération, distance, heure de départ/d’arrivée, numéro de vol et durée
de vol. La dernière source qui est un super-ensemble des données provenant de la base de don-
nées (DB1A : Origin and Destination Data Bank 1A) [Jacobs et al., 2012, Guide, JULY 2018],
ce sont les données collectées avant 1998 sur les marchés O&D. Ces données sont basées sur un
échantillon de 10% de billets d’avion achetés par les passagers qui sont à bord de l’avion exploités
par les compagnies aériennes américaines. Par ailleurs, ces données fournissent des informations
sur le nombre de passagers qui voyagent entre la paire d’aéroports origine-destination, des infor-
mations sur l’itinéraire (compagnie vendeur, compagnie opérante, classe de service : économique,
affaire) et les informations tarifaires (tarif moyen trimestriel sur toutes les classes défini par chaque
compagnie aérienne pour une paire origine/destination).
Même si les données brutes de ces jeux de données sont populairement utilisées dans la re-
cherche académique, les compagnies aériennes achètent généralement un super-ensemble de don-
nées de la compagnie Data Base Products[Garrow, 2016, Jacobs et al., 2012]. C’est une version
qui a été nettoyée après avoir été validée par croisement avec d’autres sources de données. Cela
permet de fournir une estimation plus précise de la taille du marché.
Les jeux de données constituent un seul mois des départs (janvier 2000) représentant toutes les
paires d’aéroports définies par deux entités régionales qui sont définies par fuseau horaire [Coldren
and Koppelman, 2005]. Ainsi, l’étude contient 5 entités. Les résultats montrent que le modèle
MNL dépasse le modèle QSI car l’erreur est de l’ordre de 10-15%. Le modèle QSI utilisé par la
compagnie aérienne américaine a été remplacé par le modèle MNL développé par [Coldren et al.,
2003]. Les auteurs ont statistiquement montré l’impact de la part estimée pour chaque itinéraire
sur l’ensemble des critères caractérisant un itinéraire donné. Les critères pris en compte dans cette
étude sont décrits dans le tableau 3.2.
3.3 – Modèles de part de marché : MS 71
Variable Description
Niveau de service variable binaire représentant le niveau de service de l’itiné-
raire (direct, avec escale, avec correspondance)
Type de compagnie représente les compagnies ayant plus que 0.5% des départs
Tarif pourcentage du tarif moyen de la compagnie par rapport au
tarif moyen sur le marché
Ratio de distance ratio de la distance d’itinéraire par rapport à la distance du
plus court itinéraire
Deuxième meilleure connexion indique quel’itinéraire n’est pas la meilleure connexion pour
les itinéraires de correspondance
Partage du code indique si le segment du vol de l’itinéraire a été réservé en
tant que partage de code
Avion avec hélice indique s’il existe un segment de vol de l’itinéraire qui a été
opéré par un avion avec hélice
Avion régional indique s’il existe un segment de vol de l’itinéraire qui a été
opéré par un avion régional
Sièges d’hélice mesure le nombre de sièges du petit avion avec hélice dans
le cas où l’itinéraire inclut un segment de vol avec ce type
d’avion
Sièges d’avion régional mesure le nombre de sièges du petit avion régional dans le cas
où l’itinéraire inclut un segment de vol avec ce type d’avion
Moment de la journée variable pour chaque heure de la journée
TABLE 3.2 – liste des critères pris en compte dans l’étude [Coldren et al., 2003]
[Koppelman et al., 2008] ont repris le même modèle mais cette fois-ci pour inclure les retards.
Ceci a été modélisé par le fait d’imposer une fonction de pénalité.
[Busquets et al., 2018] ont repris le modèle proposé par [Coldren et al., 2003] mais sur un
niveau plus agrégé sans tenir compte des préférences des itinéraires.
Une autre approche d’estimation de part de marché se base sur les modèles des réseaux neu-
rones. Ces modèles fonctionnent comme des boîtes noires : on donne de grands échantillons de
données réelles (données de réservation) pour apprendre les interrelations entre les variables, appli-
quer par la suite ce qu’ils ont appris pour estimer les préférences des passagers pour des marchés
inconnus. Les réseaux neurones donnent des résultats souvent supérieurs aux modèles de choix
discrets, typiquement, le modèle MNL [Grosche and Rothlauf, 2007, Goedeking, 2010]. Toute-
fois, ces modèles ne donnent pas un aperçu sur les règles qu’ils ont apprises et appliquées. Ainsi,
de nombreux utilisateurs hésitent d’accepter le résultat sans comprendre la raison pourquoi le mo-
dèle a donné ce résultat. En revanche, les modèles de choix discrets offrent des résultats sensés
avec une transparence et visibilité maximale concernant le processus de calcul.
IIA peut être interprétée comme la probabilité de choisir l’alternative i en changeant la k éme va-
riable qui décrit l’utilité de la iéme alternative pour l’individu n, elle est équivalente à l’équation
d’élasticité croisée du modèle QSI (voir l’équation 3.37).
P ∂P j Xik
ηXjik = (3.37)
∂Xik P j
Preuve 3.3.2. Cette équation de l’élasticité nécessite une évaluation de la dérivée partielle, qui
peut être obtenue en utilisant la règle du quotient pour les dérivées (c’est-à-dire, ∂eaY /∂Y =
aeaY ) :
D’une part, on a :
∂Pj ∂ e(Vj )
= (P (Vj )
)
∂Xik ∂Xik k∈J e
En appliquant la règle de la dérivée d’un quotient, on obtient :
P
P V
V ∂(ej ) ∂( l∈J eV
l )
∂Pj ( l el ) ∂Xik − (eVj ) ∂X ik
= P
∂Xik ( l∈J eVl )2
Tel que :
e(Vj )
Pi = P (Vj )
k∈J e
D’une autre part :
∂Pj Xik
= −Pi Xik βk
∂Xik Pj
Par conséquent, l’élasticité croisée peut être évaluée pour le cas du modèle MNL comme
suit [Louviere et al., 2000] :
P ∂P j Xik
ηXjik = = −Pi Xik βk (3.38)
∂Xik P j
Le résultat de l’équation de l’élasticité croisée pour le modèle MNL (voir l’équation 3.38)
n’est pas en fonction de j. Ceci est la même chose pour le modèle de QSI ; cela veut dire que
l’élasticité croisée est invariante d’une alternative à une autre. En d’autres termes, un changement
au niveau d’une alternative n’engendra pas une modification de l’utilité d’une autre alternative.
Cette hypothèse ne peut pas être réaliste. Par exemple, choisir un itinéraire avec correspondance
peut être fortement corrélé avec la perte des bagages [Barnhart and Smith, 2012].
Les modèles de QSI suivent le même raisonnement que les modèles MNL pour refléter le
processus de décision des passagers. Ces modèles calculent un indice de qualité de service, QSI,
pour chaque opportunité de connexion, et prennent la part du score, QSI, d’une opportunité de
connexion particulière parmi toutes les opportunités de connexion sur l’O&D sélectionné comme
3.4 – Lacunes de la littérature 73
part de marché. Les modèles MNL sont une variante des modèles QSI dans le sens que ces modèles
supposent une relation particulière entre les facteurs qui déterminent la prise de décision. Les
différentes implémentations de QSI diffèrent en ce qui concerne le calcul du nombre et de la
quantité de critères utilisés, la manière dont les facteurs de pondération sont déterminés et la
manière dont les facteurs pondérés sont combinés en un seul QSI global.
L’une des raisons pour lesquelles les modèles MNL sont couramment utilisés dans les prévi-
sions réside dans leur structure bien définie, facilitant la calibration des paramètres à estimer (les
paramètres βk ) et les temps de calcul. En outre, ces modèles modélisent bien l’interaction entre
les différents critères d’une alternative, ce qui n’est pas le cas pour le modèle de QSI (voir le
paragraphe 3.3.2.1).
Bien que le modèle MNL puisse être critiqué pour l’indépendance des alternatives qu’il im-
pose, des comparaisons récentes de modèles de choix d’itinéraires basés sur les méthodologies
MNL et QSI chez une grande compagnie aérienne américaine (Americain Airlines) ont clairement
montré que les modèles MNL sont plus fiables que les modèles de QSI. Par conséquent, la pro-
priété de l’indépendance des alternatives non pertinentes ne doit pas être considérée comme une
limite des modèles de choix discrets, car de nombreux autres modèles (décrits en détail dans le
livre de [Garrow, 2016]) peuvent être utilisés pour relâcher cette propriété. Notamment, le modèle
logit emboîté basé sur le modèle multinomial (en anglais nested logit). Néanmoins, il est intéres-
sant de noter que, dans le contexte des modèles de choix d’itinéraire, même le modèle MNL a
considérablement dépassé le modèle QSI [Barnhart and Smith, 2012, Garrow, 2016, Goedeking,
2010, Busquets et al., 2018, Grosche and Rothlauf, 2007, Koppelman et al., 2008].
horaire mais tenir compte des meilleures connexions qu’on peut proposer en termes de revenue,
distance et de temps.
Deux éléments principaux ressortent donc de l’étude des modèles de part de marché proposés
dans la littérature :
1. la nécessité d’inclure les marchés impactés par le changement d’un vol ; ceci dit regarder
plusieurs O&D ;
2. la nécessité de calculer la part de marché mais suivant le meilleur en terme de flux de pas-
sagers.
C HAPITRE 4
Théorie des graphes
Dans ce chapitre, on rappelle quelques notions de la théorie des graphes ainsi que les
différents algorithmes utilisés de recherche de chemins dans un graphe.
75
4.1 – Généralités sur les graphes 77
(a) Les sept ponts de Königsberg. (b) Modélisation du problème par un graphe.
D’une façon intuitive, un graphe est une structure de données permettant de représenter des
entités, des relations et les dépendances entre ses éléments. Il est utilisé dans plusieurs domaines
d’application [Foulds, 2012] :
— Réseau social : relations d’amitié entre des personnes.
— Réseau de transport aérien : vols entre des aéroports.
— Réseau biologique : interactions physiques entre des protéines.
78 C HAPITRE 4 — Théorie des graphes
4.1.1 Notations
Cette section définit l’ensemble de notations utilisées tout au long de ce manuscrit de thèse.
Nous nous sommes basés sur le livre [Lacomme et al., 2003] pour ces définitions.
Nœuds et arcs
D’une façon formelle, un graphe G est un couple G = (X , U) constitué de deux ensembles :
1. X est un ensemble (x1 , x2 , . . . , xn ) de n sommets (en anglais vertices), appelés également
des nœuds (en anglais nodes) dans le contexte des réseaux.
2. U = (u1 , u2 , . . . , um ) est une famille de couple de sommets telle que U ⊆ X × X .
Les éléments de cette famille sont appelés arcs (en anglais arcs ou directed edges) ou arêtes,
cela dépend du type de graphe. Dans cette famille, les répétitions sont autorisées.
On définit |X | = n, l’ordre du graphe G comme le nombre de nœuds et |U| = m sa taille.
Un arc u est de la forme (x, y) avec deux extrémités : x est l’extrémité initiale et y l’extrémité
finale. La notion d’extrémité nous permet de définir les notions suivantes :
— ω(x) : l’ensemble des arcs ayant x comme extrémité ;
— ω + (x) : l’ensemble des arcs ayant x comme extrémité initiale, en fait l’ensemble des arcs
sortants de x ;
— ω − (x) : l’ensemble des arcs ayant x comme extrémité finale, en fait l’ensemble des arcs
entrants dans x.
Définition 4.1.1 (Arc incident). Soit un arc u = (x, y). On dit que l’arc u est incident intérieure-
ment à y (car il part de x) et incident extérieurement à x (car il arrive en y).
Définition 4.1.2 (Arc adjacent). On dit que deux arcs sont adjacents s’ils ont au moins une extré-
mité commune.
Définition 4.1.3 (Boucle). Une boucle (en anglais loop) est un arc reliant un sommet à lui-même.
L’extrémité initiale de cet arc est la même que l’extrémité finale.
Orienté ou pas
On distingue deux types de graphes : les graphes non orientés et les graphes orientés. Le graphe
non orienté se caractérise par le fait que les relations sont symétriques : ∀(x, y) ∈ U, (y, x) ∈ U
Dans ce cas-là, on parle d’arêtes (en anglais edges). Un réseau social sera généralement non
orienté puisque la relation amitié est réciproque. Contrairement à un réseau de transport, qui doit
être orienté pour modéliser les rues à sens unique. Généralement, on utilise les termes nœud et arc
pour les graphes orientés et sommet et arête pour les graphes non orientés.
Dans un graphe orienté, l’ensemble U est un ensemble de couples ordonnés de sommets. On
parle alors d’arcs.
La figure 4.2 sera ensuite utilisée comme exemple pour expliquer l’ensemble des notations
présentées par la suite.
4.1 – Généralités sur les graphes 79
1 2 1 2
3 3
4 5 4 5
Un graphe est dit valué ou pondéré (en anglais weighted) si on lui associe une fonction de
poids qui permet d’attribuer une valeur (un poids) à chaque arc du graphe afin de le qualifier. Le
poids peut représenter le temps de vol dans un réseau aérien ou bien la distance kilométrique dans
un réseau routier. Parfois le terme coût est utilisé. On notera w(x, y) le poids de l’arc (x, y). Le
graphe est alors représenté par un triplet G = (X , U, W) où W l’ensemble des poids.
Remarquons que, dans un contexte du transport urbain, les poids des arcs ne peuvent pas être
négatifs. Ainsi dans ce cas là ∀(x, y) ∈ U, w(x, y) ≥ 0.
Dans certains types de graphe, les poids peuvent ne pas être constants. Dans ce cas, il est
possible d’utiliser des fonctions dynamiques pour calculer le poids.
Successeurs et prédécesseurs
Dans un graphe orienté G(X , U), la notion de couples ordonnés nous permet de définir deux
nouveaux ensembles pour chaque nœud x ∈ X :
— Γ(x) : ensemble des successeurs de x ;
— Γ−1 (x) : ensemble des prédécesseurs de x.
Formellement, les ensembles Γ(x) et Γ−1 (x) sont définis comme suit :
Γ(x) = {y ∈ X | (x, y) ∈ U}
Γ−1 (x) = {y ∈ X | (y, x) ∈ U}
Définition 4.1.4 (sommet voisin). Soit un arc de la forme (x, y), y est successeur de x, et x est
prédécesseur de y. On dit que les sommets x et y sont voisins (ou adjacents).
Le degré d’un nœud x, dG (x), est le nombre d’arcs incidents à x. Dans un graphe orienté G, on
parle de degré sortant d+ (x) (en anglais out-degree) et degré entrant d− (x) (en anglais in-degree)
définis de la façon suivante :
— d+ (x) = |ω + (x)|, le nombre d’arcs partant de x.
— d− (x) = |ω − (x)|, le nombre d’arcs arrivant en x.
Le degré dG (x) représente la somme des deux degrés d+ (x) et d− (x).
80 C HAPITRE 4 — Théorie des graphes
La densité d’un graphe G, D, est définie comme le rapport entre le nombre d’arcs et le nombre
de nœuds, soit m/n2 . Ce nombre peut varier de 0 à 1, et souvent exprimé en pourcentage. Cette
notion nous permet de définir deux types de graphes.
Définition 4.1.5 (Dense). Un graphe dense est un graphe dont le nombre d’arcs est de l’ordre n2 :
le degré moyen de ses nœuds est de l’ordre de n.
Définition 4.1.6 (Creux). Un graphe creux est un graphe dont le nombre d’arcs est de l’ordre n :
le degré moyen de ses nœuds est une constante.
1 2
4 5 1 2
1 2 1 2
3 3
4 5 4
(c) graphe partiel engendré par V = {(x1 , x3 )}. (d) sous-graphe partiel.
Exemple 4.1.2 (Liste d’adjacence). Le graphe de la figure 4.2b peut être représenté sous forme de
liste d’adjacence (voir la figure 4.4).
1 1 2 3 4 /
2 1 5 /
4 3 /
5 3 4 /
F IGURE 4.4 – Représentation du graphe de la figure 4.2b avec une liste d’adjacence.
Exemple 4.1.3 (Matrice d’incidence). Pour le graphe G de l’exemple de la figure 4.2b, la matrice
d’incidence M se présente comme suit :
(1,2) (1,3) (1,4) (2,5) (4,3) (5,3) (5,3)
1 1 1 1 0 0 0 0
2 −1 −1 −1 1 0 0 0
M(G) = 3 0 −1 0 0 −1 −1 0
4 0 0 −1 0 1 0 −1
5 0 0 0 −1 0 1 1
Dans ce chapitre, nous allons focaliser sur l’approche algorithmique. Nous commençons par
présenter les notations utilisées dans la théorie des graphes pour ce genre d’approche.
Définition 4.2.1 (Chaîne). Une chaîne µ = (u1 , u2 , . . . , un ) est une séquence finie de sommets
et d’arêtes, débutant et finissant par des sommets. L’extrémité initiale de ui doit être l’extrémité
terminale de ui−1 si i ≥ 1. La longueur de la chaîne µ est égale au nombre d’arêtes qui la compose.
Une chaîne est dite simple si aucune des arêtes n’apparaît plus d’une fois dans la séquence.
Une chaîne est dite élémentaire si aucun des sommets n’apparaît plus d’une fois dans la séquence.
Définition 4.2.2 (Chemin). Un chemin (en anglais path) est une séquence de nœuds P =
{x1 , x2 , ..., xk } telle que pour chaque 1 ≤ i < k, (xi , xi+1 ) ∈ U (la notion d’un chemin est
équivalent à celle de chaîne dans un graphe orienté.).
La longueur d’un chemin P est la somme des poids de ses arcs et est notée par :
k−1
X
ł(P ) := w(xi , xi+1 )
i=1
l⋆ (s, t) pour une paire de nœuds donnée s et t, est la longueur du plus court chemin commen-
çant à s et se terminant à t. Un chemin en G est appelé simple si aucun arc ne se produit plus d’une
fois. Un chemin est dit élémentaire si aucun nœud n’apparaît plus d’une fois dans la séquence.
Définition 4.2.3 (Cycle). Un cycle est une chaîne fermée, c’est-à-dire, dont les deux extrémités
coïncident.
Définition 4.2.5 (Connexe). Un graphe connexe est un graphe tel que pour toute paire (x, y) de
sommets distincts, il existe une chaîne reliant x à y.
Définition 4.2.6 (Parcours). Un parcours (en anglais walk) dans un graphe G regroupe les che-
mins, les circuits, les chaînes et les cycles.
Plusieurs types de problèmes sont considérés dans l’approche algorithmique [Lacomme et al.,
2003]. Par la suite, nous présentons brièvement le parcours de graphes et les problèmes de
connexité. Ensuite, nous passons au problème de cheminement dans les graphes. En effet, nous
avons travaillé dans cette thèse sur ce type de problème.
Définition 4.2.7 (Exploration d’un graphe). Une exploration d’un graphe (en anglais graph
search) est une opération fondamentale utilisée dans plusieurs algorithmes de graphes. Cette mé-
thode consiste à explorer un graphe à partir d’un sommet, c’est-à-dire déterminer l’ensemble des
sommets appartenant aux chemins d’origine de ce sommet.
Function 1 : SCAN(x)
foreach (x, y) ∈ U do
if d(x) + w(x, y) < d(y) then
d(y) ← d(x) + w(x, y);
S(y) ← ouvert;
p(y) ← x;
end
end
S(x) ← f ermé;
Il existe deux catégories d’algorithmes de plus court chemin : algorithmes à fixation d’éti-
quettes (en anglais setting algorithms) et ceux à correction d’étiquettes (en anglais correcting al-
gorithms). Les deux types d’algorithmes diffèrent dans la stratégie de sélection des nœuds ouverts
à fermer.
est de sélectionner un nœud avec le poids minimal à chaque itération. Deux ensembles sont conser-
vés, un ensemble permanent représentant les nœuds fermés et un ensemble temporaire désignant
les nœuds non encore sélectionnés comprenant les nœuds ayant les statut ouvert et indéfini. Le
pseudo-code de l’algorithme Dijkstra est présenté par l’algorithme 2.
Algorithme 2 : Dijkstra Algorithm(DA)
initialization : Tp ← ∅, Tt ← X , ∀i ∈ X ; d[i] ← ∞, d[s] ← 0, p[s] ← nil
while Tt 6= ∅ do
d[i] ← minj∈Tt d[j];
Tt ← Tt \ {i};
S
Tp ← Tp {i};
SCAN (i);
end
4.3.2.2 Complexité
L’algorithme de Dijkstra scanne chaque nœud au plus une fois, cela donne une complexité
de O(n2 ) dans le pire des cas [Ahuja et al., 1993] où n est le nombre de nœuds. En effet, l’al-
gorithme effectue l’opération de sélection de nœud n fois. Chaque opération nécessite de scanner
chaque nœud étiqueté temporairement, ce qui conduit à O(n2 ). En outre, l’algorithme effectue
l’opération de mise à jour de distance pour tous les arcs sortants d’un nœud v. Globalement, l’algo-
rithme nécessite O(m) puisque chaque opération nécessite un temps constant, O(1). Finalement,
l’algorithme de Dijkstra résout le problème du plus court chemin en O(n2 ).
Il existe de nombreuses variantes de l’algorithme de Dijkstra dans le but d’améliorer cette
complexité temporelle. Ces variantes essayent différentes structures de données et plusieurs im-
plémentations de l’algorithme [Ahuja et al., 1993]. L’utilisation d’une liste d’adjacence pour re-
présenter le graphe peut réduire la complexité à O((n + m) × log n). L’idée est de parcourir tous
les sommets du graphe en utilisant l’algorithme de BFS avec une complexité de O(n + m) et un
tas comme structure de données pour stocker les nœuds ouverts. Cela permet d’extraire le mini-
mum en O(log n). De plus, utiliser un tas de Fibonacci pour extraire le poids minimum
peut réduire le temps d’exécution à O(m + n × log n) [Fredman and Tarjan, 1987]. La raison est
que ce type de structure nécessite un temps constant, O(1), pour extraire le minimum alors que la
complexité dans un tas est O(log n).
scanner est retiré de la tête de la file d’attente ; un nœud qui devient fermé est ajouté à la queue de
la file d’attente. Le pseudo-code de l’algorithme Bellman est présenté par l’algorithme 3.
Algorithme 3 : Bellman Algorithm(BA)
initialization : ∀i ∈ V ; d[i] ← ∞, d[s] ← 0, p[s] ← nil
while ∃(i, j) | d[j] > d[i] + w(i, j) do
SCAN (i);
end
4.3.3.2 Complexité
L’algorithme effectue au plus n − 1 passages sur des arcs. Puisque chaque passe s’effec-
tue en O(1) pour chaque arc, cela implique que l’algorithme se fait en O(nm). L’algorithme
Bellman-Ford-Moore est qualifié comme un algorithme robuste car il n’y a pas de file d’at-
tente prioritaire.
4.4.2 Algorithme A*
L’algorithme Dijkstra parcourt tous les nœuds ayant une étiquette plus petite que l’éti-
quette du nœud destination, d(t). Cependant, il existe des techniques de recherche-guidée (en
anglais goal-directed) qui visent à guider la recherche vers la destination en évitant les visites des
nœuds qui ne sont pas dans la direction de la destination t. Cela permet d’explorer les nœuds les
plus proches de la destination lors de la recherche du plus court chemin entre deux nœuds. Ces
techniques se basent sur la topologie géométrique du réseau ou les propriétés du graphe.
La recherche A* (en anglais A* search) est la méthode la plus classique de la recherche-
guidée [Bast et al., 2016]. L’algorithme est basé sur une fonction heuristique h(x) qui estime le
poids du chemin le moins coûteux de x à la destination. Ensuite, à chaque étape, il sélectionne
un nœud ouvert x avec le plus petit poids, défini comme f (x) = d(x) + h(x). Dans les réseaux
de transport, la manière classique d’utiliser A* estime h(x) en fonction de la distance euclidienne
entre ces deux nœuds [Delling et al., 2009b]. Il est facile de voir que la recherche A* est équiva-
lente à l’algorithme de Dijkstra quand h(x) est égale à zéro.
L’espace de recherche de cette approche est sous forme d’une ellipse. La figure 4.5 est une
extraction de la revue littérature sur les algorithmes de plus court chemin [Bast et al., 2016].
Elle illustre l’espace de recherche schématisé pour les méthodes : Dijkstra, Dijkstra
bidirectionnel et A*.
distances. Parmi celles-ci, nous présentons en détail l’algorithme Hub Labeling (HL) (ou 2-hop
labeling) que nous avons utilisé dans ce travail de thèse [Cohen et al., 2003, Abraham et al., 2011,
Delling et al., 2014].
L’algorithme HL est un cas particulier de la méthode d’étiquetage (voir la section 4.3.1) qui a
été développée spécifiquement pour résoudre le problème A sur les réseaux routiers, c’est-à-dire
le calcul du plus court chemin entre deux points (voir les variantes des problèmes PCC dans la
section 4.2.2). L’algorithme HL a plusieurs propriétés intéressantes [Delling et al., 2013] :
1. C’est l’algorithme le plus rapide pour ce genre de problème, aussi bien pour les requêtes à
longue distance que pour les requêtes les plus courantes.
2. La requête est plus simple : l’algorithme n’a même pas besoin de la structure de données du
graphe.
3. Le concept d’étiquettes (et de hubs) est intuitif et extrêmement puissant, se prêtant naturel-
lement à la mise en œuvre de requêtes beaucoup plus sophistiquées, telles que la recherche
de points d’intérêt à proximité, l’optimisation des schémas de covoiturage ou la construction
de tableaux de distance.
F IGURE 4.6 – Illustration du marquage des étiquettes des nœuds s (losanges bleu) et t (carrés
rouges) ( Bast et al. [2016]).
4.4.4.2 Complexité
Bien que la distance du plus court chemin l⋆ (s, t) peut être trouvée en temps polynomial O(n)
en évaluant l⋆ (s, t) = min{l⋆ (s, x) + l⋆ (x, t) | x ∈ L(s), x ∈ L(t)} Delling et al. [2014], elle
peut être considérablement plus petite pour certains types de graphes.
Pour les réseaux routiers, Abraham et al. [2011] ont montré que l’on peut obtenir de bons
résultats en définissant l’étiquette du sommet x comme l’espace de recherche avec la technique
de la contraction hiérarchique (voir la section 4.4.4.3). En général, tout ordre de sommet définit
complètement un étiquetage Abraham et al. [2012], et un ordre peut être converti efficacement en
étiquetage correspondant. Pour des étiquettes encore plus petites, on peut choisir les sommets les
plus importants, en fonction du nombre des plus courts chemins qui passent par ce nœud.
D’ailleurs, si les étiquettes sont triées par les identifiants des hubs (ID), une requête consiste
en un balayage linéaire sur deux tableaux, comme dans le tri fusion. Ainsi, il n’est même pas
nécessaire de regarder tous les hubs d’une étiquette. En conséquence, HL dispose des requêtes
connues les plus rapides pour les réseaux routiers, prenant à peu près une microseconde pour le
calcul. En revanche, la méthode souffre du temps de prétraitement qui est extrêmement long par
rapport aux autres méthodes et nécessite un espace de mémoire plus important pour stocker les
grandes étiquettes.
hiérarchiques. La structure des réseaux routiers, qui est basée sur des hiérarchies, a donné nais-
sance à la technique de la Contraction Hiérarchique (en anglais Contraction Hierarchies).
Contraction Hierarchies
La technique de Contraction Hiérarchique (CH) est une approche importante pour exploiter
la hiérarchie du réseau en créant des arcs raccourcis (en anglais shortcuts) pour ignorer les nœuds
« sans importance » [Geisberger et al., 2008]. Le graphe contracté représente ainsi la structure
compacte du graphe de départ. La méthode consiste à exécuter de manière répétée une opération
de contraction de sommet. Pour contracter un sommet x ∈ X , il est (temporairement) supprimé
de G et remplacé par des arcs entre ses voisins u et v, c’est-à-dire des raccourcis, de telle sorte
qu’il existe un plus court chemin qui passe par le nœud x entre ses voisins. L’arc ajouté, qui est le
raccourci, a une distance égale à la distance du plus court chemin entre ces voisins.
La figure 4.7 montre un exemple de contraction d’un nœud x.
v w x
1 2
Au cours du prétraitement, CH classe d’une manière heuristique les sommets par «importance»
et les contracte du moins important au plus important. Ce classement est défini de manière à
minimiser le nombre de raccourcis ajoutés.
C HAPITRE 5
Notions sur les bases de
données
Dans ce chapitre, nous commençons par présenter les systèmes de gestion de bases de
données. Ensuite, nous introduisons les bases de données relationnelles qui sont connues
historiquement, à savoir leurs architectures, syntaxe du langage de requêtage et leurs
limites. Face à ses limites, nous abordons les bases de données NoSQL. Nous présentons
la base de données MongoDB utilisée par Milanamos dans notre contexte industriel et
puis la base alternative proposée, la base orientée graphe Neo4j, pour répondre aux
besoins de Milanamos. Comme exemple fil conducteur, nous avons opté pour le problème
friends of friends présenté dans le domaine aérien par 2-hops.
93
94 C HAPITRE 5 — Notions sur les bases de données
Définition 5.1.2 (Langage de requête). Un langage de requête est un langage déclaratif utilisé pour
récupérer les informations à travers une requête. Ce type de langage nécessite qu’un utilisateur
spécifie quelles données demander sans avoir besoin de spécifier comment obtenir ces données.
Définition 5.1.3 (Jointure). Une opération de jointure est une opération binaire permettant de
fusionner les données à partir de deux ensembles de données.
Définition 5.1.4 (Contrainte d’intégrité). Une contrainte d’intégrité est une règle définie dans la
base de données pour garantir la cohérence d’une donnée ou d’un ensemble de données. Dans une
base de données, on peut définir plusieurs contraintes.
Propriétés ACID
Les propriétés ACID sont les quatre principaux composants permettant de garantir qu’une tran-
saction a été exécutée de façon fiable. Ces propriétés sont très utiles pour réaliser des transactions
ou des applications financières : par exemple, un transfert de fonds d’un compte bancaire à un
autre. En effet, les systèmes bancaires se basent sur des transactions et les propriétés ACID. ACID
signifie Atomicité, Cohérence, Isolation et Durabilité. Ces quatre propriétés sont la base des
applications transactionnelles [Silberschatz et al., 1997].
— Atomicité (en anglais Atomicity) signifie que si une transaction exécute certaines tâches,
celles-ci doivent être exécutées complètement ou pas du tout. Si jamais, une tâche ne peut
pas être faite, alors il faut effacer toute trace de la transaction et remettre les données dans
l’état initial.
— Cohérence (en anglais Consistency) assure que les données restent cohérentes avant et après
la transaction. Cela veut dire que n’importe quelle transaction transformera le système d’un
état valide à un autre état valide. Un système à état valide est un système respectant les
contraintes d’intégrité.
— Isolation (en anglais Isolation) veut dire que l’exécution d’une transaction se fait indépen-
damment des autres transactions, c’est comme si elle était seule sur le système. Cette pro-
priété garantit que l’exécution simultanée de plusieurs transactions produit le même état que
leur exécution en série. Ainsi, les opérations d’écritures et lectures des transactions réussies
ne seront pas affectées par celles d’autres transactions quels que soient leurs résultats.
— Durabilité (en anglais Durability) assure la sauvegarde des données. Il est possible d’annuler
une transaction ou de rétablir l’état du système après une défaillance. Ceci est réalisé grâce
au journal des transactions. En effet, chaque SGBD possède un journal des transactions qui
enregistre toutes les transactions et les modifications apportées par chacune d’entre elles.
Opérations CRUD
Dans un SGBD, la manipulation des données consiste à effectuer les opérations CRUD, qui
signifie Create, Read, Update et Delete. Les opérations CRUD sont implémentées par quatre
procédures stockées [Gardarin, 2003] :
— Create crée des nouvelles données (par exemple, créer de nouveaux aéroports) ;
— Read lit les données pour les afficher d’une façon simple ;
— Update met à jour l’ensemble des champs modifiés ;
— Delete supprime les informations demandées (par exemple, la suppression d’un vol).
5.1 – Système de gestion de bases de données 97
Indexation
La technique d’indexation est une technique utilisée dans les systèmes des fichiers et des bases
de données. Cette technique a pour but d’améliorer les performances de recherche des informations
qui se fait par un index. Un index est une structure de données qui reprend la liste des valeurs
auxquelles il se rapporte : c’est une copie "intelligente" des données de la table [Kroenke and
Auer, 2013].
Il existe différents types d’index, les plus fréquents étant les arbres B (en anglais B-Tree) [Gar-
darin, 2003, Silberschatz et al., 1997]. Un arbre B est un arbre équilibré, dont les données sont
triées. C’est une généralisation d’un arbre binaire de recherche où les nœuds parents peuvent pos-
séder plus de deux nœuds enfants. Ce type de structure permet de stocker les données sous une
forme triée ce qui permet d’exécuter des opérations de recherche et d’insertion en temps logarith-
mique [Comer, 1979].
La technique d’indexation est très utile pour certaines requêtes de filtre ou tri sur le champ
ayant l’index. Néanmoins, elle a des inconvénients notamment quand il s’agit de mettre à jour les
données. En fait, il faut mettre à jour les données ainsi que les index. Un autre inconvénient est la
volumétrie des index car cela ajoute du volume à la base de données.
ESB aéroport
temps
75
GLA IST 245
0
21
17
85
0
100 375
CDG DXB
380
LHR 70 150 NCE
485
10
LIS BKK
0
660
31
0
105
170
80
36
0
NBO FNC DOH ICN
CMN
465 75 KWI
425
270
ABJ
F IGURE 5.1 – Réseau aérien de vols. Le graphe contient 16 nœuds (aéroports) et 21 arcs (vols) .
Exemple 5.2.1 (Structure de SGBDR). L’exemple suivant illustre deux tables, dont la table (a) est
celle qui stocke les informations des aéroports du graphe 5.1 : code et nom. Supposons que nous
5.2 – Base de données relationnelle 99
souhaitions afficher uniquement le code aux utilisateurs. Alors, le niveau physique du SGBDR
décrit le stockage du schéma. Le niveau conceptuel contient le nom des champs et le niveau vue
décrit le champ code comme une vue.
Le SGBDR doit limiter les redondances. En effet, stocker des informations redondantes pro-
voque une perte en espace mémoire mais également un risque d’erreurs lors de la mise à jour des
données. Ces données doivent être cohérentes entre elles. Quand une donnée fait référence à une
autre donnée dans la base de données, alors celle-ci doit être présente dans le système : les don-
nées sont dépendantes dans un tel système. Effectivement, le SGBDR contrôle que les contraintes
d’intégrité sont respectées après chaque mise à jour. Cette intégrité logique est traduite par des
contraintes d’intégrité. Ainsi, il existe deux types de contraintes :
— l’intégrité d’entité porte sur une colonne unique ;
— l’intégrité référentielle définit une table lorsque la contrainte porte sur une ou plusieurs
colonnes.
Exemple 5.2.2 (Contraintes d’intégrité). Considérons l’exemple 5.2.1. Si on spécifie que la va-
leur du champ code doit être unique et non nulle, alors c’est une contrainte d’intégrité d’entité.
Supposons qu’on ait une deuxième table sur les vols qui contient les champs suivants : num_vol,
origine, destination et durée. Si on spécifie que chaque origine dans la table des vols
doit être liée à un code dans la table des aéroports (voir la table 5.1a) alors ce type de contrainte
s’inscrit dans la catégorie des contraintes référentielles. Ce type de contrainte est plus complexe,
puisqu’il implique plusieurs tables (voir la figure 5.2).
— Foreign key (Clé étrangère) permet de définir les colonnes d’une table garantissant la validité
d’une autre table.
— Not Null assure que l’absence de valeur n’est pas permise.
— Check contrôle la validité de la valeur des propriétés d’une ou plusieurs colonnes spécifiées
à un domaine (par exemple, l’âge d’un client doit être toujours > 18).
Dans la requête du listing 5.1, les colonnes du résultat sont spécifiées dans la clause SELECT.
La clause FROM est une clause obligatoire qui désigne les tables d’extraction. Enfin, WHERE est
une clause optionnelle pour filtrer le résultat renvoyé.
Pour insérer des nouvelles données dans un SGBDR, on utilise la clause INSERT. La jointure
se traduit par la clause joins. La jointure permet de rechercher les correspondances en combinant
deux tables et renvoyer le résultat en une seule table.
Par la suite, nous allons illustrer ces opérations sur l’exemple de 2-hops présenté dans la sec-
tion 5.1.4.
La clé primaire de la table airports porte sur la colonne code de type varchar(50)
(ligne 2 du listing 5.2). La création de la table des vols (flights) se fait de la même manière
(voir la figure 5.2).
Airports AS A
code (PK)
name
1
⋆
Flights AS F
id (PK)
origin (FK)
destination (FK)
duration
cost
Exemple 5.2.4 (Insertion en SQL). Pour insérer les données, nous utilisons la commande
INSERT. Le SGBDR vérifie lors de toute opération d’insertion que l’utilisateur a bien fourni les
valeurs des deux champs : code et name. Sinon, l’opération est rejetée par le système.
1 INSERT INTO a i r p o r t s
2 VALUES ( ’NCE ’ , ’ N i c e C ô t e d ’ ’ Azur A i r p o r t ’ ) ;
Listing 5.3 – requête pour insérer des données en SQL dans la table airports
En SQL, il est possible d’importer des données stockées dans un fichier CSV. Pour cela, nous
utilisons la commande BULK INSERT. Cela permet d’insérer en masse des données dans la table.
La commande possède des paramètres pour spécifier le séparateur de lignes et de colonnes
(lignes 6 et 7 du listing 5.4). Le paramètre FIRSTROW permet d’ignorer l’en-tête du fichier.
1 BULK INSERT a i r p o r t s
2 FROM ’ a i r p o r t s . c s v ’
3 WITH
4 (
5 FIRSTROW = 2 ,
102 C HAPITRE 5 — Notions sur les bases de données
6 FIELDTERMINATOR= ’ , ’ ,
7 ROWTERMINATOR = ’ \ n ’
8 );
Listing 5.4 – requête pour importer des données à partir d’un fichier CSV en SQL
Après l’exécution de la requête du listing 5.4, le système renvoie une erreur liée à la violation
de la contrainte qui porte sur le champ code. En effet, nous avons déjà inséré ce champ avec la
requête du listing 5.3. Comme cet enregistrement correspond à la deuxième ligne du fichier, nous
changeons le paramètre FIRSTROW à 3 pour l’ignorer. Pour les vols, on procède de la même façon
pour insérer les données.
Exemple 5.2.5 (Affichage en SQL). Supposons que nous souhaitions afficher la table des aéro-
ports. Cette opération correspond à la procédure READ des opérations CRUD. Le tableau 5.1a
présente un extrait de cette table.
1 SELECT *
2 FROM a i r p o r t s ;
Listing 5.5 – requête pour afficher la table airports en SQL
Exemple 5.2.6 (Liste des destinations en SQL). Supposons que nous souhaitions renvoyer les
destinations des vols partant de l’aéroport NCE, alors la requête exprimée est dans le listing 5.6.
1 SELECT d e s t i n a t i o n
2 FROM f l i g h t s
3 WHERE o r i g i n = ’NCE ’ ;
Listing 5.6 – requête pour récupérer la liste des destinations en SQL
destination
BKK
DXB
DOH
CMN
Exemple 5.2.7 (Destinations en moins de 2 heures en SQL). Pour trouver les destinations qu’on
peut rejoindre depuis l’aéroport de Lisbonne (LIS) en moins de deux heures, nous employons un
filtre avec la clause WHERE (voir la requête du listing 5.7).
1 SELECT d e s t i n a t i o n
2 FROM f l i g h t s
3 WHERE o r i g i n = ’ LIS ’
4 AND d u r a t i o n <=120;
Listing 5.7 – requête pour récupérer les destinations en moins de 2h en SQL
5.2 – Base de données relationnelle 103
destination
FNC
CMN
Exemple 5.2.8 (Destination la moins chère en SQL). Pour chercher la destination la moins chère,
nous utilisons la clause ORDER BY pour trier la table des vols partant de l’aéroport dont le code
est NCE. C’est un tri ascendant sur les coûts (ligne 4 du listing 5.8). La destination la moins chère
correspond au premier résultat renvoyé par l’ajout du TOP 1 (voir la requête du listing 5.8). Le
résultat de cette requête est présenté dans la table 5.5.
1 SELECT TOP 1 d e s t i n a t i o n
2 FROM f l i g h t s
3 WHERE o r i g i n = ’NCE ’
4 ORDER BY c o s t ASC ;
Listing 5.8 – requête pour trouver la destination la moins chère en SQL
destination
CMN
Exemple 5.2.9 (Récupérer les noms en SQL). Un exemple de jointure est illustré par la récupéra-
tion des noms des aéroports stockés dans la table airports. Cette opération intervient quand on
a besoin de chercher les données dans d’autres tables. Ainsi, nous utilisons la commande INNER
JOIN pour chercher les noms des aéroports dont le code figure dans la table flights (voir la
requête du listing 5.9 et son résultat dans la table 5.6).
1 SELECT DISTINCT TOP ( 2 ) a . name
2 FROM f l i g h t s AS F
3 INNER JOIN a i r p o r t s AS A
4 ON F . o r i g i n =A . c o d e
5 OR F . d e s t i n a t i o n =A . c o d e ;
Listing 5.9 – requête pour récupérer les noms en SQL
name
Ankara Esenboga Airport
Chales De Gaulle Airport
flights [Ben-Gan et al., 2015]. En revanche, l’opération la plus coûteuse est la jointure. Sa
complexité dépend fortement de la taille de la table et de la présence d’un index sur la colonne
concernée.
Généralement, il existe trois types de jointures [Taniar et al., 2008] :
1. Jointure par boucle imbriquée (en anglais Nested loop join) : énumérer toutes les correspon-
dances possibles.
2. Jointure par hachage (en anglais hash-based join) : construire une table de hachage sur une
des tables.
3. Jointure par tri-fusion (en anglais Sort-Merge join).
Supposons que nous avions deux tables M et N de taille m (respectivement n). Alors, on a
une complexité quadratique pour le premier cas, O(mn). Pour le deuxième cas, une complexité
linéaire, O(m + n). Cependant, la complexité de la jointure par tri-fusion dépend également de la
présence d’un index sur la colonne concernée :
— Le pire des cas, c’est dans l’absence des index sur les colonnes de jointure : O(m × log m +
n × log n).
— Dans le cas où il y un index sur la colonne de la table M , alors on passe d’une complexité
linéarithmique à une complexité linéaire, c’est-à-dire O(m + n × log n).
— Si les deux colonnes sont indexées alors : O(m + n).
Par défaut, la jointure en SGBDR est une jointure par tri-fusion. Toutefois, le système peut
amener à changer le type de jointure pour optimiser les requêtes. Ce choix se fait selon les cas
suivants :
1. Jointure par boucle imbriquée : si une table tient en mémoire ou au moins un index est
utilisable.
2. Jointure par hachage : si une des deux tables beaucoup plus petite que l’autre ou elle tient
en mémoire.
La requête fait deux opérations de jointure pour avoir le résultat final dans la table 5.7.
destination
ABJ
ICN
KWI
NBO
La requête en SQL nous renvoie uniquement le code des aéroports recherchés. En fait, pour
renvoyer le nom également, il faudrait faire une troisième jointure pour récupérer les noms de la
table airports.
— Les propriétés ACID : certaines bases de données NoSQL ont abandonné ce type de proprié-
tés, En l’occurrence, elles proposent de se baser sur les propriétés BASE.
Base de données
F IGURE 5.3 – Schéma d’une base de données MongoDB. Les documents d’une même collection
peuvent avoir des champs différents.
Ainsi, la base de données est constituée de plusieurs collections. Une collection regroupe plu-
sieurs documents qui n’ont pas forcément les mêmes métadonnées.
Pour la représentation des documents en MongoDB, le format BSON (JSON binaire, JavaS-
cript Object Notation) est utilisé. Ce format se base sur un ensemble de paires champ:valeur.
Comme tout système de base de données NoSQL, MongoDB stocke des données structurées et
non structurées. Ainsi, tout type de données peut être stocké dans ces documents et même le type
objet est possible. Un document possède un identifiant unique. La taille maximale des documents
ne doit pas dépasser 16 Mo.
MongoDB est un SGBD sans jointure ni transaction. Cela permet d’avoir un résultat simple
et plus rapide au prix d’une possible redondance des données. En effet, il est possible de sto-
cker toutes les informations recueillies par une requête dans un document. Comme tout SGBD,
MongoDB utilise aussi l’indexation des champs pour pouvoir facilement trouver le résultat cher-
ché.
108 C HAPITRE 5 — Notions sur les bases de données
Pour stocker des documents de plus de 16 Mo, notamment les images, les vidéos, etc,
MongoDB propose l’API GridFS [Dasadia and Nayak, 2016]. GridFS est un système de fi-
chier virtuel pour le stockage des fichiers en MongoDB. Il est capable de diviser automatiquement
les données en segments et stocke chaque segment en tant que document séparé. GridFS utilise
deux collections pour stocker ce genre de fichier. Une collection stocke les fragments de fichier et
l’autre stocke les métadonnées de fichier [MongoDB, 2017, Chodorow, 2013].
Aujourd’hui, il existe un nombre important d’application Web qui permettent aux utilisateurs
de télécharger des fichiers. En SGBDR, le problème ne se posent plus, il est souvent plus efficace
de stocker séparément les fichiers sur un système de fichiers et de référencer seulement les liens
dans la base de données. Les SGBDR comportent souvent un type de données nommé DATALINK
ou FILESTREAM [Bruchez, 2015]. Toutefois, utiliser cette technique en MongoDB créera proba-
blement un certain nombre de problèmes :
1. Comment répliquer les fichiers sur tous les serveurs nécessaires ?
2. Comment supprimer toutes les copies lorsque le fichier est supprimé ?
3. Comment sauvegarder les fichiers pour la sécurité et la récupération après une panne ?
GridFS résout ce problème pour l’utilisateur en stockant les fichiers avec la base de données.
Ainsi, la sauvegarde de votre base de données est utilisée pour sauvegarder les fichiers. De plus,
en raison de la réplication en MongoDB, une copie des fichiers est stockée dans chaque serveur.
La suppression du fichier est aussi simple que la suppression d’un objet dans la base de données.
La méthode find consiste à chercher les informations. C’est l’équivalent de select en SQL
(voir la requête du listing 5.12). Dans cette méthode, il faut préciser le nom du champ cherché.
ProjectionDocument est ignoré comme c’est un composant facultatif de la requête.
1 NomBase.NomCollection.find({champ:valeur})
Exemple 5.4.2 (Insertion en MongoDB). Pour insérer les données, nous utilisons la méthode
insert. Un document sera créé contenant les champs : Code et Name.
1 db.airports.insert({"Code":"NCE", "Name": "Aéroport Nice Côte d’Azur"})
1 mongoimport −c a i r p o r t s −d 2HOPS −− f i l e t h e s e / bd / d a t a / a i r p o r t s .
c s v −− t y p e c s v −− h e a d e r l i n e
Listing 5.15 – commande pour importer des données à partir d’un fichier CSV en MongoDB
Le système crée une nouvelle base de données si aucune base de données ne correspond au
nom passé dans le paramètre -d.
Exemple 5.4.3 (Affichage en MongoDB). La méthode find permet d’afficher une collection.
1 db.airports.find({})
Exemple 5.4.5 (Destinations en moins de 2 heures en MongoDB). Pour trouver les destinations
qu’on peut rejoindre depuis l’aéroport de Lisbonne (LIS) en moins de deux heures, nous em-
ployons l’opérateur $lt pour spécifier que la durée est moins de 120 minutes. Pour renvoyer
uniquement la destination, nous utilisons une projection (voir le listing 5.19).
1 db.flights.find({"Origin":"LIS","Duration":{$lt:120}},{"_id":0,"Destination
":1})
Exemple 5.4.6 (Destination la moins chère en MongoDB). Pour chercher la destination la moins
chère, nous utilisons la méthode sort pour trier les vols partant de l’aéroport dont le code est
NCE. C’est un tri ascendant sur les coûts. La destination la moins chère correspond au premier
résultat renvoyé par l’ajout de la méthode limit() (voir la requête du listing 5.21).
1 db.flights.find({"Origin":"NCE"},{’_id’:0,’Destination’:1}).sort({Cost:1}).
limit(1)
Exemple 5.4.7 (Récupérer les noms en MongoDB). La récupération des noms nécessite l’utilisa-
tion des deux collections airports et flights. Comme il n’y a pas de jointure en MongoDB,
nous avons besoin de passer par un script en Python. Tout d’abord, la première requête du lis-
ting 5.23 récupère les codes de tous les aéroports de la collection flights (voir le résultat dans le
listing 5.25). Ensuite, la deuxième requête du listing 5.24 cherche les noms de ces aéroports dans
la collection airports. Ce genre d’opération nécessite souvent un script en Python pour mani-
puler les deux requêtes (passer la liste des aéroports retournée par la requête 5.23) en paramètre à
la requête du listing 5.24
1 db.flights.aggregate(
2 [
3 {
4 ’$group’: {
112 C HAPITRE 5 — Notions sur les bases de données
5 ’_id’: null,
6 origins: {’$addToSet’: ’$Origin’},
7 destinations: {’$addToSet’: ’$Destination’}
8 }
9 },
10 {
11 ’$project’: {
12 ’_id’: 0,
13 airports: {’$setUnion’: [’$origins’, ’$destinations’]}
14 }
15 }
16 ])
Listing 5.23 – requête pour récupérer les codes des aéroports de la collection flights en
MongoDB
1 db.airports.find({ "Code": { $in: airportsCodes}} ,{"_id":0,"Name":1} ).
limit(2)
1 /* 1 */
2 {
3 "Name" : "Charles De Gaulle Airport"
4 }
5
6 /* 2 */
7 {
8 "Name" : "Ankara Esenboga Airport"
9 }
Listing 5.25 – résultat de la requête du listing 5.24
Méthode 1.
Pour résoudre le problème de 2-hops, nous avons besoin de faire deux requêtes :
1. la liste des destinations de l’aéroport en question ;
2. la liste des destinations des aéroports récupérés de la première requête.
5.4 – Base de données orientée document 113
Pour réaliser cette suite de requêtes, il faut utiliser un script en Python. Nous commençons par
construire la liste des destinations de l’aéroport en question (ligne 2 à 9 du programme B.1), en
utilisant la méthode aggregate.
Ensuite, il faut répéter la même requête pour les destinations retournées par la première requête
du listing (ligne 2 à 9 du programme B.1). Cette requête nous retourne la liste des destinations
de l’aéroport NCE. Puis, il faut exclure les aéroports qui figurent à la fois dans le résultat de la
première requête et qui sont connectés à l’aéroport de NCE (ligne 11 à 18 du programme B.1).
Le programme (code en annexe B) nous retourne le résultat suivant (voir le résultat du lis-
ting 5.26).
1 liste des destinations: [’ABJ’, ’NBO’, ’KWI’, ’ICN’]
Listing 5.26 – résultat de la requête du listing B.1
Comme en SQL, pour avoir plus d’informations sur ces aéroports notamment le nom, il faudra
faire une troisième requête sur la collection airport.
Méthode 2.
Si nous nous arrêtons à la question de trouver la liste des destinations à partir d’un aéroport avec
exactement un seul vol, alors, la manière la plus simple est de créer une seule collection qui
contient des documents incorporés où chaque document contient l’id de l’aéroport, son code et
la liste des code de ces aéroports destinations.
Par défaut, MongoDB nous propose de générer lui-même des identifiants (_id) grâce aux
ObjectId, la classe que MongoDB utilise pour générer les identifiants. En pratique, on utilise le
code qu’on a défini comme index, comme identifiant (voir le listing 5.13).
On trouvera dans le listing 5.27 un exemple de document :
1 /* 1 */
2 {
3 _id : ObjectId("4e77bb3b8a3e000000004f7a"),
4 code : "NCE",
5 destinations : ["CMN", "DXB", "BKK", "DOH"]
6 }
Listing 5.27 – deuxième implémentation en MongoDB
Pour retrouver la liste des aéroports destinations de l’aéroport en question (l’aéroport NCE), on
utilise la requête du listing 5.17 appelée sur la collection destinations. Cela permet de trouver
rapidement la liste des destinations d’un aéroport au lieu d’appliquer une agrégation à chaque
aéroport. Ensuite, pour répondre à la question du problème 2-hops, il faudra faire une deuxième
requête qui prend en paramètre la liste des destinations renvoyée par la requête du listing 5.17 et
chercher leurs listes de destinations en excluant le cas des aéroports qui sont déjà en liaison avec
l’aéroport NCE. C’est bien la question que nous cherchons à résoudre.
La requête du listing 5.28 commence par selectionner les aéroports dont le code figure dans
la liste des destinations en entrée (ligne 2). Ensuite, on utilise la méthode unwind pour créer
des documents pour chaque élément de la liste des destinations, cela nous permettra de chercher
pour chaque élément qui le code de destination, leurs aéroports destinations. Finalement, pour la
récupération des destinations finales joignables depuis NCE avec deux sauts, il faudra exclure les
114 C HAPITRE 5 — Notions sur les bases de données
aéroports qui figure dans la liste des destinations de l’aéroport de NCE y compris ce dernier. Ceci
nous permettra d’éviter les cycles dans le graphe.
1 db.destinations.aggregate([
2 {$match:{"code":{’$in’:["CMN","DXB","BKK","DOH"]}}},
3 {$unwind:"$destinations"},
4 {$match:{"destinations":{’$nin’:["NCE","CMN","DXB","BKK","DOH"]}}},
5 {$group:{
6 ’_id’:null,
7 mesDest:{$addToSet:"$destinations"}}}
8 ])
Listing 5.28 – requête pour récupérer les liste des destinations d’une liste de destinations en
MongoDB
Le problème de ce modèle est qu’il y a beaucoup de redondances comme on l’avait dit au
début. En effet, pour avoir un résultat plus rapidement, on passe à la redondance des données. Ce
qui n’est pas avantageux notamment pour répondre à ce genre de question.
Conclusion. Jusqu’à présent, la conclusion que nous pouvons tirer de cet exemple est que la
modélisation du problème 2-hops est plus compliqué quand il s’agit des bases de données rela-
tionnelles ou orientées document comme la base de données MongoDB.
Relationnel MongoDB
Base de données Base de données
Table Collection
Ligne Document
Colonne Champ
Index Index
Curseur Curseur
Clé primaire _id
Clé secondaire n’importe quel champ
Schéma -
Select Find
Update Update
Insert Insert
Évolution de MongoDB.
— La version 3.2 de MongoDB offre la possibilité de faire une "quasi jointure". Cette dernière
consiste à compléter les données d’un document avec les données d’une collection « de
référence » (la méthode $lookup).
— Depuis la version 3.4, il y a un moyen de parcourir un arbre directement dans la requête
avec la méthode $graphLookup.
— Il existe depuis la version 4.0 de 2018 (et améliorée en 4.2) une notion de transaction.
— Il existe aussi le moyen de décrire comment valider les documents stockées (depuis 3.2).
bases de données orientées graphe est un processus relativement simple par rapport au schéma
entité relation mais il reste à concevoir le graphe, une tâche plus compliquée en raison du haut
niveau de connectivité fourni par les graphes, ce qui permet d’avoir un modèle proche de la réa-
lité [Braimniotis, 2017]. Contrairement à la modélisation de données relationnelles qui requiert
l’utilisation de plusieurs clés primaires et étrangères pour connecter des entités, les bases de don-
nées orientées graphe sont très expressives et réduisent le déséquilibre entre l’analyse et la mise
en œuvre, le graphe étant conçu selon ce qu’on veut analyser. On trouve ce problème dans les
implémentations de bases de données relationnelles qui sont conçues comme un outil de stockage
plus que comme une représentation des données [Robinson et al., 2015].
— Nœuds représentent une entité d’information. Les nœuds sont similaires aux documents en
NoSQL ;
— Relations connectent les nœuds. Une relation a un nom unique, un nœud de départ, un nœud
terminal et une direction. Les relations sont les arcs en théorie des graphes ;
— Propriétés sont représentées sous forme de paires clés-valeurs ;
— Étiquettes permettent de spécifier le type de nœuds puisqu’un nœud peut jouer plusieurs
rôles dans un graphe. C’est une composante facultative mais en utilisant ce concept, nous
arrivons facilement à regrouper les nœuds dans des ensembles et cela permet d’exécuter
efficacement des requêtes. En Neo4j, un nœud peut avoir de zéro à plusieurs étiquettes.
Graphe
t con
tien tien
con t
organise
Noeud poss
Relation
éde
ède poss
Propriétés
Les données sont stockées dans des propriétés sous forme de paires clés-valeurs. Les propriétés
peuvent être ajoutées aux nœuds et relations. Chaque nœud ou chaque relation est porteur de ses
propres propriétés. En Neo4j, les propriétés peuvent être définies d’une façon dynamique dans le
sens où leurs modifications ne dépendent pas du modèle : c’est-à-dire, on peut créer des nouvelles
propriétés sans modifier le modèle actuel du graphe. De la même façon, les relations peuvent
être modifiées dynamiquement. Autrement dit, les entités du modèle peuvent changer et évoluer
complètement ou partiellement.
Sur la figure 5.5, nous pouvons voir un exemple de l’interface Neo4j s’exécutant en mode
serveur. Le graphe est affiché sur le navigateur web où la barre à gauche contient les informations
sur la base de données, les étiquettes de nœuds, les types de relations et les clés des propriétés.
Au centre, nous avons un exemple de graphe avec plusieurs nœuds (des aéroports), les relations
(arcs). Comme la visualisation est interactive, il est possible de voir les liens d’un nœud du graphe
résultant. Au-dessus, nous avons la section du texte pour écrire la requête.
La structure du langage Cypher est inspirée du SQL utilisé avec le modèle relationnel. Le
langage Cypher est structuré à partir de différentes clauses. Deux clauses principales sont utilisées :
MATCH et WHERE :
— MATCH est utilisée pour établir la structure du motif cherché.
— WHERE permet de filtrer les résultats de la sélection faite par MATCH.
Dans une requête Cypher, les nœuds sont représentés par une paire de parenthèses. Il y a
deux types de relations : des relations orientées et non orientées. Les relations non orientées sont
représentées par une paire de tirets (--). Quand c’est un graphe orienté, on ajoute une flèche à la
représentation précédente pour spécifier l’orientation (<--,-->). Les propriétés et les étiquettes
(en anglais label) sont incluses directement dans les parenthèses quand il s’agit des nœuds. Tandis
que dans le cas des relations, on utilise une paire de crochets (e.g. -[identifiant : nom de la relation
{nom de la propriété : valeur de la propriété}]-). L’identifiant est facultatif.
Exemple 5.5.1 (Syntaxe du langage Cypher). Prenons l’exemple du listing 5.29 qui illustre d’une
façon plus détaillée la syntaxe du langage Cypher. Supposons qu’on ait deux nœuds représentant
l’aéroport de Nice et de Dubai.
Dans l’exemple du listing 5.29, la variable ’nice’ est utilisée pour identifier le label ’Airport’.
Ce dernier a deux propriétés code et name, qui correspondent respectivement aux valeurs ’NCE’
et ’Nice Airport’.
1 (nice:Airport{code:’NCE’ name:’Nice Airport’})
2 (dubai:Airport{code:’DXB’ name:’Dubai Airport’})
Listing 5.29 – exemple de nœuds
Nous avons également un seul type de relations : Flight qui connecte les nœuds de cette
façon -[:Flight]->. En combinant les éléments décrits précédemment, nous obtenons les
motifs du listing 5.30.
1 (nice:Airport{code:’NCE’ name:’Nice Airport’})-[:FLIGHT]-> (
dubai:Airport{code:’DXB’ name:’Dubai Airport’})
Listing 5.30 – exemple de relations
La figure 5.8 illustre le graphe des motifs décrits avant, les motifs qui représentent le vol entre
Nice & Dubai d’une durée de 375 min et d’un coût 1000$ :
En Cypher, il y a différentes clauses à utiliser quand il s’agit de la création ou bien de la
recherche dans le graphe. Pour créer les entités du graphe, nous utilisons la clause CREATE. Une
requête en Cypher se termine toujours par la clause RETURN pour renvoyer le résultat.
120 C HAPITRE 5 — Notions sur les bases de données
Exemple 5.5.2 (Requête Cypher). L’exemple suivant crée les motifs décrits ci-dessus et renvoie
les éléments créés avec la requête du listing 5.31.
1 MATCH (nice:Airport{code:’NCE’,name:’Nice Airport’})-[r1:FLIGHT{duration: 375,
cost:1000}]->(dubai:Airport{code:’DXB’, name:’Dubai Airport’})
2 RETURN nice,r1,dubai
Listing 5.34 – requête pour créer les nœuds à partir d’un fichier csv en Neo4j
De même pour insérer les vols représentés par des arcs dans le graphe de la figure 5.1, nous
créons des relations en Neo4j contenant les informations de ces vols (voir la requête du lis-
ting 5.35). Pour cela, on commence par chercher, pour chaque vol du fichier flights dans le
graphe, les nœuds de type Airport dont le code correspond au code origine et destination de ce
vol (ligne 3 de la requête du listing 5.35). La clause MATCH dans la requête du listing 5.35 permet
d’identifier cette paire d’aéroports. Ensuite, on crée la relation de type FLIGHT entre cette paire
de nœuds avec les propriétés qui contiennent les informations du vol en termes de durée et coût
(ligne 4 de la requête du listing 5.35).
1 LOAD CSV WITH HEADERS FROM "file:///flights.csv"
2 AS line FIELDTERMINATOR ’,’
3 MATCH (a:Airport{code:line.Origin}),(b:Airport{code:line.Destination})
4 CREATE r=(a)-[:FLIGHT{duration:toInt(line.Duration),cost:toInt(line.Cost)}]->(b
)
5 RETURN r as relation
Listing 5.35 – requête pour créer une relation en Neo4j à partir d’un fichier csv
122 C HAPITRE 5 — Notions sur les bases de données
Exemple 5.5.5 (Affichage en Cypher). Une fois que les données ont été créées et le graphe formé,
la prochaine étape concerne le requêtage de ces données pour les exploiter. Nous utilisons donc la
clause MATCH décrivant ce que nous cherchons. Le résultat est renvoyé sous forme d’une ligne
qui correspond à chaque motif trouvé.
1 MATCH (a:Airport)
2 RETURN a AS airport
1 MATCH p=(a:Airport{code:"NCE"})-[:FLIGHT]->(m)
2 RETURN p
Exemple 5.5.7 (Destinations en moins de 2 heures en Cypher). Nous employons un filtre avec la
clause WHERE (voir le listing 5.39).
1 MATCH (a:Airport{code:"LIS"})-[r:FLIGHT]->(m)
2 WHERE r.duration<120
3 RETURN m.code as destination
Exemple 5.5.9 (Récupérer les noms en Cypher). Contrairement à SQL et MongoDB, la jointure se
fait d’une manière plus simple. En effet, les données sont stockées sous forme d’un graphe, donc
la jointure est déjà fournie dans ce type de structure de données.
124 C HAPITRE 5 — Notions sur les bases de données
1 MATCH (o:Airport)-[r:FLIGHT]->(d:Airport)
2 WITH collect(o.name)+collect(d.name) AS listAirports
3 UNWIND listAirports AS airportName
4 RETURN DISTINCT airportName
5 LIMIT 2
(NCE)-FLIGHT-(destinations)
Le résultat obtenu sera : DXB, DOH, BKK, et CMN.
Très souvent dans les réseaux aériens, nous sommes intéressés par la recherche des itinéraires
avec un nombre de sauts prédéfini. Prenons l’exemple ci-dessus, et supposons que nous souhai-
tions la liste des destinations à atteindre depuis un aéroport avec une seule escale. La question est
exprimée sous cette forme : quels sont les aéroports voisins de mes aéroports voisins ?
(NCE)-FLIGHT-(mesDest)-FLIGHT-(dest_de_mes_Dest)
Bien évidemment, il faut exclure les aéroports dont il existe déjà un vol venant de l’aéroport
NCE. C’est le cas de l’aéroport DOH.
Pour récupérer les aéroports atteignables depuis NCE, la requête en Cypher sera (voir le lis-
ting 5.42).
1 MATCH p=(o:Airport)-[:FLIGHT]->(d:Airport)-[:FLIGHT]->(dd:Airport)
2 WHERE NOT (o)-[:FLIGHT]->(dd) AND o.code="NCE"
3 RETURN distinct dd
Comme l’exemple du problème 2-hops, l’exécution d’une requête en Neo4j commence par
une recherche par index pour trouver le point de départ du parcours. Ensuite, les relations sont
traversées. L’algorithme de DFS est utilisé pour ce genre de parcours. Comme il existe un nombre
exponentiel de chemins dans le graphe, un grand volume de données sera parcouru ce qui rend
Neo4j plus performant que les SGBDR. Cela montre bien que, les bases de données relationnelles
sont moins adéquates pour faire des requêtes à travers les relations. Ce parcours de graphe est tout
simplement traduit en SGBDR par la réalisation d’un ensemble de requêtes sur différentes tables,
suivant les clés étrangères et les autres index. Ce qui devient plus coûteux en terme de temps.
Nœuds et relations. La structure de la base de données graphe est décrite comme suit [Czere-
picki, 2016] : les nœuds (les éléments A, B et C sur la Figure 5.13 de la page 127), les relations
(les éléments X, Y et Z sur la Figure 5.13 de la page 127) et les propriétés sont stockées dans
des fichiers de données non ordonnés séparés. Ce type de fichiers stocke les enregistrements dans
l’ordre dans lequel ils sont insérés. Ainsi, l’adresse d’un objet est définie comme un produit de
la taille de l’enregistrement et un nombre identifiant qui est un nombre entier. Par conséquent, la
complexité de l’opération de la recherche par un identifiant (ID) est en O(1), la taille de l’enre-
gistrement étant fixe. Cela veut dire que cette complexité ne dépend pas de la taille de la base de
données. Une complexité similaire est obtenue pour l’opération d’ajout. Cette dernière consiste à
créer un nouveau champ à la fin du fichier de la base de données graphe. Sur le disque, les don-
nées sont stockées sous forme d’une liste chaînée. Les nœuds pointent vers le premier champ du
nœud de la relation en question (voir la figure 5.13). Chaque relation pointe vers ses champs : le
premier et second nœud mais également le champ de la relation précédente (resp. prochaine) pour
le premier (resp. second) nœud. Donc, traverser une relation coûte O(1) quelle que soit la taille du
graphe, qu’il soit en mémoire ou sur disque [Robinson et al., 2015].
Propriétés. Les propriétés d’un objet (un nœud ou une relation) sont obtenues à partir de ces
objets [Raj, 2015]. Par exemple, sur la Figure 5.13, les propriétés duration et cost sont les pro-
priétés de l’objet A et sont accessibles à partir de cet objet. Ce dernier contient une structure de
données qui pointe vers l’objet de la première propriété. Cet objet contient le type de la propriété
et sa valeur mais également un pointeur vers la prochaine propriété. Dans le cas où c’est la der-
nière propriété alors le pointeur sera nul. Sinon, la valeur sera l’adresse du fichier dans lequel la
prochaine propriété est stockée car Neo4j stocke les propriétés comme un type de chaîne de ca-
ractères (String) quel que soit leur type (entier, booléen, etc.) [Xia et al., 2014]. Ainsi, l’ensemble
des propriétés constitue une structure de données du type liste unidirectionnelle : on la parcourt
dans un seul sens. Par conséquent, l’opération de la recherche d’une propriété par numéro consiste
à chercher tout d’abord l’objet associé au nœud. Ensuite, il faut parcourir la liste des propriétés de
ce nœud. La complexité de cette opération dépend du nombre de propriétés du nœud [Robinson
5.5 – Base de données orientée graphe 127
X
B
Duration = 360
A Cost = 950
A Z
rel1 Y C
prop1
Graphe à modéliser
Duration
type Integer
valeur 360
propPro
nœ2 X Cost
nœ1 relPre1 Integer
nœ2 valeur 950
relPre1 null propPro null
relPre2
B
relPro1
rel1 Integer
relPro2 null
prop1 null
prop1
nœ1
relPre1
C
nœ1
F IGURE 5.13 – Structure du fichier de la base de données orientée graphe. Le graphe modélise un
réseau de vol tel que les nœuds sont les aéroports et les relations représentent les vols.
et al., 2015]. On trouve la même complexité pour les autres opérations telles que la suppression et
l’ajout d’une propriété.
Conclusion. Pour résumer, les données du graphe sont stockées en Neo4j sous forme des listes
chaînées d’enregistrements de taille fixe. Les propriétés sont stockées sous forme d’une liste sim-
plement chaînée. Chaque enregistrement de la liste contient une paire clé-valeur et un pointeur
vers la propriété suivante. Chaque nœud et relation font référence à son premier enregistrement
de propriété. Un nœud fait également référence à sa première relation de la liste de ses relations.
Chaque élément de cette liste fait référence à ses deux extrémités. Il fait également référence à
l’enregistrement de la relation précédente et suivante.
Concernant le système du cache, Neo4j met sur le disque la plupart des informations dans des
champs de relations, ainsi les nœuds se réfèrent juste à leur première relation. Quant au système
de cache, les nœuds portent des pointeurs vers toutes ses relations. Les relations, quant à elles,
portent seulement leurs propriétés.
L’avantage du système de cache peut être illustré par les opérations qui consistent à trouver
un chemin. Comme toutes les références se font par des ID, les parcours se font indirectement à
travers le cache [Robinson et al., 2015]. Les relations pour chaque nœud sont regroupées par type
de relations ce qui permet de parcourir rapidement un type spécifique de relation. En revanche, le
temps d’exécution d’un parcours ne dépend pas de la taille du fichier de stockage de la base de
données [Raj, 2015]. Cette approche surpasse les approches des autres bases de données (voir la
figure 5.14).
Nœud
ID T1 T2 K1 K2 ... Km
ent:
ent:
sor:
sor:
V1 V2 Vm
R1 R1 R1 R1
R2 R2 R2 R2 Propriètès
... ... ... ...
Rn Rn Rn Rn
Cache
Relation
ID K1 K2 ... Ks
premier V1 V2 Vs
deux.
type
Disque
F IGURE 5.14 – Stockage cache/disque. Les flèches en pointillés représentent les références.
Toutes les références se font par ID. Les relations sont regroupées par type. {T1 , T2 } sont les
types des relations de ce nœud.
5.6 – Neo4j et Algorithmes de graphe 129
En l’occurrence, sans fournir un index, chercher une propriété particulière nécessitera de par-
courir toute la liste des propriétés avec un coût de O(n), n étant le nombre d’éléments de la liste
des propriétés. Alternativement, le coût d’une recherche par un index est inférieur à O(log 2 n) [Ro-
driguez and Neubauer, 2010].
Neo4j est représenté par une liste d’adjacence, donc visiter un voisin d’un nœud se fait en
O(1) [Robinson et al., 2015].
Pour résoudre le problème de plus court chemin depuis une source vers tous les nœuds, on
ne peut pas utiliser la librairie APOC. En effet, les algorithmes de graphes possibles avec cette
librairie sont tous pour le calcul du plus court chemin entre deux nœuds, notamment les deux
variantes de l’algorithme de Dijkstra : Bidirectionnelle ou A*.
100/
[Batra and Tyagi, 2012] manipulation des données requêtes Neo4j MySQL cinéma Neo4j dépasse MySQL quand on augmente la
500/
taille des données
135
136 C HAPITRE 6 — Schéma et analyse des données aériennes
❞❡st✐♥❛t✐♦♥
♦r✐❣✐♥ r❡✈❡♥✉❡
♣❛① ✈✐❛
❖✫❉
♦r❣ ♥♦♠
❞❡s s❡❣♠❡♥t❴❛✐r❧✐♥❡s
♥♦♠
✶✿◆ ✶✿◆ ✈✐t❡ss❡
r❡✈❡♥✉❡ ❆✐r♣♦rt
❈♦♠♣❛❣♥② ♣♦ssé❞❡
r❡❣✐♦♥ ♣❛②s ✈✐❧❧❡ ❆✐r❝r❛❢t ❝❛♣❛❝✐t②
♣❛①
❝♦❞❡ ✶✿◆
✶✿◆
❝♦❞❡ ❛❧❧✐❛♥❝❡
♥♦♠ ♦♣ér❡
❧♦♥❣✉❡✉r
t②♣❡
❞❡s ♦r❣
❞❡♣❛rt✉r❡❴t✐♠❡ ❛rr✐✈❛❧❴t✐♠❡
✵✿◆
❞✐st❛♥❝❡ ✈✐❛ ✵✿◆
❞✉r❛t✐♦♥ t✐♠❡ ♣❛① ✇❡❡❦❴❞❛②s
r❡✈❡♥✉❡
❝❛♣❛❝✐t②
❢r❡q✉❡♥❝②
❞❡st✐♥❛t✐♦♥ ②❡❛r❴♠♦♥t❤ ✢✐❣❤t❴♥✉♠❜❡r ♦r✐❣✐♥ ②❡❛r
❛✐r❧✐♥❡
❞❡st✐♥❛t✐♦♥
♠❛r❦❡t✐♥❣❴❛✐r❧✐♥❡ ②❡❛r❴♠♦♥t❤
♦♣❡r❛t✐♥❣❴❛✐r❧✐♥❡
139
140 C HAPITRE 6 — Schéma et analyse des données aériennes
♂
³ Ø
passager
planning avion
1 db.stats()
1. Les requêtes de chapitre ont été faites en mois d’avril de l’année 2019.
6.2 – Description du modèle aérien 141
1 {
2 "db" : "optimode",
3 "collections" : 172,
4 "datasize" : NumberLong(5853971454592),
5 "storageSize" : NumberLong(1541438582784),
6 "nindexes" : 1079
7 }
Listing 6.2 – résultats de la requête 6.1
La base de données optimode contient un grand volume de données environ 6 To, informa-
tion donnée par le champ datasize. On peut également avoir l’information sur la taille de la
base de données compressée (storageSize). La base de données optimode contient 1 079
index sur les 172 collections. La plupart des collections de la base optimode stockent les résul-
tats des pré-calculs 2 . Dans la suite de l’étude, nous nous baserons sur le marché segment pour la
facilité des calculs.
1 db.getCollection(’airport’).find({}).count()
1 db.getCollection("airport").find({"code_type":"airport"}).count()
La requête du listing 6.5 permet d’afficher le top 5 des aéroports français en terme de volume
de passagers. La donnée pax a été calculée par Milanamos pour un besoin. Nous recalculons la
valeur exacte dans la section 7.6.5.
Nous trouvons deux blocs dans la méthode find : le premier précise les données cherchées,
par exemple le champ country pour spécifier le code du pays dans lequel nous effectuons la
recherche. Le deuxième bloc spécifie les colonnes que nous souhaitons renvoyer dans le résultat.
Le lecteur trouvera un exemple de résultat de la requête du listing 6.5 dans la table 6.1 :
Pour accéder directement à l’ensemble des informations d’une collection, comme la collection
airport, nous utilisons la même méthode stats() :
1 db.airport.stats()
1 {
2 "ns" : "optimode.airport",
3 "count" : 11999,
4 "size" : 27311698,
5 "storageSize" : 29691904,
6 "nindexes" : 7,
7
6.2 – Description du modèle aérien 143
8 }
Listing 6.7 – statistiques de la collection airport
L’unité utilisée par défaut est Byte mais il est possible de passer en paramètre l’unité de conver-
sion. Par exemple, si on veut le résultat en Kilobyte (kb), alors la requête du listing 6.6 devient celle
du listing 6.8 :
1 db.airport.stats(1024)
12 "year_month" : "2010-09"
13 }
Listing 6.10 – exemple d’extrait de document de la collection segment
Les segments de vols sont stockés dans la collection segment. Les champs leg_origin
et leg_destination spécifient l’origine et la destination du vol. trip_origin représente
d’où on vient. Quant au champ trip_destination, il indique la prochaine destination.
L’exemple de document 6.10 nous montre que les vols partant de l’aéroport AAA vers BBB
opéré au mois de septembre de l’année 2010 par la compagnie aérienne JJ. Ce vol a généré un
revenu de $8 808 et trois passagers l’ont pris.
Listing 6.13 – requête pour trouver l’ancien year_month dans la collection segment
La méthode limit permet de limiter le nombre de documents renvoyés dans le résultat. Ainsi,
limit(1) renvoie le document le plus récent dans le cas du tri descendant. De la même façon,
quand il s’agit d’un tri ascendant, elle renvoie le document correspondant au year_month le
plus ancien.
6.2 – Description du modèle aérien 145
1 "year_month" : "2002-01"
Listing 6.14 – résultat de la requête du listing 6.13
Listing 6.15 – requête pour trouver le year_month le plus récent dans la collection segment
1 {
2 "year_month" : "2019-01"
3 }
Listing 6.16 – résultat de la requête du listing 6.15
Local
CDG N CE
Beyond
CDG N CE CM N
Behind
ICN CDG N CE
Bridge
ICN CDG N CE CM N
F IGURE 6.3 – Perspectives des segments. L’aéroport concerné par la vision est représenté par un
double carré.
Cette perspective spécifique à un aéroport reflète le fait que les aéroports ne cherchent pas
à comprendre le véritable flux O&D, mais à comprendre les flux via leurs aéroports respectifs.
Typiquement, voici les questions qu’on peut poser :
— D’où viennent les passagers qui se connectent à l’aéroport qu’on observe ?
— Où vont-ils ensuite ?
— Combien d’origines/destinations ?
— Quelles sont les origines/destinations les plus importantes ?
— Combien de passagers restent sur place ?
— Combien de passagers sont en transit ?
Cette étude préalable permet aux responsables de mieux gérer la facturation et la comptabili-
sation des redevances aux compagnies aériennes.
Quand il s’agit d’un segment local, alors le champ trip_origin (respectivement
trip_destination) est systématiquement le même que leg_origin (respectivement
leg_destination). Si on représente ces informations sur l’exemple de la figure 6.3, et en
prenant le cas de Bridge comme type de segment, on aura alors les informations de tableau 6.2.
6.3 – Analyse des données aériennes 147
champ valeur
leg_origin "CDG"
leg_destination "NCE"
segment_split "Bridge"
trip_origin "ICN"
trip_destination "CMN"
TABLE 6.2 – exemple de la représentation de segment Bridge de la figure 6.3 dans la collection
segment.
Cette analyse nous permettra d’estimer les données manquantes pour chaque collection uti-
lisée. En effet, la qualité des données joue un rôle très important sur le résultat attendu et dans
l’expérience des utilisateurs. Ainsi, les questions auxquelles nous cherchons à répondre :
— Combien d’aéroports n’ont pas de données sur le trafic et les horaires ?
— Combien de segments n’ont pas d’informations sur les horaires et sur les aéroports ?
— Combien de vols n’ont pas de données sur le trafic ?
— Quelles sont les caractéristiques des aéroports sans coordonnées géographiques ?
Cette étape est nécessaire pour estimer la taille et la complexité de notre problème étudié. On
cherche à comprendre quelles sont les données manquantes et si possible la cause de ces erreurs
pour faire des hypothèses. Par la suite, cela nous permettra de bien mener les démarches suivantes :
1. modéliser le graphe ;
2. comprendre sa structure et son évolution dans le temps ;
3. choisir la méthode adéquate pour résoudre le problème étudié,
4. valider les hypothèses par les résultats des expériences.
1 pipe = [
2 {’$match’: {’record_ok’: True, ’year_month’: year_month}},
3 {’$group’: {
4 ’_id’: { ’origins’: ’$leg_origin’,
5 ’destinations’: ’$leg_destination’},
6 ’pax’: {’$sum’: ’$passengers’}
7 }}]
8 cursor = SegmentInitialData.aggregate(pipe, allowDiskUse=True)
champ pourcentage
city 2%
country 1%
region 1,8%
lonlat 8%
Comme constaté dans la table 6.3, le champ lonlat est le plus affecté par ce manque de don-
nées, c’est le champ qui stocke les informations sur les coordonnées géographiques. Suite à cela,
nous avons fait une analyse plus détaillée pour identifier les caractéristiques de ces entités et ainsi
comprendre cette absence. La requête du listing 6.18 est faite en MongoDB pour trouver la région
des aéroports n’ayant pas de coordonnées géographiques. Le résultat est illustré graphiquement
dans la figure 6.4.
1 db.airport.find({’code_type’:’airport’,lonlat’:null},{"lonlat":1,"region":1})
Listing 6.18 – requête pour trouver la liste des régions des aéroports sans coordonnées
géographiques
150 C HAPITRE 6 — Schéma et analyse des données aériennes
Une grande partie des aéroports fait partie de la région européenne. Ceci peut être expliqué par
la présence des aéroports, nommés offLine (57%) dans le cas des vols charters. Un vol charter est
un vol non régulier, souvent reservé par un groupe de vacances. La destination peut être vers une
ville non desservie par la compagnie aérienne (offLine). 43% sont des gares de trains et des bus.
1 pipe = [
2 {’$match’: {’record_ok’: True,’year_month’: year_month}},
3 {’$group’: {
4 ’_id’: {
5 ’origin’: ’$leg_origin’,
6 ’destination’: ’$leg_destination’},
7 ’pax’:{’$sum’:’$passengers’}}},
8 {’$match’: {’pax’: {’$gte’: 10}}},
9 {’$sort’: SON([(’_id.origin’, 1), (’_id.destination’, 1)])}]
10 data_seg = SegmentInitialData.aggregate(pipe, allowDiskUse=True)
Ainsi, sur 52 474 segments, nous avons 24% des segments ayant uniquement des informations
sur le trafic, en termes de pax et revenu. En sélectionnant les segments ayant plus de 10 passagers
par mois (voir la section 6.3.2), on passe à 9% (voir le programme dans le listing 6.21). Comme
exemple, le vol entre Malte et Dubaï.
1 pipe = [
2 {’$match’: {’record_ok’: True, ’active_rec’: True, ’via’: None,
3 ’code_share’: False,’year_month’: ’2017-08’}},
4 {’$group’: {
5 ’_id’: {’origin’: ’$origin’,’destination’: ’$destination’}
6 }},
7 {’$sort’: SON([(’_id.origin’, 1), (’_id.destination’, 1)])}]
8 data_sch = ScheduleInitialData.aggregate(pipe, allowDiskUse=True)
Certains segments de vols n’ont pas d’horaires notamment les vols en cabotage et les vols
charters.
1 def main():
2
3 print("connect to optimode")
4 Model.init_db()
5
6 data_seg = data_sch_seg(year_month)
7 data_sch = data_seg_sch(year_month)
8
9 scheduleSet = set()
10 segmentSet = set()
11
12 for sch in data_sch:
13 id = sch[’_id’]
14 od = id[’origin’] + "-" + id[’destination’]
15 scheduleSet.add(od)
16
17 for seg in data_seg:
18 id = seg[’_id’]
19 od = id[’origin’] + "-" + id[’destination’]
20 segmentSet.add(od)
21
152 C HAPITRE 6 — Schéma et analyse des données aériennes
22 diff_sch_seg =scheduleSet.difference(segmentSet)
23 diff_seg_sch = segmentSet.difference(scheduleSet)
24
25
26 if __name__ == ’__main__’:
27 main()
Listing 6.21 – script pour l’analyse des collections en Python
Le champ active dans la requête du listing 6.22 permet de sélectionner que les compagnies
qui sont toujours actives. En fait, Milanamos ne supprime pas de données. Nous avons, ainsi, 138
LCC dont 29 de l’alliance VALUE sur 4 475 compagnies aériennes (voir la requête du listing 6.22).
Nous avons aussi remarqué qu’il y a 704 compagnies aériennes sans catégorie, null (voir la
requête du listing 6.23).
1 db.company.find({"airline_cluster":null, "active":true},{"_id":0,"iata_code
":1}).count()
1 pipe = [
2 {’$match’: {’record_ok’: true, ’year_month’: {’$gte’:’2017-01’, ’$lte’:
’2017-12’},{’leg_origin’: {’$in’:codes}}, {’leg_destination’: {’$in’:
codes}}}},
3 {’$group’: {
4 ’_id’:
5 {’origin’:’$leg_origin’, ’destination’: ’$leg_destination’},
6 ’pax’: {’$sum’: ’$passengers’}}}]
7 cursor = SegmentInitialData.aggregate(pipe, allowDiskUse=true)
On calcule l’écart δ entre le nombre de passagers calculé et celui de la DGAC. Nous considé-
rons, ainsi, qu’un écart au dessous de 5% est négligeable. Selon les résultats, nous avons classé
qu’il y a trois catégories :
— Catégorie 1 : 0 ≤ δ ≤ 5%.
— Catégorie 2 : δ > 5%, le cas où il y a une sous-estimation.
— Catégorie 3 : δ < 0%, le cas où il y a une surestimation.
Le tableau 6.4 nous donne le nombre de routes pour chaque catégorie. La comparaison a été
faite pour les trois premiers types de liaisons, au total 181 liaisons. Nous avons, ainsi, 80% des
routes telle que l’écart δ est non négligeable. 45% de ces routes ont moins de Pax que la DGAC.
(c) les données des liaisons ayant plus de 1 000 000 pax.
F IGURE 6.5 – Écart des passagers entre les données de Milanamos et les statistiques publiées.
Pour mieux comprendre ce manque, nous avons cherché les capacités de ces routes. La fi-
gure 6.6 présente les capacités des liaisons présentées dans la figure 6.5a. Le taux de remplissage
(en anglais Passenger Load Factor) est illustré sur les barres bleues.
6.4 – Comparaison avec l’aviation civile 155
F IGURE 6.6 – Capacité des liaisons ayant moins de 100 000 pax.
6.4.1.3 Explications
Les statistiques publiées par l’aviation civile française [Bureau de l’observation du marché,
2017] compte le nombre de passagers effectuant des vols avec escale d’un point vers un autre
point comme un segment de vols. Alors que Milanamos considère ce type de vol comme deux
segments de vols. Après discussion avec le responsable de données, il estime que la manière de
comptage et la vision du marché ne sont pas du tout identiques.
Une analyse est donc poussée dans ce sens puisque l’écart est assez important, notamment
le cas du segment (Paris-Tarbes/Lourdes) où l’écart dépasse 70%. Nous avons trouvé un taux de
remplissage moins élevé qui est dû à une capacité importante allouée pour ces vols mais avec un
nombre de passagers moins élevé. C’est une situation assez étrange. Nous avons regardé en détail
la liste des compagnies opérant ces vols et avons détecté que la compagnie aérienne Royal Air
Maroc avait un souci. Après une vérification sur le site de la compagnie pour voir si elle desservait
bien cette destination, nous avons trouvé que la destination n’était pas du tout présente parmi ses
destinations. Nous avons dans ce cas une donnée erronée et manquante.
En réalité, les données aéroportuaires fournies correspondent à un estimatif des mouvements
opérationnels et du trafic de l’aviation commerciale de transport de passagers : le fret, l’aviation
militaire, l’aviation générale, et toutes les activités de loisir, de sport ou de travail aérien ne sont
pas inclus dans les chiffres manipulés. Les données sont issues de différentes bases de données,
comme suit :
— Mouvements commerciaux : l’Official Airline Guide est la source principale de données,
corrigées par des informations de suivi de vol (base Flight Radar 2 ou autres) et complé-
tées par des données des aviations civiles et plate-formes aéroportuaires. item Trafic passa-
gers : les données estimées croisent différentes sources d’informations telles que les chiffres
publiés par les aviations civiles et plate-formes aéroportuaires, la banque de données euro-
péenne Eurostat, et les données issues des billets émis par les agences de voyages, y compris
en ligne.
Aujourd’hui, les données de Milanamos sont fournies par la compagnie Sabre, qui se base sur
son système de réservation des billets électroniques comme la compagnie Amadeus. Or, pour la
partie manquante comme les vols commerciaux, les billets achetés sur place dans une agence com-
merciale, les passagers privés, etc., Sabre se base sur une estimation de ces données manquantes.
2. site web qui affiche les informations en temps réel sur les vols
156 C HAPITRE 6 — Schéma et analyse des données aériennes
Listing 6.25 – requête pour trouver les documents correspondant aux données ferroviaires
Listing 6.26 – requête pour trouver les documents correspondant aux données de bus
Finalement, il y a 27 gares de trains, 3 stations de bus et 300 aéroports. Or, les dernières
statistiques de l’aviation civile qui datent de juillet 2019 indiquent qu’il y a 440 aéroports français.
310 aéroports publiés avec le code iata et 130 avec le code icao en absence du code iata.
Conclusion.
L’analyse des données de Milanamos nous a aidé à avoir connaissance des données man-
quantes et erronées qui vont par la suite créer des problèmes lors de la génération du graphe. En
effet, la qualité des données joue un rôle très important sur le résultat attendu et dans l’expérience
utilisateur. Nous avons, ainsi pu gérer ces soucis en amont de la génération du graphe pour sélec-
tionner, nettoyer et corriger les données. Cette étape nous a permis de mieux estimer la taille et la
complexité de notre problème. Le tableau 6.5 présente un récapitulatif des collections présentées
dans ce chapitre avec les champs ayant des soucis.
157
158 C HAPITRE 7 — Modélisation du réseau aérien
Après avoir présenté la différence entre les deux approches de la modélisation d’un réseau
de transport, nous présentons l’application de ces modèles dans le cas d’un réseau aérien. Nous
focalisons sur les modèles indépendant du temps. Ce sont les modèles utilisés dans ce travail de
thèse. Nous commençons par présenter les modèles utilisés pour les réseaux ferroviaires qui sont
la base de notre approche proposée pour la modélisation du réseau aérien. En effet, les modèles
utilisés dans la littérature pour les réseaux aériens utilisent le modèle dépendant du temps pour
inclure l’information temporelle y compris le temps d’enregistrement et le temps de départ [Pajor,
2009, Delling et al., 2009a].
représentée par un unique nœud, au lieu de multiples nœuds. Cette approche génère des graphes
compacts. Par conséquent, on obtient une borne inférieure sur le temps de trajet entre deux gares.
En fait, le modèle condensé donne un aperçu de la structure du système de transport ce qui permet
de tester rapidement la connectivité. En revanche, un tel modèle n’est pas utilisé dans le calcul
exact du plus court chemin.
Version Simple
Les nœuds dans le graphe ne représentent plus des gares mais plutôt des événements associés
à la table des horaires (voir 7.1.3.1). Dans la version simple du modèle étendu, il existe deux types
d’événements : événements de départ et événements d’arrivée. Pour chaque connexion élémentaire
de la table des horaires c = (z, so , sd , ts , te ), il y a un train z qui part de la gare so à l’instant ts
et arrive à la gare sd à l’instant te . Ainsi, deux nœuds sont insérés dans le graphe correspondant
aux événements de départ et d’arrivée. Pour garder trace de la gare à laquelle un nœud appartient,
chaque nœud est affecté à sa gare s ainsi que son horodatage t lorsque l’événement se produit.
Pour les arcs, deux types sont insérés. Un arc est inséré entre les nœuds so et sd avec un poids
égal au temps de trajet δ(ts , te ). Par ailleurs, le deuxième type d’arc est inséré entre les nœuds
associés à la même station.
Pour autoriser les transferts, les nœuds représentant la même gare sont triés par ordre crois-
sant [Pajor, 2013] (voir la figure 7.1).
A
Arrivée
A
D
Départ
A
T D Arrivée
A T
Transfert
A
D
Départ
T D Type 1
A Type 2
A Type 3
Type 4
T D Type 5
Type 6
A
Version Réaliste
Pour faire face à des transferts réalistes, une fonction de transfert est associée à chaque gare.
Cette fonction a pour but d’affecter des temps de transfert à chaque station de train. Ainsi, on
distingue trois types de nœuds : nœuds de départ, nœuds d’arrivée et nœuds de transfert. Alors
que les nœuds d’arrivée représentent toujours les événements d’arrivée de la table des horaires, les
événements de départ sont modélisés par une paire de nœuds qui consiste en un nœud de transfert
et un nœud de départ.
Pour les arcs, un nouveau type est ajouté représentant le transfert avec un temps minimum de
transfert [Pajor, 2009, Kirchler, 2013]. Ainsi, il y a cinq types d’arcs dans la version réaliste (voir
la figure 7.2) :
1. Arcs-Départ [T => D] : Chaque paire de nœuds de transfert et de départ est connectée par
un arc de départ à poids 0.
2. Arcs-Connexion [D => A] : Chaque nœud de départ est connecté à son nœud d’arrivée
correspondant dans la connexion élémentaire c.
3. Arcs-Gare [T => T] : Pour chaque gare s ∈ S, ses nœuds de transfert sont triés par ordre
croissent (comme dans le cas de la version simple).
7.2 – Modélisation des réseaux de transport 163
4. Arcs-Transfert [A => T] : Ce type d’arc sert à modéliser les transferts. Un nœud d’arrivée
est connecté au prochain nœud de transfert. Pour chaque nœud d’arrivée à te , on cherche
pour le plus petit nœud de transfert, ttr , tel que : δ(te , ttr ) ≥ transfer(s).
5. Arcs-Train [A => D] : Ce type d’arc modélise le fait qu’un passager puisse rester dans le
même train pour poursuivre son trajet.
6. Arcs-Nuit : Ce type d’arc sert à modéliser les transferts pendant la nuit.
7.1.5 Discussion
Tout d’abord, nous avons commencé par présenter les deux types de modèles : modèle indé-
pendant du temps qui est le plus utilisé pour les réseaux routiers et le modèle dépendant du temps.
Dans le cas de ce travail du thèse, nous sommes intéressés par le modèle indépendant du temps qui
répond plus à notre question de recherche. Ainsi, nous avons laissé de côté le modèle dépendant
du temps.
Dans le cadre d’une approche indépendante du temps qui permet de travailler sur des graphes
assez compacts, il y a deux types de modèle :
— Le modèle temporel étendu qui inclut le temps de transfert en représentant les événements
de la table des horaires comme des nœuds, ce modèle inclut statiquement les dépendances
temporelles mais génère des graphes plus larges.
— Le modèle condensé permet de représenter uniquement la structure du réseau et tester rapi-
dement la connectivité. Ce modèle permet ainsi d’obtenir des bornes inférieures sur le calcul
du plus court chemin.
Pour revenir à notre cadre du travail qui ne fait pas le calcul d’itinéraires mais le but est de
trouver une opportunité économique qui peut être basée sur les décisions suivantes :
1. augmenter la fréquence ;
2. proposer un nouveau vol ;
3. proposer un vol partagé.
Le travail de thèse ainsi consiste à analyser et modéliser le réseau aérien. Dans le cadre aérien,
la plupart des modèles dans la littérature utilisent une approche dépendante du temps.
Pour répondre à notre question, nous avons proposé une nouvelle approche qui est basée sur
les modèles présentés avant pour les autres réseaux de transport dans le cas d’une approche indé-
pendante du temps.
Notre approche permet de mieux modéliser notre réseau aérien suivant nos contraintes :
1. représenter la structure du graphe ;
2. modéliser les transferts ;
3. calculer des bornes inférieurs sur les plus courts chemins.
164
Indépendant du temps Dépendant du temps
Condensé Étendu
Simple Réaliste Simple Réaliste
Propriétés nœud → aéroport nœud → événement nœud → nœud → aéroport nœud →
événement,transfert événement,transfert
arc → toutes les arc → connexion arc → connexion arc → toutes les arc → connexion
connexions élémentaire élémentaire, transfert connexions élémentaire
élémentaires élémentaires
poids → temps de poids → temps de poids → temps de poids → f(temps poids → f(temps
trajet minimum trajet trajet, temps de d’attente, temps de d’attente, temps de
transfert trajet) trajet)
TABLE 7.1 – Comparaison entre les différentes approches de modélisation des réseaux de transport.
7.2 – Modélisation du réseau aérien 165
Où M CT est le temps minimum pour faire une correspondance à l’aéroport d(ci ). Ce temps
dépend de l’aéroport destination de la connexion élémentaire.
Algorithmiquement parlant, Les données sont stockées sous la forme de clé-valeur telle que
la clé est le mois de l’année, alors que sa valeur est un dictionnaire de clé-valeur pour tous les
critères. Cette représentation est assez canonique et plus flexible pour différentes raisons :
— Les données sont stockées mensuellement dans la base optimode.
— Pour ajouter les données d’un mois spécifique, il suffit de récupérer la paire de nœuds à
mettre à jour. Ensuite, ajouter les données aux propriétés existantes. La même chose est
faite pour la suppression.
— Le temps de réponse est plus rapide.
−0 1′ :{pax:90,r ev :6
500
′ 2 015 }
O D
′
20 0}
15− 50
0 2 ′: { p :3
a x:4 5,r ev
F IGURE 7.3 – Représentation du modèle du graphe condensé aérien. Dans cet exemple, nous
présentons deux périodes : 2015-01, 2015-02 et deux critères : pax (nombre des passagers),
rev (revenu).
o3
bo
ar
connect to
da
t
P EK
t
h ta
n th a l ig
mo d3
year month r
y ea
t d1 o2
ta d at
h ar
l ig bo
connect to
connect to
a ye
ar
mo
N CE b BKK nt
h d4 al i
oa gh
rd al i ta
at t
connect to
gh
ta
o1 t d2 ICN
t
year month r da
o4 b oa
3 DXB Vol
12 4
Vol 56
N CE BKK
Segment NCE-BKK
Étape 1
La première étape consiste à récupérer l’ensemble des informations sur les vols stockées dans
les deux collections segment et schedule. Les étiquettes du graphe condensé sont calculées à
partir de ces informations. Ensuite, nous agrégeons les données suivant les trois champs : origine
(O), destination (D) et M (year_month) (voir l’étape Aggregation (O,D,M) de la figure 7.7).
Étape 2
Étape 3
L’étape finale consiste à créer ces données sur le graphe de Neo4j en utilisant le pilote py2neo.
Ce pilote dispose de l’ensemble des fonctions pour créer des nœuds, insérer des données, etc.
Ainsi, pour générer les nœuds, nous nous sommes basés sur la collection airport pour récupérer
toutes les informations concernant l’entité aéroport, requête du listing 7.1.
1 db.airport.findOne(
2 {"code_type": "airport", "lonlat": {"$ne": None}, "code": code},
3 {"lonlat": 1, "name": 1, "code": 1, "city": 1, "country": 1, "region": 1, "_id
": 0})
La requête du listing 7.1 renvoie toutes les informations sur le nom, le code, la ville, le pays,
la région et les coordonnées géographiques d’un aéroport (valeur 1 pour renvoyer uniquement les
champs demandés). Comme on a expliqué dans la section 7.4.1.1, certains aéroports n’ont pas
de coordonnées géographiques. Pour les exclure de la recherche, nous utilisons l’opérateur de
MongoDB $ne qui exclue les aéroports ayant des coordonnées non nulles ou qui n’existent pas.
172 C HAPITRE 7 — Modélisation du réseau aérien
Segment Schedule
Aggregation Aggregation
(O, D, M ) (O, D, M )
Computing
Distance
pymongo
Join
Airport
(O, D, M )
Estimation
Duration
Nodes Creation
Neo4j Graph
Pour avoir les informations mensuelles sur le trafic pour chaque paire d’aéroports origine-
destination, à savoir, le nombre de passagers (pax), le revenu minimum par passager, le re-
venu, la distance, la liste des compagnies aériennes, nous faisons une agrégation sur la collection
segment. Ensuite, pour construire les arcs, nous sommes partis de la collection segment (ligne
3 de l’algorithme 4). Puis, pour compléter les données relatives au planning de vol, notamment, la
7.4 – Construction du graphe condensé 173
capacité, la fréquence, la durée et le jour de l’opération du vol, nous procédons à une agrégation
sur la collection schedule (ligne 4 de l’algorithme 4). Les données sont agrégées suivant le mois
de l’année (year_month). La fonction segment_join consiste à fusionner les résultats des
deux agrégations (ligne 5 de l’algorithme 4). Concernant la distance qui manque, nous faisons un
calcul lors de la jointure.
Opération de jointure
On part du principe que le graphe est construit à partir de l’ensemble de segments de la col-
lection segment dont les aéroports sont connus par notre système (la collection airport).
La fonction segment parcourt le résultat de l’agrégation sous forme d’un curseur et cherche la
correspondance sur la paire d’aéroports origine-destination, qui est la clé de la jointure, avec le
résultat de l’agrégation de schedule. Comme c’est une jointure à gauche, on souhaite récupérer
toutes les informations de la collection gauche (segment) et compléter par les informations sur
les horaires de vols. La recherche se fait sur les ensembles triés par un ordre lexicographique sur
les codes des paires d’aéroports origine-destination. On commence par l’origine, si on trouve la
correspondance, on passe alors à la destination et on refait la même procédure. Les cas de figures
rencontrés sont :
— Cas 1 : l’origine n’est pas encore trouvé dans schedule, on ajoute le segment.
— Cas 2 : on n’a pas trouvé l’origine dans schedule, on ajoute le segment et on avance sur
schedule.
Comme la distance est absente sur certains segments de vols, elle est calculée au cours de la
jointure (opération Computing Distance dans la figure 7.7). Pour cela, nous récupérons en même
temps les informations relatives aux aéroports de segment de vol, notamment les coordonnées
géographiques qui serviront à estimer la durée manquante. Pour estimer celle-ci, nous utilisons un
algorithme basé sur l’apprentissage automatique (ligne 6 de l’algorithme 4).
La requête du listing 7.2 présente la requête d’agrégation qui est une requête paramétrée, appe-
lée pour chaque mois de la période considérée T . La ligne 2 consiste à chercher les documents cor-
respondant au mois demandé. Ensuite, on fait une projection pour sélectionner les champs qui nous
intéressent et calculer le revenu moyen par passager qui sert par la suite à calculer le revenu mini-
mum par passager R̄od . En effet, pour chaque connexion élémentaire représentée par un document
dans la collection segment, on calcule le revenu moyen par passager average_revenue. En-
suite, nous effectuons un group pour regrouper les données par paire origine-destination. Cela
permettra d’agréger tous les segments existants entre une paire d’aéroports origine-destination.
Comme pour certains segments, on a le nombre de passagers à 0 : on estime que le revenu
moyen est nul pour ces segments (ligne 12 de la requête du listing 7.2).
On ne garde, dans le résultat, que les segments dont le nombre de passagers est supérieur à
10 et bien évidemment ayant des revenus non nuls (ligne 26 de la requête du listing 7.2). C’est
le seuil qu’on avait fixé puisqu’on avait estimé que de tels segments correspondaient plutôt à une
faute de frappe (voir la section 6.3.2).
Une méthode d’agrégation contient plusieurs étapes. MongoDB écrit dans des fichiers tempo-
raires sur le disque. La mémoire limite est de 100Mo. Quand cela dépasse, c’est le cas notamment
174 C HAPITRE 7 — Modélisation du réseau aérien
avec des grandes données comme la base optimode, il faut passer alors le paramètre allowDis-
kUse pour donner la permission à MongoDB d’allouer plus de mémoire sur le disque, à la méthode
(ligne 28 de la requête du listing 7.2).
1 pipe = [
2 {’$match’: {’record_ok’: True, ’year_month’: ym}},
3 {’$project’: {
4 ’leg_origin’: ’$leg_origin’,
5 ’leg_destination’: ’$leg_destination’,
6 ’segment_revenue_usd’: ’$segment_revenue_usd’,
7 ’passengers’: ’$passengers’,
8 ’distance’: ’$distance’,
9 ’operating_airline’: ’$operating_airline’,
10 ’average_revenue’: {
11 ’$cond’: [{’$eq’: [’$passengers’, 0]}, 0,
12 {’$divide’: [’$segment_revenue_usd’, ’$passengers’]}]}
13 }},
14 {’$match’:{’average_revenue’: {’$ne’: 0}}},
15 {’$group’: {
16 ’_id’: {
17 ’origin’: ’$leg_origin’,
18 ’destination’: ’$leg_destination’
19 },
20 ’revenue’: {’$sum’: ’$segment_revenue_usd’},
21 ’pax’: {’$sum’: ’$passengers’},
22 ’distance’: {’$first’: ’$distance’},
23 ’airlines’: {’$addToSet’: ’$operating_airline’},
24 ’revenue_min’: {’$min’: ’$average_revenue’}
25 }},
26 {’$match’: {’pax’: {’$gte’: 10}, ’revenue_min’:{’$ne’:0}}},
27 {’$sort’: SON([(’_id.origin’, 1), (’_id.destination’, 1)])}]
28 cursor = SegmentInitialData.aggregate(pipe, allowDiskUse=True)
TABLE 7.2 – Correspondance des étiquettes du CFN avec les métriques des requêtes 7.2 et 7.3.
1 MATCH (n:aeroport)-[r]->()
2 WHERE type(r) IN [’2015-01’, ’2015-02’, ’2015-05’]
3 RETURN SUM(r.cap) AS sum
nous avions deux périodes (2015-01 et 2015-02) et que nous souhaitions calculer la capacité
totale (voir la requête du listing 7.4).
La requête du listing 7.4 ne génère aucun blocage. En effet, Neo4j commence par filtrer le
graphe et ensuite faire le calcul. Il est à noter que Nul signifie que « la propriété n’existe pas ».
Donc, Neo4j ne crée pas une propriété qui a une valeur nulle. On présentera le deuxième test
dans la section suivante.
Test 1
Le test consiste à intégrer les étiquettes calculées mois par mois dans le CFN. Nous avons
commencé par les données 2015 puisqu’à l’époque, c’était les données les plus récentes. Le
graphe généré contient 11 300 nœuds et 604 280 arcs. Ce graphe a été généré en 2 heures environ
(voir le tableau 7.3).
TABLE 7.3 – Statistiques sur la période 2015. Tn représente le temps de création des nœuds, Ttot
est le temps du processus total en secondes.
Le tableau 7.4 représente les informations détaillées pour chaque mois des deux opérations
du processus de la mise en place du graphe condensé : l’agrégation et la création. Cette dernière
opération concerne le stockage du graphe sur Neo4j, alors que l’opération d’agrégation concerne
plutôt la base de données MongoDB. Les informations concernent le nombre de relations géné-
rées à partir du nombre de documents ainsi que le temps d’exécution de chaque opération (Tag
(respectivement Tcr ) pour l’agrégation (respectivement la création)).
Pour mieux analyser les données du tableau 7.4, nous les avons présentées graphiquement.
On peut ainsi évaluer le comportement du temps par rapport au volume des données (voir les
figures 7.8).
On remarque que l’agrégation prend deux fois plus de temps que la création des arcs. Les
courbes des deux étapes ont la même tendance que celle de nombre de relations. Le pic est atteint
7.4 – Construction du graphe condensé 177
au mois 9 de l’année 2015. C’est le mois qui coûte cher pour faire l’agrégation selon le tableau
7.4.
(a) Courbe de temps d’agrégation des documents. (b) Courbe de temps de création des arcs.
Test 2
L’horizon choisi pour ce test est de 5 ans à partir de l’année 2015. Comme le temps est sensible
aux flux d’arrivée, cette mesure a une tendance linéaire : le temps augmente quand le volume de
178 C HAPITRE 7 — Modélisation du réseau aérien
données reçu est important. C’est tout à fait le comportement normal que nous devions constater.
Le graphique de la figure 7.9b illustre l’évolution mensuelle du temps pour la création des arcs
en Neo4j. La courbe a tendance à croître pour se stabiliser les six derniers mois de l’année
2020. Ce qui n’est pas le cas pour la courbe de l’agrégation des données en MongoDB (voir la
Figure 7.9a) qui commence à se stabiliser vers la moitié de la période considérée (2017-09).
Cela peut s’expliquer par le fait qu’à partir de ce stade, les opérations dédiées au stockage des
données sur la base s’exécutent.
❛❛
Version
Taille
❛❛ 1 2
❛
❛
nœuds 4 577 4 602
arcs 1 125 418 1 127 558
1 //isolated node
2
3 MATCH(a:Airport) WHERE SIZE((a)--()) = 0 RETURN COUNT(a);
4
5 //coordinates
6
7 MATCH(a:Airport) WHERE NOT EXISTS(a.lon) OR NOT EXISTS(a.lat) RETURN COUNT(a);
8
9 //metrics
10
11 MATCH()-[r]-() WHERE NOT EXISTS(r.distance) AND NOT EXISTS(r.duration_min) AND
NOT EXISTS(r.distance) RETURN COUNT(r);
12
13 MATCH()-[r]-() WHERE NOT EXISTS(r.distance) OR NOT EXISTS(r.duration_min) OR
NOT EXISTS(r.distance) RETURN COUNT(r);
14
15 //cycle
16
17 MATCH (a:Airport)-[r]->(a:Airport) RETURN COUNT(r);
Dans l’ancienne version du graphe condensé, on gardait les aéroports sans données sur le trafic
et les horaires, l’idée était de garder ces aéroports pour le jour où on reçoit des nouvelles données.
Le graphe, ainsi, comportait des nœuds isolés. La requête du listing 7.6 renvoie le nombre de
nœuds isolés, c’est-à-dire le nombre d’aéroports dont aucune information sur le mois est rensei-
gnée.
180 C HAPITRE 7 — Modélisation du réseau aérien
Nous avons trouvé 6 862 nœuds isolés sur 11 439 nœuds. Cela veut dire qu’environ 70% des
nœuds ont un degré nul. Ces nœuds isolés correspondent à des aéroports pour lesquels Milanamos
n’a pas de données sur leurs vols en terme de données de trafic et des horaires de vols. Cela
représente un grand volume par rapport aux aéroports existants. Cela est dû au fait que nous
construisons le graphe en nous basant sur la collection airport.
Suivant ces analyses, nous avons procédé à une transformation consistant à supprimer les
nœuds isolés (voir la requête du listing 7.7).
1 MATCH (a:Airport)
2 WHERE SIZE ((a)--())=0
3 DETACH DELETE a
Nous avons également détecté des cycles, provenant de la collection schedule. Nous avons
estimé 289 cycles 1 125 707 relations, qui représentent des vols circulaires.
1 MATCH (n:Airport)-[r]-(m:Airport)
2 WITH n AS o, m AS d, type(r) AS relType, 1 * CASE WHEN startNode(r) = m THEN -1
ELSE 1 END AS dir
3 WITH o, d, relType, SUM(dir) AS balance
4 WHERE balance = -1
5 RETURN DISTINCT COUNT(relType) AS missingArcs
La requête du listing 7.9 présente un exemple d’estimation pour une paire d’aéroport comme
Nice (NCE) et New York (JFK). Cette requête renvoie que 3 arcs de retours manquent, ce qui veut
dire 3 mois de données sur les vols.
1 MATCH p=(n:Airport{code:’NCE’})-[r]-(m:Airport{code:’JFK’})
2 WITH SUM(SIZE((n:Airport{code:’NCE’})-[r]-(m:Airport{code:’JFK’}))) AS balance,
type(r) AS relType
3 WHERE SUM <2
4 RETURN COUNT(relType) AS missingArcs
Listing 7.9 – requête pour l’estimation des arcs manquants pour une paire de nœuds.
1 MATCH (n:Airport)-[r]->(m:Airport)
2 WHERE NOT EXISTS(r.revenue_min)
3 RETURN COUNT(r) AS missRevProp
Listing 7.10 – requête pour l’estimation des arcs sans la propriété revenu minmum.
distance et la durée non estimées pour certains nœuds comme leurs coordonnées géographiques
sont absentes (voir la section 6.3.3). Nous avions proposé une distance et une durée qui sont plus
élevées pour les arcs liant ces nœuds. Ceci n’avait pas pu impacter nos algorithmes.
7.5.3 Connectivité
La connectivité permet d’étudier comment un réseau est connecté, ce qui joue un rôle extrê-
mement important pour analyser et interpréter les différents résultats. Nous avons commencé par
vérifier si le graphe condensé comportait une seule composante connexe.
Suite à ces analyses, notre graphe est censé être non connexe. Le graphe condensé est, ainsi,
composé de 893 composantes connexes (voir le tableau 7.6).
nodes setCount
4 602 893
1 MATCH (a:Airport)
2 RETURN a.partition AS compC,COUNT(*) AS taille
3 ORDER BY taille DESC
4 LIMIT 20;
La requête du listing 7.12 nous donne plus de détails sur les composantes connexes en termes
du nombre et de taille. La grande composante contient 3 680 aéroports (80% d’aéroports) contre
880 composantes qui correspondent à des nœuds isolés (20% d’aéroports) : des aéroports n’ayant
pas de données pour ce mois-ci (voir le tableau 7.7). Ce résultat est cohérent puisque ça correspond
à la requête du listing 7.13 qui calcule le nombre des nœuds isolés pour le mois 2016-01.
CC taille
1 3 680
2 9
4 3
6 2
880 1
893 4 602
TABLE 7.7 – Statistiques des composantes connexes. CC est le nombre des composantes connexes.
1 MATCH (n:Airport)
2 WHERE SIZE ((n)-[:‘2016-01‘]-())=0
3 RETURN COUNT(n)
Listing 7.13 – requête pour le calcul des nœuds isolés pour le mois de janvier de 2016.
On reprend la même requête du listing 7.12 pour obtenir plus de détails sur les composantes
fortement connexes. Nous avons, ainsi, la composante dominante qui contient 3 551 nœuds contre
1 024 composantes contenant un seul nœud (voir le tableau 7.7). Comme on sait qu’il y a 880
nœuds isolés, on constate alors qu’on a 144 aéroports qui correspondent à des nœuds non ac-
cessibles (5% des aéroports accessibles). Parmi ces nœuds non accessibles, il y a 76 nœuds dits
sources et 62 nœuds dits puits. Les requêtes du listing 7.15 et 7.16) confirment cette analyse. Cela
veut dire que l’avion ne peut partir depuis ces aéroports ou bien qu’il ne peut pas les rejoindre.
SCC taille
1 3 551
1 9
1 4
2 3
4 2
1 024 1
1 033 4 602
TABLE 7.9 – Statistiques des composantes fortement connexes. SCC est le nombre des compo-
santes fortement connexes.
1 MATCH (n:Airport)
2 WHERE SIZE (()-[:‘2016-01‘]->(n))=0 AND SIZE((n)-[:‘2016-01‘]->())>0
3 RETURN COUNT(n) AS nbrSource
Listing 7.15 – requête pour calculer le nombre des nœuds sources pour le mois janvier 2016
1 MATCH (n:Airport)
2 WHERE SIZE (()-[:‘2016-01‘]->(n))>0 AND SIZE((n)-[:‘2016-01‘]->())=0
3 RETURN COUNT(n) AS nbrSink
Listing 7.16 – requête pour calculer le nombre des nœuds puits pour le mois de janvier 2016.
Pour avoir plus de détails sur les régions où il y a un manque de données, nous avons utilisé
la requête du listing 7.17 qui renvoie le nombre d’aéroports sans données pour le mois 2016-01
par région.
La figure 7.10 illustre le graphique de la répartition des aéroports par région. Une grande
partie des aéroports fait partie de la région d’Amérique nord et de l’Europe. Ceci coïncide avec les
résultats obtenus pour l’analyse des coordonnées géographiques (voir la section 6.3.3). En Europe,
le résultat peut être expliqué par la présence des aéroports de type offLine (57%). En Amérique
184 C HAPITRE 7 — Modélisation du réseau aérien
1 MATCH (a:Airport)
2 WITH a.partition AS partition,count(*) AS size_of_partition, COLLECT(a) AS
airports
3 WHERE size_of_partition = 1
4 UNWIND airports AS a
5 RETURN count(a) AS nbrAirReg, a.region
6 ORDER BY nbrAirReg DESC;
Listing 7.17 – requête pour le calcul des composantes fortement connexes pour une période d’un
an.
du nord, il y a des faux aéroports c’est-à-dire qui ne sont pas des aéroports en réalité C’est-à-dire
qu’il n’y pas des vols commerciaux partants de ces vols.
Suite à ces résultats, nous avons analysé la connexité du graphe pour une période de 12 mois.
Le nombre des composantes connexes est censé diminuer (voir la requête du listing 7.18).
Listing 7.18 – requête pour le calcul des composantes fortemment connexes pour une période d’un
an.
On obtient 609 composantes fortement connexes contre 1 033 dont 50% des nœuds qui de-
viennent connectés (594 nœuds isolés contre 1 024) (voir les tableaux 7.10 et 7.11).
TABLE 7.10 – Composantes fortement connexes dans le graphe condensé pour une période d’un
an.
7.5 – Analyse structurelle du réseau aérien 185
SSC taille
1 3 963
1 9
1 4
1 6
2 5
10 2
594 1
609 4 602
TABLE 7.11 – Statistiques des composantes fortement connexes pour une période d’un an.
Conclusion. Suite à ces analyses, nous concluons que notre graphe n’est pas fortement connexe
ce qui peut impacter le calcul des autres métriques typiquement la métrique de l’excentricité que
nous allons voir par la suite.
7.5.4 Densité
La densité d’un graphe est définie comme étant le ratio du nombre d’arcs sur le nombre de
nœuds. Cette métrique mesure si le graphe a beaucoup ou peu d’arcs (voir le paragraphe 4.1.1).
La figure 7.11 nous donne l’évolution du nombre de nœuds en fonction du nombre d’arcs pour
chaque mois. Nous avons choisi de calculer la densité pour une période d’un an pour voir s’il y a
un changement à travers les mois de l’année. La densité est donc calculée pour l’année 2016.
Le comportement de la courbe est assez étrange. En effet, les réseaux aériens deviennent plus
connectés avec l’avancement du temps. Donc, on a tendance à voir une courbe droite qui croît
avec le temps mais ce n’est pas le cas, cela vient du manque de données. Le pic est atteint pour
les deux mois 2016-07 et 2016-08, la saison de l’été où les vols sont plus nombreux : d’où
le nombre d’arcs plus élevé par rapport au nombre de nœuds qui reste quasiment le même durant
toute l’année.
Comme la start-up Milanamos a procédé à un remplacement de ses données par les données de
Sabre (voir la chapitre 6), nous avons comparé la nouvelle densité calculée avec celle de l’ancien
186 C HAPITRE 7 — Modélisation du réseau aérien
graphe condensé pour la même année. On constate, alors, avec les nouvelles données de Sabre
qu’on a plus de manques (voir la figure 7.12). Il fallait peut-être garder les anciennes données et
les comparer avec les nouvelles sans les remplacer, et envisager une correction des données.
F IGURE 7.12 – Comparaison de la densité de l’année 2016 pour les données mises à jour. oData
désigne les anciennes données, et nData les nouvelles données.
Toujours dans le cadre de l’analyse de la densité, nous avons analysé également l’évolution
des données. Nous avons, ainsi, comparé la densité de l’année 2016 avec celle de l’année 2017.
On remarque que les données évoluent bien.
L’autre information qu’on peut tirer de ce graphe est que le pourcentage des nœuds connectés
n’atteint pas 100%. Le graphe contient 4 602 nœuds et on a au minimum 20% des nœuds non
connectés. Cela est dû à un manque de données pour ces segments reliant cette fraction de nœuds.
Ce résultat confirme les résultats présentés avant (880 composantes connexes de taille 1).
7.5 – Analyse structurelle du réseau aérien 187
Pour générer les données associées au graphique de la figure 7.11, nous avons utilisé une
requête Cypher, voir la requête du listing 7.19.
1 MATCH(n:Airport)-[r]-(m:Airport)
2 WHERE ’2016-01’ <= TYPE(r) <= ’2016-12’
3 WITH COUNT(r) AS deg,n, TYPE(r) AS ym
4 WITH COUNT(n) AS nodes, ym, SUM(deg) AS arcs
5 RETURN ym, nodes, arcs/2
La requête du listing 7.19 commence par filtrer le graphe suivant les mois demandés (ligne 2).
Ensuite, on calcule le nombre d’arcs pour chaque nœud et finalement, on fait la somme de tous les
arcs pour chaque nœud et chaque mois (ligne 4).
1 MATCH (a:Airport)-[r]-()
2 RETURN DISTINCT TYPE(r) AS yearMonth, a.code AS code, a.region AS region,
3 apoc.node.degree(a, ’<’+type(r)) AS indegree, apoc.node.degree(a, type(r)+’>’)
AS outdegree
La distribution des degrés du graphe condensé suit la loi exponentielle. Il y a plusieurs nœuds
avec moins de liens et peu de hubs avec un grand nombre de liens (voir la figure 7.14). Les
graphiques représentent les degrés entrants (voir la figure 7.14a), sortants (voir la figure 7.14b) et
total (voir la figure 7.14c) suivant la fonction de répartition ou la fonction cumulative.
188 C HAPITRE 7 — Modélisation du réseau aérien
1.00 1.00
0.75 0.75
0.50 0.50
0.25 0.25
0.00 0.00
1 10 100 1 10 100
indegree outdegree
1.00
0.75
0.50
0.25
0.00
3 10 30 100 300
degree
La distribution des degrés sortants du graphe condensé a la même forme que celle des degrés
entrants (Figure 7.14b). On a 5% des aéroports ayant plus de destinations que de provenances
(voir Figure 7.14a). Cela n’a pas de sens car les vols arrivant à un aéroport sont censés repartir :
pour chaque aéroport représenté par un nœud dans le graphe, on a une conservation de flux. En
examinant la répartition des degrés sortants, on a 62% des 3 720 (voir la figure 7.11 de la densité
du mois 2016-01) aéroports qui ont moins de 5 destinations, ce qui représente 2 277 aéroports :
cela nous paraît assez étrange.
Pour vérifier l’anomalie détectée dans la distribution des degrés concernant les aéroports ayant
moins de 5 destinations, nous avons fait la requête du listing 7.21 en Cypher pour le mois ayant
plus de données : c’est le mois 2017-08 qui est le plus optimiste pour notre cas.
1 MATCH (n)-[r:‘2017-08‘]->()
2 WITH COUNT(r) AS dest,n
3 WHERE dest<5
4 RETURN COUNT(n) AS totalNoe, n.region AS region
Listing 7.21 – requête pour trouver les aéroports ayant moins de 5 destinations
2 277 aéroports ont moins de cinq destinations ce qui confirme le chiffre trouvé lors de l’ana-
lyse du degré sortant. Cela est bizarre car plus de la moitié des aéroports sont des aéroports desser-
vant ce nombre de destinations (62% des 3 720 aéroports ayant des données (voir la figure 7.11)).
Un exemple contradictoire est l’aéroport international allemand Paderborn Lippstadt (code PAD)
avec onze destinations [https\penalty\@M://www.flightsfrom.com, 2019] et l’aéro-
port international Johannesburg-Lanseria en Afrique du sud (code HLA) qui est le hub de trois
compagnies aériennes [WIKIPEDIA, 2019].
Suite à cela, nous avons fait une analyse poussée pour déterminer la région de ces aéroports.
La figure 7.15 montre la répartition de ces aéroports par région. On trouve que nous avons plus
de données manquantes pour les aéroports de la région nord de l’Amérique. Le résultat confirme
les résultats obtenus pour l’analyse des composantes connexes (voir la section 7.5.3). Lors de
l’analyse de la répartition des nœuds isolés par région, nous avons obtenu un chiffre plus grand
que dans le cas des aéroports ayant moins de 5 destinations. Cela a un sens comme les nœuds
isolés font partie des aéroports ayant moins de 5 destinations.
La figure 7.15 illustre le graphique de la répartition de ces aéroports par région. La répartition a
la même forme que celle de la figure 7.10 et la figure 6.4 (voir la section 6.3.3). Ce sont les mêmes
résultats trouvés lors de l’analyse des régions d’aéroports sans coordonnées géographiques et ceux
correspondant aux nœuds isolés, composante connexe avec un seul aéroport.
F IGURE 7.15 – Répartition des aéroports ayant moins de 5 destinations par région pour les don-
nées mises à jour.
En comparant le résultat de la requête du listing 7.20 avec l’ancien résultat (ancienne ver-
sion du graphe), nous constatons qu’il y a 310 aéroports qui ont été supprimés et 335 nouveaux
aéroports ajoutés ((4 577 − 310) + 335 = 4 602).
Au niveau de la taille des résultats, en termes de lignes (19 071 relations), nous remarquons
qu’il y a plus de données (par aéroport et par year_month) par rapport à la taille des nouveaux
résultats, ce qui peut être expliqué par le fait que les aéroports ajoutés ont moins de données
mensuelles. En effet, pour un aéroport donné, on a au minimum 1 mois de données et au maximum
24 mois de données.
Nous obtenons un chiffre de 2 149 aéroports ayant moins de cinq destinations ce qui représente
57% des 3 770 aéroports (voir la figure 7.12). L’écart a bien augmenté de 5%.
La figure 7.16 montre la répartition de ces aéroports par région. On trouve que nous avons
plus de données manquantes des aéroports de la région nord de l’Amérique. En comparant avec la
répartition par région pour les nouvelles données (voir la figure 7.15), on constate que ce pourcen-
tage a bien augmenté sur les nouvelles données pour plusieurs régions notamment : l’Amérique
du nord et l’Europe. La région null correspond aux aéroports dont on ne connaît pas leurs ré-
gions et par conséquent leurs coordonnées géographiques. Cela été filtré lors du prétraitement des
nouvelles données pour générer la deuxième version du graphe. C’est pour cela, qu’il n’y a plus
de région null sur la figure 7.15.
F IGURE 7.16 – répartition des aéroports ayant moins de 5 destinations par région.
7.5.6 Excentricité
Nous commençons par définir l’excentricité ainsi que l’ensemble des métriques liées à la mé-
trique excentricité [Chakrabarti and Faloutsos, 2006].
Définition 7.5.2 (Diamètre). Le diamètre d’un graphe est l’excentricité maximale de ses nœuds.
Cette mesure représente la distance la plus courte entre les nœuds les plus éloignés du graphe.
Définition 7.5.3 (Rayon). Le rayon ou le centre d’un graphe est l’excentricité minimale de ses
nœuds.
Définition 7.5.4 (Longueur moyenne de chemin). La longueur moyenne de chemin (en anglais
Average path length) d’un graphe est la distance moyenne du chemin le plus court. Ce qui équivaut,
en moyenne, au nombre d’étapes à franchir pour rejoindre un nœud à partir d’un autre nœud du
graphe. Le comportement de la longueur moyenne des plus courts chemins nous donne une idée
sur le comportement du réseau étudié. Cette métrique représente la moyenne, pour toutes les paires
de nœuds, des plus courts chemins.
Définition 7.5.5 (Diamètre moyen). Le diamètre moyen (en anglais Characteristic path length)
d’un graphe représente la même vision de la métrique longueur de chemin mais d’un point de vue
médiane.
Le graphique des sauts illustré dans la figure 7.17 nous donne l’information sur l’excentricité
du graphe condensé. Comme le graphe est modélisé de façon à ce que les arcs soient définis par
mois de l’année (year_month), on est censé analyser l’excentricité pour un mois donné. On a
choisi ainsi le mois de janvier de l’année 2016 (voir Figure 7.17). Ce graphique est obtenu de la
façon suivante : à partir d’un nœud x dans le graphe, on calcule un parcours en largeur (BFS) vers
tous les autres nœuds connectés à ce nœud dans le graphe, pour ce mois étudié. On suppose que
Ns (x) est le nombre de paires de nœuds connectés au nœud x avec s sauts. Ensuite, on répète
la même procédure pour tous les nœuds du graphe condensé et finalement, on fait la somme des
P
résultats pour trouver le nombre de paires de nœuds pour s sauts (Ns = x Ns (x)). Comme le
graphe contient 4 602 nœuds, on a calculé 21 173 802 paires de nœuds.
F IGURE 7.17 – Densité mensuelle du graphe condensé pour le mois de janvier 2016.
— Le rayon du graphe est 1. Cela veut dire que nous pouvons rejoindre un certain nombre de
nœuds avec un minimum d’un seul saut. Cela représente une fraction assez négligeable par
rapport aux autres sauts.
— Le diamètre du graphe est 14.
— Une partie importante de nœuds non joignables dans le graphe pour ce mois étudié à cause
du manque de données représente 38% du nombre total de paires de nœuds.
— La longueur moyenne de chemin et le diamètre moyen sont environ 4 sauts. Cela veut dire
que 25% de paires de nœuds sont connectées avec 4 sauts.
Nous avons calculé la longueur moyenne de chemin en utilisant la formule 7.2. Nous avons
bien trouvé la valeur 4.
P
x6=y l∗ (x, y)
AV = (7.2)
n(n − 1)
où l∗ (x, y) est la longueur du plus court chemin entre x et y. n est le nombre de nœuds du
graphe.
En Neo4j, on peut faire une requête Cypher qui calcule le diamètre du graphe. Nous avons
commencé par tester la requête proposée dans la littérature [Hölsch et al., 2017]. Les auteurs pro-
posent d’analyser la performance des requêtes d’analyse d’un graphe sur la base de données orien-
tée graphe Neo4j et une base de données SQL (voir la requête du listing 7.22). Cette requête tient
compte de tous les mois du graphe (ligne 1). On rappelle qu’un arc dans le graphe condensé re-
présente un mois de l’année. Ce qui va renvoyer un chemin avec plus d’un mois de données quand
la paire de nœud n’est pas connectée pour ce mois-ci. Or, c’est irréalisable qu’un passager fasse
un chemin sur plusieurs mois qui ne sont même pas consécutifs. La fonction shortestpath()
représente dans Neo4j l’algorithme de BFS (voir le chapitre 4).
1 MATCH p = shortestpath((n)-[*]-(m))
2 WITH p LIMIT 400000000
3 RETURN p, LENGTH(p)
4 ORDER BY LENGTH(p) DESC
5 LIMIT 1
Listing 7.22 – requête pour le calcul du diamètre proposé dans l’article Hölsch et al. [2017]
Ainsi, nous avons adopté la requête du listing 7.22 à notre cas (voir la requête du listing 7.23).
1 MATCH p = shortestpath((n)-[:‘2016-01‘*]-(m))
2 WITH p LIMIT 400000000
3 RETURN p, LENGTH(p)
4 ORDER BY LENGTH(p) DESC
5 LIMIT 1
La requête met des heures pour calculer uniquement le diamètre. En analysant la structure de
la requête, nous avons constaté qu’il y a des calculs redondants des plus courts chemins à cause
de la syntaxe (n)-[:‘2016-01‘*]-(m), cette syntaxe inclut les 4 cas suivants :
7.5 – Analyse structurelle du réseau aérien 193
D’après le tableau 7.12, on constate que le cas 1 correspond au cas 4 et le cas 2 n’est autre que
le cas 3. Ainsi, la requête calcule les plus courts chemins pour (46022 ) × 2 = 42 356 808 paires.
Pour remédier à ce problème, il faut ajouter la direction et une clause qui calcule le plus court
chemin entre une origine différente de la destination, ce qui revient à 4 602 × 4 601 = 21 173 802
paires (voir la requête du listing 7.24).
La requête met a peu près 30 minutes pour calculer uniquement le diamètre. Pour calculer
également l’excentricité pour une période quelconque, nous avons écrit un programme en Java
(l’ensemble des librairies de Neo4j étant écrites en Java). Le script met, ainsi, 2 fois moins de
temps que la requête.
Nous avons procédé à une comparaison avec les anciennes données en choisissant la même
période que dans l’analyse de densité. On constate les points suivants :
— Le diamètre de l’ancien graphe pour le mois janvier est 14 (courbe verte de la figure 7.18) ;
— le diamètre est faible pour certains mois, ce qui explique qu’on a plus de données notam-
ment, les mois de haute saison comme juillet et août.
— le diamètre maximal du graphe est 14 contre 15 pour les anciennes données.
194 C HAPITRE 7 — Modélisation du réseau aérien
F IGURE 7.18 – Comparaison du diamètre mensuel avec les anciennes données. oData désigne
les anciennes données, et nData les nouvelles données.
7.6.1 Connexité
Dans un réseau petit-monde, il y a une grande probabilité qu’il existe une composante domi-
nante du graphe dont la taille est une fraction de n. Nous avons montré que la composante la plus
dominante contient 3 551 aéroports (80% des aéroports connectés). En outre, il existe d’autres
composantes qui ont des tailles très petites de l’ordre de log(n).
7.6.2 Densité.
Dans ce cas, la distribution des degrés connaîtra une croissance significative. Ce genre de réseau a
tendance à croître exponentiellement. Or, la densité calculée pour notre graphe condensé montre
un comportement assez étrange. Cela est dû au manque de données.
Avec le calcul de la distribution des degrés du graphe condensé, nous avons remarqué la pré-
sence de plusieurs nœuds avec moins de liens et peu de hubs avec un grand nombre de liens. Un
tel réseau est appelé, dans la théorie des réseaux complexes, réseau invariant d’échelle (en anglais
Scale-free) [Chakrabarti and Faloutsos, 2006]. Un tel graphe est caractérisé par la présence des
points aberrants.
7.6.4 Diamètre.
Une autre métrique liée à l’excentricité est la notion de diamètre effectif. Cette notion est défi-
nie par le nombre minimum de sauts à partir duquel une certaine fraction de paires de nœuds (soit
90%) est connectée [Kang et al., 2010]. Cette métrique permet de suivre l’évolution du graphe.
Dans notre cas, notre réseau n’a pas de diamètre effectif comme il n’y a pas 90% de paires de
nœuds connectées avec un certain saut du fait qu’il n’est pas connexe. Cela paraît insensé car un
réseau aérien est supposé être connecté. Mais il ne faut pas oublier que les données viennent du
monde réel avec un pourcentage important de données manquantes.
Ainsi, nous avons continué à analyser l’excentricité du graphe mais sur l’année complète 2016,
de 2016-01 à 2016-12 (voir la Figure 7.18). Le graphique nous montre des pics sur certaines
périodes. Pour certains mois comme les mois 2016-07 et 2016-08, nous remarquons qu’ils ont
un diamètre moins élevé que les autres. Cela est tout à fait normal, le diamètre par sa définition
ayant tendance à diminuer quand le réseau est plus connecté. C’est le cas de la saison d’été où il y
a plus de vols dans le réseau aérien. Comme un tel réseau a tendance à croître avec le temps, nous
devons voir le diamètre diminuer avec le temps. Les facteurs pouvant expliquer cette évolution
bizarre constatée dans la figure 7.18 [Leskovec et al., 2005] sont :
— des données manquantes ;
— le graphe n’est pas connexe, cela est traduit par la présence de plus d’une composante
connexe ;
— le diamètre effectif.
On se place sur le premier facteur qui influence directement les autres facteurs. En effet, le
comportement bizarre de l’évolution du diamètre à travers le temps est traduit par le manque de
données ce qui explique que le diamètre effectif dans ce cas est nul quand le graphe n’est pas
connexe.
rithme a besoin de choisir des nœuds intermédiaires "hubs". Dans notre cas, les nœuds représentent
les aéroports et nous choisissons les "hubs" suivant les critères métiers discutés avec Milanamos
(voir la section 7.6.5.2) qui doivent respecter les contraintes suivantes :
— au moins 50% des compagnies LCC présentes ;
— au minimum 10 millions de passagers qui transitent ;
— présence du moyen/long courrier.
Un vol moyen courrier est un vol qui dure en moyenne 3 heures. Alors que le long courrier
dure 6 heures.
7.6.5.1 Méthodologie
Description de la méthode
Source de données
7.6.5.2 Métriques
1 MATCH (n:Airport)
2 RETURN n.country AS pays, n.region AS region
La requête du listing 7.26 renvoie les aéroports ayant au moins un vol d’une durée de 3 heures.
1 MATCH (n:Airport)-[r]-()
2 WHERE r.duration_min>=180
3 RETURN DISTINCT n.code
Listing 7.26 – requête pour trouver les aéroports qui ont moyen et long courrier
1 MATCH (n:Airport)-[r]->(m:Airport)
2 WITH n.code AS airp, type(r) AS relType, count(m) AS nbrDest
3 RETURN airp, Min(nbrDest) as minD, Max(nbrDest) as maxD
La requête du listing 7.28 renvoie la liste des compagnies aériennes ayant des vols au départ
de chaque aéroport pour tous les mois du CFN (24 mois).
1 MATCH(n:Airport)-[r]->(m:Airport)
2 UNWIND r.airlines AS air
3 WITH COLLECT(DISTINCT air) AS airlList, n
4 RETURN n.code, airlList
Listing 7.28 – requête pour trouver la liste des compagnies aériennes en Cypher
7.6.5.4 Résultats
En analysant le résultat, nous avons constaté qu’il y a seulement 337 aéroports sur 4 602 (soit
7%) fournis par Wikipédia. Pour des grands aéroports, notamment, l’aéroport Charles-De-Gaulle
à Paris/France (CDG) et Londres Heathrow à Londres/Royaume-Uni (LHR), la Présence des com-
pagnies LCC ne dépasse pas 25%, ce qui paraît peu. On savait que le manque des données sur les
LCCs impactera le calcul de cet index (voir la section 6.3.6).
Dans la majorité des cas, il y a un grand écart entre le nombre minimum et maximum de
destinations.
Conclusion.
L’analyse du graphe nous a aidé à mieux comprendre et identifier les entités manquantes sur
les données. Cela n’aurait pu être le cas avec la base de données optimode. En effet, comme les
données sont stockées de façon redondante et dans plusieurs endroits différents, la tâche aurait été
compliquée pour arriver à cette analyse.
C HAPITRE 8
Sélection des marchés
Dans ce chapitre, nous définissons le problème FRP dans le cadre de la sélection des
marchés, qui consiste à déterminer les marchés représentant des opportunités écono-
miques pour une compagnie aérienne. Tout d’abord, nous commençons par formuler le
problème et étudier ses propriétés. Ensuite, nous exposons différentes méthodes de réso-
lution du FRP. La première méthode repose sur les requêtes de Cypher et la deuxième
méthode est basée sur des algorithmes de plus courts chemins. Dans ce contexte, nous
proposons de comparer quatre algorithmes : deux algorithmes qui décomposent le FRP
en problèmes de plus court chemin et les résolvent en parallèle avec les algorithmes
de Dijkstra et Bellman ; le troisième algorithme est une extension de l’algorithme
Dijkstra couplé à des techniques d’accélération pour éviter les calculs inutiles ; le
quatrième algorithme étend l’algorithme de Bellman pour calculer tous les plus courts
chemins pour toutes les directions et tous les critères à la fois. Ces quatre algorithmes
effectuent un calcul en parallèle lorsque cela est possible. Puis, nous décrivons le pro-
tocole d’expériences menées dans le cadre du test de ces algorithmes. Enfin, nous ana-
lysons les principaux résultats.
199
200 C HAPITRE 8 — Sélection des marchés
Exemple 8.1.1 (Exemple de motivation). L’exemple de la figure 8.1 représente une capture
d’écran du module Flight Simulator. Dans l’exemple, l’application renvoie tous les aéroports vis-
à-vis de l’origine Nice/France (NCE) et la destination Bangkok/Thaïlande(BKK). Par exemple sur
la figure, le trajet Nice-Bangkok-Dubaï n’est pas une alternative réaliste pour relier Nice à Dubaï
puisqu’il existe un trajet reliant cette paire d’aéroports en passant par l’aéroport Paris-Charles-
De-Gaulle/France(CDG) qui est plus rapide et moins cher. Et donc, le trajet Nice-Bangkok-Dubaï
représente une part de marché négligeable. Ce qui revient de dire que les passagers qui voyagent
entre Nice et Dubaï ne seront pas intéressés par le vol entre Nice et Bangkok. En revanche, les
passagers qui voyagent entre Nice et Pékin, seront potentiellement intéressés par passer par le vol
Nice - Bangkok pour aller à leurs destinations finales. C’est ainsi que le marché définit par la paire
d’aéroports Nice & Pékin est un marché prometteurs centré sur le vol Nice-Bangkok. Toutefois,
celui du Nice & Dubaï ne l’est pas.
F IGURE 8.1 – Capture d’écran du module Flight Simulator de l’application PlanetOptim. Les
aéroports barrés représentent des aéroports dont les routes ne correspondent pas à des itinéraires
réalistes. Les couleurs des aéroports correspondent à leurs localisations suivant la boussole.
202 C HAPITRE 8 — Sélection des marchés
C’est dans le cadre de la sélection des marchés que nous avons défini le problème FRP, qui
permet de déterminer un sous-graphe de parts de marchés non négligeables. Ceci permet d’amé-
liorer la visualisation et accélérer les calculs des parts de marchés face aux alternatives existantes
en termes de flux des passagers, mais pas face aux concurrences.
Les solutions de ce problème ne se restreint pas au problème de 2-hops qui consiste à trouver les
chemins à une seule escale partant d’un aéroport dans un réseau aérien (voir la section 5.1.4). Mais
il est plutôt lié au problème de développement des routes qui consiste à déterminer les routes qui
présentent des opportunités économiques pour la compagnie aérienne afin de l’inclure dans son
réseau (voir le chapitre 3).
Plus formellement, le problème FRP est défini sur le réseau aérien condensé (CFN) et consiste
à identifier un sous-réseau de routes vis-à-vis d’un nouveau vol suivant certains critères, comme
le temps et le coût. En effet, le problème revient à déterminer un sous-graphe maximal, en termes
de nœuds, dans lequel au moins un chemin valide passe par chaque nœud. Un chemin valide est
un chemin qui passe par l’arc entre l’origine et la destination en limitant, par exemple, la perte de
temps ou le surcoût par rapport aux meilleurs chemins.
Définition 8.1.1 (Regret). Dans la théorie de la décision, la notion de regret est définie comme
étant le manque à gagner en ne prenant pas la bonne décision. Par exemple pour notre problème,
la décision porte sur les vols.
8.1 – Présentation du Flight Radius Problem 203
Définition 8.1.2 (Contrainte de regret). Nous définissons la contrainte de regret Rod (i, j) d’un
chemin entre i et j passant par l’arc (o, d) dans le cas multicritère de ces façons :
+
Rod (i, j) = l(i, j) ≤ l⋆ (i, j) + K (8.1)
∗
Rod (i, j) = l(i, j) ≤ l⋆ (i, j) ∗ K (8.2)
Où l⋆ (i, j) est la longueur du plus court chemin de i à j tandis que l(i, j) est la longueur du
chemin passant par l’arc (o, d). Ce qui signifie qu’on vérifie que la longueur du chemin entre i et
j qui passe par l’arc (o, d) est inférieure à celle du plus court chemin entre le couple (i, j) à une
constante près K qui représente le coût supplémentaire acceptable. La contrainte de regret peut
être modélisée de deux façons :
— Cas additif (voir l’équation 8.1) : la constante K est positive et indépendante du chemin
considéré ;
— Cas multiplicatif (voir l’équation 8.2) : la constante K est souvent représentée par un pour-
centage qui dépend du plus court chemin entre i et j et est supérieure ou égale à 1.
La contrainte de regret R est définie pour chaque critère (temps, coût ou distance). C’est une
contrainte booléenne qui est vraie pour le couple (i, j) si et seulement s’il existe un chemin entre
i et j passant par l’arc (o, d) et satisfait cette contrainte.
On notera Rod
k (i, j) la composante de la contrainte R (i, j)pour le critère k.
od
Définition 8.1.3 (Chemin valide). Un chemin valide entre i et j est un chemin qui satisfait une
contrainte de regret pour au moins un critère. Il peut exister plus de chemins valides entre i et j.
Définition 8.1.4 (Nœud supporté). On dit qu’un nœud est supporté s’il existe au moins un chemin
valide partant ou arrivant à ce nœud dans le graphe pour un critère.
Définition 8.1.6 (Efficace). Les solutions qui dominent les autres, mais ne se dominent pas entre
elles sont appelées solutions efficaces ou non dominées.
Définition 8.1.7 (Front de Pareto). Le front de Pareto représente l’ensemble des solutions opti-
males qui sont non dominées.
Définition 8.1.8 (Idéal). Le point idéal correspond aux meilleures valeurs obtenues pour chaque
critère, cela permettra d’obtenir une borne inférieure pour les solutions du front de Pareto.
Définition 8.1.9 (Nadir). Le point nadir correspond aux pires valeurs obtenues pour chaque cri-
tère, cela permettra d’obtenir une borne supérieure pour restreindre l’espace de recherche.
Ces notions sont illustrées dans la figure 8.2. Comme le montre la figure, les domaines ha-
churés correspondent aux solutions supportées du FRP étant donné deux critères k1 et k2 . En
effet, nous avons introduit les solutions supportées pour deux raisons : facilité de calcul et prise en
compte de plusieurs profils d’usagers. La figure nous permet de mieux situer la notion du regret
par rapport aux autres notions de l’optimisation multicritère.
Critère 2
Solution supportée
Point nadir
Solution dominée
k2
Fro
nt
Point non réalisable de
Pa
re to
Point idéal
k1 Critère 1
F IGURE 8.2 – Illustration des solutions supportées du FRP.
1. On utilise le terme dominée au lieu du terme supportée pour ne pas confondre avec les solutions du FRP, qui
sont dites solutions supportées.
8.1 – Présentation du Flight Radius Problem 205
8.1.4 Formulation
Étant donné un graphe, la question est de décider s’il est intéressant de passer par un vol pour
aller d’un aéroport i à un aéroport j. Le vol est représenté par un arc (o, d) dans le graphe condensé
CFN tel que o, d ∈ X . L’arc (o, d) peut ne pas exister dans le graphe.
Plus précisément, la question est de trouver toutes les paires d’aéroports (i, j) telles que passer
par l’arc (o, d) permettra aux passagers de faire des trajets qui ne sont pas trop longs ou trop chers
par rapport aux meilleurs itinéraires possibles. Nous nous intéressons alors à la récupération de
tous les chemins passant par l’arc (o, d) qui pourraient être valides selon le regret défini pour
chaque critère.
La contrainte de regret R est introduite pour modéliser les différentes préférences des pas-
sagers. En pratique, il y a plusieurs critères à considérer mais les trois critères principaux sont :
temps, coût et distance.
De manière formelle, le problème est défini de la façon suivante [Idrissi et al., 2017] :
Entrée Un graphe G = (X , U, W), un arc (o, d) et une contrainte de regret R.
Sortie Un sous-graphe maximal, en termes de nœuds, G′ = (A, V) tel que A ⊆ X et
chaque nœud supporte un chemin valide, i.e. passant par l’arc (o, d) et satisfait la
contrainte de regret R.
8.1.5 Propriétés
Le problème FRP a pour objectif de trouver des chemins passant par l’arc (o, d) qui ne sont
pas trop longs ou trop chers que le plus court chemin. Plus précisément, voyager de i ∈ X à j ∈ X
en passant par l’arc (o, d) est intéressant si et seulement si le chemin {i, .., o, d, .., j} entre i et j
satisfait la contrainte de regret R. La satisfaction de la contrainte dépend du plus court chemin
entre i et j (voir la figure 8.3).
w(o, d) l ∗(
) o d
i, o d, j
l∗ ( )
l∗ (i, j)
i j
F IGURE 8.3 – Décomposition d’un chemin. L’arc en couleur rouge représente l’arc étudié (o, d).
L’arc en pointillé représente le plus court chemin.
On remarque que la recherche des chemins valides peut être restreinte à la recherche des plus
courts chemins valides à partir de o et arrivant à d (voir l’inégalité 8.3) :
Comme nous avons prouvé que la recherche des chemins valides peut être restreinte à une
recherche des plus courts chemins, cela permet d’établir les trois propriétés suivantes pour le
problème de FRP.
Propriété 8.1.1. Dans le cas additif, si K est positif ou nul dans l’inégalité 8.1 alors tout plus
court chemin est un chemin valide.
l(i, j) ≤ l⋆ (i, j)
Comme le plus court chemin est unique, en termes de longueur, alors le chemin allant de i à j
et passant par l’arc (o, d) est forcément un plus court chemin.
Il est à noter que dans le cas négatif, il n’existe pas de solution.
Propriété 8.1.2. Dans un graphe G = (X , U, W), soit P un plus court chemin de i vers d en
passant par o. Alors le sous-chemin de P de i vers o, noté P ′ est un plus court chemin de i vers
o [Ahuja et al., 1993] (voir la figure 8.4).
P′
i o d
Q
F IGURE 8.4 – Preuve de la propriété 8.1.2.
Démonstration.
l⋆ (P ) ≤ l(Q) + w(o, d)
l⋆ (i, o) + ✘
w(o,
✘✘ ✘ ≤ l(i, o) + w(o,
d) ✘✘ ✘
✘
d)
l⋆ (i, o) ≤ l(i, o)
l⋆ (P ′ ) ≤ l(Q) (8.4)
Donc P ′ est un plus court chemin de P .
La propriété 8.1.2 implique la propriété suivante 8.1.3.
Propriété 8.1.3. Tout sous-chemin d’un chemin valide passant par l’arc (o, d) est un chemin
valide.
En effet, on sait que tout sous-chemin d’un plus court chemin est un plus court chemin (voir
la propriété 8.1.2). Cela vient du fait que le plus court chemin satisfait la propriété de l’inégalité
triangulaire (voir la preuve 8.1.5).
Démonstration.
8.1 – Présentation du Flight Radius Problem 207
Soit {i, ..., o, d, ..., j} un chemin valide, c’est-à-dire que c’est un chemin qui satisfait la
contrainte de regret.
l⋆ (i, j) ≤ l(i, j) + K
l⋆ (i, o) + w(o, d) + l⋆ (d, j) ≤ l⋆ (i, j) + K
l⋆ (i,
✘ ✘✘ ✘ + w(o, d) + l⋆ (d, j) ≤ l⋆ (i,
o) ✘✘✘
✘ + l⋆ (o, j) + K
o)
w(o, d) + l⋆ (d, j) ≤ l⋆ (o, j) + K
−−→
Rod (j) = l(o, j) ≤ l⋆ (o, j) + K (8.5)
8.1.6 Exemple
L’exemple de la figure 8.5 présente le graphe modélisant l’exemple de motivation 8.1.1 (voir la
figure 8.1). Les données dans ce graphe correspondent aux données réelles de la base optimode.
L’exemple est fait pour un seul critère, le coût avec un regret de K = 100$, les entrées et les
sorties du problème FRP sont illustrées :
1. l’arc étudié (o, d) est représenté par la couleur rose ;
2. les nœuds en trait plein et en vert représentent le graphe G ;
3. les nœuds et les arcs pointillés en couleur verte forment les nœuds supportés et les chemins
valides du sous-graphe en sortie G′ .
Par exemple, le nœud correspondant à l’aéroport de DXB appartient au graphe G′ puisqu’il
existe un chemin valide partant de l’aéroport de NCE et arrivant à l’aéroport de DXB avec une
correspondance à l’aéroport de BKK, qui satisfasse la contrainte de regret.
208 C HAPITRE 8 — Sélection des marchés
ESB
GLA 75 DXB
85
IST 5
210 37
150
LHR
150
170
100 5
70 CDG 37
100
100
150
ICN
485
150 170
170
360
800
485
LIS 360
105
425 GUM
5
10
CMN
NBO FNC DOH 75
425
465 270 270
75 KWI
ABJ
Pour résoudre le FRP, nous avons proposé différentes méthodes de résolution. La figure 8.6
illustre l’arborescence des méthodes de résolution. La première méthode repose sur les requêtes de
Cypher, étant donné que le graphe est stocké dans la base de données orientée graphe Neo4j. Ces
requêtes utilisent uniquement des fonctions disponibles dans Neo4j (la librairie APOC, voir la
section 5.6.4), notamment l’algorithme Bidirectionnel de Dijkstra de recherche du plus
court chemin entre deux nœuds (voir la section 5.6). En effet, la variante Bidirectionnel
était la seule variante implémentée de l’algorithme Dijkstra en Neo4j au début de ce travail
de thèse (voir le chapitre 5).
Ensuite nous avons opté pour une approche algorithmique, nous avons ainsi proposé deux
catégories d’algorithmes. La première catégorie décompose le FRP en problèmes de plus courts
chemins et les résout en parallèle avec les algorithmes de Dijkstra ou Bellman. Nous avons
choisi Bellman comme deuxième algorithme de plus court chemin car il peut être rapide si les
plus courts chemins n’ont pas beaucoup d’arcs ; c’est le cas des réseaux aériens. La deuxième
catégorie est basée sur l’accélération. Le premier algorithme est une extension de l’algorithme
Dijkstra couplé à des techniques d’accélération pour éviter les calculs inutiles ; le deuxième
algorithme étend l’algorithme de Bellman pour calculer tous les plus courts chemins pour toutes
les directions et tous les critères à la fois. Tous ces algorithmes effectuent un calcul en parallèle
lorsque cela est possible.
Méthodes de résolution
FRP
F IGURE 8.6 – Schéma des méthodes de résolution du FRP. Dir. est pour direction et Cri. est pour
critère.
Le tableau 8.2 présente les noms des cinq méthodes proposées pour résoudre le problème de
FRP.
210 C HAPITRE 8 — Sélection des marchés
Nom Désignation
APOC basée sur les requêtes Cypher
DCP_Dij décomposition basée sur Dijkstra
DCP_Bel décomposition basée sur Bellman
SEQ_Dij algorithme séquentiel basé sur Dijkstra
SEQ_Bel algorithme séquentiel basé sur Bellman
La deuxième clause WITH permet d’agréger les sorties de la première procédure. En effet, les
opérations en Cypher s’exécutent par ligne. Une ligne représente un résultat comme dans une
requête SQL. Cela veut dire que le résultat d’une clause est l’entrée de la clause suivante. C’est
réellement la taille du résultat qui détermine le nombre d’appels de la prochaine procédure. Le bloc
final (lignes 7 à 9) commence par une clause UNWIND pour désagréger les précédentes sorties que
nous avons agrégées dans la ligne 5. La dernière clause WITH filtre l’ensemble des chemins suivant
la contrainte de regret. À la fin, la clause RETURN renvoie les aéroports supportés.
1 MATCH p=(Td:Destination)-[:CONNECT_TO]->(To:Origin{code:{o_code}})-[r]->(d:
Destination{code:{d_code}}),(A:Destination)
2 WHERE NOT A IN [d,Td] AND type(r) = {rel_type}
3 WITH r.duration_min-{regret} AS LB,To,d,A
4 CALL apoc.algo.dijkstra(To,A,{rel}+’>|CONNECT_TO>’,{criterion}) YIELD path AS
p1,weight AS w1
5 WITH DISTINCT A,collect(w1) AS W1,LB,d
6 CALL apoc.algo.dijkstra(d,A,{rel}+’>|CONNECT_TO>’,{criterion}) YIELD path AS p2
, weight AS w2
7 UNWIND W1 AS w1
8 WITH w1-w2 AS diff,LB,A WHERE diff>=LB
9 RETURN DISTINCT A
Listing 8.1 – résolution avec une requête Cypher pour un seul critère
8.3.2.2 Explications
Recherche de l’arc étudié
Dans le CFN, nous avons inséré pour chaque aéroport deux terminaux corres-
pondant aux départs (Origin) et aux arrivées (Destination) (voir la figure 7.4).
L’arc étudié (o, d) correspond ainsi dans le graphe condensé au pattern suivant :
(To:Origin{o_code})-[r]->(d:Destination{code:{d_code}}).
Pour calculer les plus courts chemins entre tous les nœuds de types Origin aux nœuds types
Destination, il faut exclure le nœud correspondant au type Destination de l’aéroport o
(ligne 2). Cela permettra d’éviter les cycles (voir la figure 8.7). Le pattern recherché devient ainsi
(ligne 1) :
(Td:Destination)-[:CONNECT_TO]->(To:Origin{o_code})-[r]
->(d:Destination{code:{d_code}})
O
t
bo
_a
ar
ht
d_
ig
a
al
connect_to
Td To
Démarches de calculs
212 C HAPITRE 8 — Sélection des marchés
Le critère choisi est le temps duration_min. D’après la contrainte de regret 8.7, on com-
mence par calculer les membres connus de la contrainte (ligne 3), la nouvelle variable est LB.
Ensuite on applique l’algorithme depuis l’origine o vers toutes les destinations A en tenant compte
des deux types d’arcs :
1. CONNECT_TO, pour le transfert entre les terminaux.
2. rel, le year_month choisi.
L’algorithme renvoie une liste des chemins avec leurs longueurs qu’on stocke dans la collec-
tion W1 : cette valeur correspond à la valeur l⋆ (o, j). On répète le même algorithme depuis la
destination d vers toutes les destinations A (ligne 6). En effet, il faut inclure le temps de transfert à
l’aéroport destination de l’arc (o, d).
Finalement la ligne 8 permet d’évaluer les chemins suivant la contrainte de regret pour le
critère 1 :
w1 (o, d) + l1⋆ (d, j) ≤ l1⋆ (o, j) + K1
On peut réécrire cette contrainte de telle sorte qu’on regroupe les termes fixes d’un coté et
d’un autre coté les termes variables :
Bidirectionnel depuis d
L ← [(o, i, Wo ), (d, i, Wd )]
L vide ?
non
contrainte non
regret
oui
Ajouter i à la liste des nœuds supportés A
Renvoyer la liste A
oui
8.4 Méthodes basées sur les algorithmes des plus courts chemins
D’après l’analyse de la complexité et le résultat des expériences pour la méthode APOC, cette
dernière prend trop de temps et de mémoire, car de nombreux calculs sont répétés. Nous avons
ainsi proposé plusieurs algorithmes basés sur des algorithmes de plus courts chemins.
Dans cette section, nous présentons quatre algorithmes pour résoudre le FRP. Les deux pre-
miers algorithmes se basent sur une décomposition du FRP en des problèmes de plus court che-
min et procèdent en résolution en parallèle les directions et les critères en utilisant l’algorithme
Dijkstra ou Bellman.
Le troisième algorithme étend l’algorithme de Dijkstra avec plus d’accélérations en évitant
les calculs inutiles. Le quatrième algorithme étend l’algorithme de Bellman pour calculer tous
les plus courts chemins pour tous les critères en une seule fois. Ce dernier algorithme entraîne une
augmentation de la mémoire nécessaire puisque les processeurs accèdent tous en même temps à la
mémoire.
Nous proposons ainsi de combiner l’exécution en séquentiel et en parallèle pour optimiser le
temps d’exécution et la consommation de la mémoire. Ces algorithmes effectuent des calculs en
parallèle quand c’est possible. Tous les algorithmes ont les mêmes entrées et sorties [Idrissi. et al.,
2019].
Pour des raisons de simplicité, les algorithmes renvoient l’ensemble des nœuds supportés
et s’occupent du stockage des parents des nœuds supportés. En pratique, les algorithmes ren-
voient également l’union des arbres supportés pour chaque direction et critère. En se basant sur
les contraintes de regret, définissons :
(
w(o, d) + l⋆ (d, i) ≤ l⋆ (o, i) + K si (dir = sor)
R(i, dir, w) = ⋆ ⋆
w(o, d) + l (o, i) ≤ l (d, i) + K si (dir = ent)
ESB
GLA 75 DXB
85
IST 5
210 37
150
LHR
150
170
100 5
70 CDG 37
100
150
ICN
485
150 170
360
800
485
CMN
NBO FNC DOH 75
425
465 270 270
75 KWI
ABJ
F IGURE 8.9 – Graphe avec les arbres des plus courts chemins depuis l’origine
216 C HAPITRE 8 — Sélection des marchés
La deuxième étape consiste à calculer les arbres des plus courts chemins depuis la destination
BKK dans les deux directions (voir la figure 8.10). L’arbre des PCC pour la direction entrante est
en couleur verte tandis que la couleur bleue est pour la direction sortante.
ESB
GLA 75 DXB
85
IST 5
210 37
150
LHR
150
170
100 5
70 CDG 37
100
100
150
ICN
485
150 170
170
360
485
CMN
NBO FNC DOH 75
425
465 270 270
75 KWI
ABJ
F IGURE 8.10 – Graphe avec les arbres des plus courts chemins depuis la destination.
La prochaine étape consiste à vérifier pour chaque nœud du graphe de départ pour chaque
direction et chaque critère s’il satisfait la contrainte de regret 8.5 (ligne 5-7 de l’algorithme 5).
Le graphe de la figure 8.11 illustre la solution obtenue. Les nœuds en couleur verte (respec-
tivement bleue) représentent ceux qui sont supportés pour la direction entrante (respectivement
sortante). On trouve la même solution calculée par l’algorithme 8.4.2.1 (voir la figure 8.15).
Les nœuds DOH et KWI ne sont pas supportés car ce n’est pas intéressant de faire un détour
par NCE-BKK pour un regret de 100$.
La majorité des nœuds sont supportés car le fait de passer par NCE-BKK reste le seul chemin
pour rejoindre BKK. D’où l’idée de l’algorithme 8.4.2.1 qui est basé sur le lemme 8.1.1.
8.4 – Méthodes basées sur les algorithmes des plus courts chemins 217
ESB
GLA 75 DXB
85
IST 5
210 37
150
LHR
150
170
100 5
70 CDG 37
100
100
150
ICN
485
150 170
170
360
800
485
LIS 360
105
425 GUM
5
10
CMN
NBO FNC DOH 75
425
465 270 270
75 KWI
ABJ
Explication de l’algorithme
Tout d’abord, nous commençons par considérer un seul critère et ensuite on passe au deuxième
en utilisant à chaque étape les sorties de l’étape précédente. Ainsi, l’algorithme commence par
calculer l’arbre du plus court chemin depuis l’origine et vérifie si l’arc (o, d) existe dans cet arbre.
Un tel chemin est considéré comme un chemin valide d’après le lemme 8.1.1. En effet, nous devons
commencer par l’origine comme nous sommes centrés sur l’arc (o, d). L’algorithme s’arrête quand
tous les nœuds ont été traités.
218 C HAPITRE 8 — Sélection des marchés
Après avoir trouvé l’arbre du plus court chemin depuis o et déterminé la présence des chemins
valides grâce au lemme 8.1.1, nous passons au calcul de l’arbre du plus court chemin depuis
la destination d pour pouvoir vérifier la contrainte de regret pour les nœuds restants. Un cas de
figure se présente : les chemins passant par le nœud de l’origine o qu’on néglige. En effet, selon
la propriété du problème FRP, nous sommes intéressés par les chemins qui ne passent pas par
l’origine (voir l’arbre à gauche en bas (2) de la figure 8.12).
Pour vérifier la contrainte de regret, nous l’intégrons au fur et à mesure dans le calcul de
borne. À chaque itération, l’algorithme scanne le nœud ayant le poids minimum et puis relâche
ses successeurs. Finalement, on vérifie pour chaque nœud s’il satisfait la contrainte de regret avant
de scanner ses successeurs. S’il ne la satisfait pas, on passe au prochain dans la file. En effet, on
exploite le fait que Dijkstra cherche le plus court chemin dans un ordre croissant de distance.
Avec cette manière, nous éliminons facilement les nœuds qui ne sont pas supportés. À la fin de
cette étape, nous obtenons deux informations, la longueur du plus court chemin l1⋆ (d, j) pour
le premier critère que nous avons utilisé pour la vérification de la contrainte de regret et une
borne supérieure pour le deuxième critère l2 (d, j). Cette étape est illustrée par l’arbre (3) de la
figure 8.12.
Une fois que nous avons déterminé l’ensemble des nœuds supportés, si tous les nœuds du
graphe ont été traités alors l’algorithme s’arrête. Sinon, nous passons au deuxième critère pour les
nœuds qui ne sont pas supportés.
Inclus
o (2) d
(1) Exclu
Critère 1 Critère 1
V Vns , l1⋆ (o, j)
d o
l1⋆ (d, j)
l1⋆ (o, j)
l2 (d, j)
(3) o (4) d
Critère 2 Critère 2
V, l2 (d, j) Vns , l2⋆ (o, j)
d o
l2⋆ (d, j) V′
F IGURE 8.12 – Étapes de l’algorithme basé sur l’algorithme de Dijkstra. La partie gauche de
chaque arbre représente les entrées à chaque itération, alors que la partie droite les sorties. L’éti-
quette "Exclu" correspond à l’ensemble des nœuds qui seront exclus dans la prochaine itération.
Nous répétons le même processus pour le deuxième critère. La troisième étape (voir l’étape 3
dans la figure 8.12) est similaire à la première étape. Une fois que l’arbre du plus court chemin
8.4 – Méthodes basées sur les algorithmes des plus courts chemins 219
depuis l’origine pour le deuxième critère est calculé, nous utilisons la borne supérieure calculée
dans l’étape précédente pour vérifier la contrainte de regret. Comme c’est une borne supérieure,
alors, si la contrainte de regret est vérifiée pour cette borne, elle sera vérifiée pour la valeur du plus
court chemin pour ce critère :
Pseudo-code de l’algorithme
Dans cette section, nous allons montrer un exemple d’application de l’algorithme proposé
pour la preuve de concept. Considérons l’exemple d’un graphe représentant un réseau réel de vols
(voir la figure 8.13) : 17 nœuds présentant des aéroports et 33 arcs qui correspondent aux vols. Ce
graphe correspond au graphe du problème 2-hops (voir la figure 5.1 du chapitre 5).
On suppose qu’une compagnie aérienne souhaite ajouter un nouveau vol entre NCE et BKK qui
est représenté par un arc rouge en pointillé dans la figure 8.13. Les étiquettes correspondent aux
prix des vols. Le graphe est extrait de l’application PlanetOptim.
Par la suite, nous allons présenter le déroulement de l’algorithme pour un seul critère (temps)
et pour une seule direction (sortante). On suppose qu’on a un regret de (K = 100$) concernant ce
critère. L’algorithme, ainsi, se déroulera en trois étapes :
1. calcul des plus courts chemins depuis l’origine ;
8.4 – Méthodes basées sur les algorithmes des plus courts chemins 221
arc étudié
ESB
GLA 75 DXB
85
IST 5
210 37
150
LHR
150
170
100 5
70 CDG 37
100
100
150
ICN
485
150 170
170
360
800
485
LIS 360
105
425 GUM
5
10
CMN
NBO FNC DOH 75
425
465 270 270
75 KWI
ABJ
La figure 8.14 illustre le graphe obtenu après avoir appliqué l’algorithme de Dijkstra depuis
le nœud NCE sur le graphe présenté dans la figure 8.13. L’arbre des plus courts chemins à partir
de l’origine NCE est représenté en couleur marron. Le nœud NCE doublement cerclé correspond à
la racine de cet arbre.
222 C HAPITRE 8 — Sélection des marchés
ESB
GLA 75 DXB
85
IST 5
210 37
150
LHR
150
170
100 5
70 CDG 37
100
100
150
ICN
485
150 170
360
800
485
CMN
NBO FNC DOH 75
425
465 270 270
75 KWI
ABJ
F IGURE 8.14 – Graphe avec l’arbre du plus court chemin depuis l’origine en marron.
Ensuite, on vérifie si l’arc (NCE,BKK) existe dans cet arbre. Dans cette étape, on obtient
{ICN,GUM} comme l’ensemble des nœuds supportés. Ainsi, il nous reste l’ensemble des autres
nœuds du graphe. Pour ce faire, nous avons besoin du coût minimum depuis la destination BKK
vers ces nœuds.
ESB
GLA 75 DXB
85
IST 5
210 37
150
LHR
150
170
100 5
70 CDG 37
100
100
150
ICN
485
150 170
170
360
485
CMN
NBO FNC DOH 75
425
465 270 270
75 KWI
ABJ
F IGURE 8.15 – Graphe avec l’arbre du plus court chemin depuis la destination en bleu.
Ainsi, pour chaque critère, l’algorithme de Dijkstra est appelé quatre fois. Comme nous
avons trois critères, alors l’algorithme sera appelé 12 fois. D’une manière générale, si on a m
critères alors l’algorithme sera appelé 4 ∗ m fois.
En termes de complexité, l’algorithme fait appel à l’algorithme de Dijkstra dans les pires
cas quatre fois dans le cas du bi-critère. Les optimisations nécessitent plus de temps donc nous
avons proposé de nous baser sur cet algorithme pour résoudre le problème FRP dans le cas gé-
néral. Cette généralisation tient compte de plus de deux critères avec la possibilité de paralléliser
par direction, le processus étant le même. Cela permet de ne pas garder toutes les propriétés de
l’algorithme pour exclure les dépendances.
8.5 Expériences
Cette section présente l’ensemble des expériences réalisées pour tester les algorithmes propo-
sés pour résoudre le FRP. Ainsi, nous évaluons les deux types d’approches, basées sur une requête
et sur des algorithmes.
Tout d’abord, nous commençons par décrire les données utilisées dans ces expériences. En-
suite, nous passons à la présentation du protocole des trois expériences réalisées sur ces données
pour évaluer nos algorithmes. Finalement, nous concluons par les résultats.
Toutes les expériences ont été conduites sur un ordinateur avec comme système d’exploitation
Ubuntu 16.04.5, 32 Go de RAM et un processeur Intel Core i7-3930K 3.20 GHz (6 cœurs). L’im-
plémentation est basée sur Neo4j et APOC version 3.2.0. Tous les algorithmes sont implémentés
en Java 8.
D’une part, nous avons choisi 6 instances telles que les aéroports des arcs étudiés ont diffé-
rentes caractéristiques notamment le degré. Le test a été fait pour résoudre le problème de FRP
avec un seul critère. D’autre part, nous avons testé l’algorithme de la preuve de concept pour
résoudre le FRP avec deux critères sur les mêmes instances. En effet, les résultats sont très satis-
faisants dans le cas d’un seul critère. Finalement, nous avons généré 100 instances dont le choix
de paires (OD) se fait aléatoirement. Pour la même paire OD, nous générons 10 tests qui varient en
fonction des classes du regret K1 et K2 sur les deux critères : temps et coût.
pour faire la preuve de concept. La section 8.5.3.2 présente une comparaison entre les quatre
algorithmes proposés dans le cadre du passage à l’échelle.
TABLE 8.3 – Comparaison avec la méthode basée sur une procédure APOC.
Le temps d’exécution de la méthode basée sur une requête est très important. Comme Neo4j
implémente la version bidirectionnelle de l’algorithme Dijkstra, l’algorithme est répété pour
chaque paire de nœuds individuellement afin de trouver le plus court chemin à partir de l’origine
o vers tous les autres nœuds du graphe G. Ainsi, plus de calculs sont répétés. Suivant l’analyse
faite dans la section 8.3.3, la requête renvoie une liste des chemins impliquant que la requête
prenne énormément de temps. Dans le pire des cas, la requête s’exécute en 57 minutes et le graphe
résultat est de l’ordre de 65 nœuds. Alors, l’algorithme prend seulement 2321 ms quand il s’agit
de renvoyer un graphe de 287 nœuds. Par conséquent, l’algorithme proposé est plus performant
que la requête Cypher basée sur une procédure APOC.
Nous avons montré que la méthode basée sur une approche algorithmique est plus puissante
que la méthode basée sur une requête pour résoudre le FRP avec un seul critère. Nous avons
ensuite effectué un passage à l’échelle de l’algorithme pour résoudre deux critères : temps et coût.
Le tableau 8.4 présente les résultats obtenus.
Nous remarquons que le pourcentage des nœuds supportés augmentent quand on ajoute un
deuxième critère. Même avec un regret fixé à zéro, le pourcentage est au moins le double que dans
8.5 – Expériences 229
le cas d’un seul critère. Cela est tout à fait normal car la recherche continue pour les nœuds qui ne
sont pas supportés pour le premier critère. Donc, on a de fortes chances de trouver des nœuds qui
sont supportés par le deuxième critère. On rappelle qu’il suffit qu’il existe un chemin valide pour
au moins un seul critère. Donc, la vérification se fait pour les deux critères quand on a encore des
nœuds non supportés.
Pour les instances 1 et 6, le sous-graphe contient tous les plus courts chemins valides passant
par les arcs suivants : (NCE,DXB) et (AMS,IST) pour les deux critères temps et coût. Dans
les instances 2,3 et 4, le regret est choisi respectivement selon les quartiles Q1 , Q2 et Q3 . Pour
résoudre le problème avec deux critères, l’algorithme a besoin de plus de la moitié du temps
d’exécution dans le cas du premier critère. L’instance 2 nous donne le plus petit sous-graphe en
terme de taille. En effet, seulement 5% de nœuds sont supportés. Ce sont les nœuds dont on accepte
de faire la moitié de trajet de vol en plus (JFK,NCE).
Classe coût
Classe temps 0 1 2 3
0 1573.6 1590.4 1657.2 2354.8
1 1783.2 1677.0 1759.4 2246.0
2 1877.8 2007.3 1928.1 2248.0
3 1367.0 2271.5 1484.1 1491.5
Le tableau 8.5 nous donne le temps moyen d’exécution en fonction des deux classes du regret
associées au temps et coût : K1 et K2 . Nous constatons que le temps moyen d’exécution augmente
légèrement quand les valeurs de K1 et K2 augmentent. L’algorithme nous donne une meilleure
borne dans le cas où le paramètre K1 est fixé à une valeur supérieure ou égale au troisième
quartile qui représente 75% des temps de vols tandis que K2 , le paramètre associé au regret sur
le critère de coût, est fixé à zéro. Dans le pire des cas, l’algorithme prend deux fois plus de temps
d’exécution que dans le meilleur cas. Il est atteint lorsque nous échangeons les deux valeurs du
regret. Ce qui revient à dire, que le temps d’exécution de l’algorithme est influencé plutôt par le
critère coût, comme l’augmentation de ce dernier entraîne l’augmentation du temps de calcul de
l’algorithme. En effet, ce critère tient compte du paramètre de M CT .
En conclusion, nous avons montré que la spécialisation d’un algorithme apporte un gain de
performance. Nous avons vu que l’algorithme derrière la requête APOC est plus lent que celui que
230 C HAPITRE 8 — Sélection des marchés
nous avons codé proprement en Java. Donc, à l’heure actuelle, on doit coder en Java pour que cela
réponde à nos questions, notamment, la contrainte du temps de réponse de l’application. On peut
ensuite l’intégrer sous forme de requêtes. Ce qui permettra à l’utilisateur de facilement le tester.
La figure 8.16 analyse la relation entre le temps d’exécution et le nombre de nœuds analysés
pour chaque algorithme. Chaque point représente une instance : son abscisse correspond au temps
d’exécution en millisecondes, et son ordonnée correspond au nombre de nœuds analysés. La cou-
leur d’un point indique quel algorithme a résolu l’instance. L’algorithme en stratégie séquentielle
basé sur Bellman scanne moins de nœuds que ceux basés sur l’algorithme Bellman basé sur
la décomposition en plus court chemin (les points rouges sont au-dessous des points bleus), mais
sans réduction du temps d’exécution (les points bleus se trouvent à gauche des points rouges).
Cela signifie que le temps supplémentaire passé à lire toutes les propriétés n’est pas compensé
par la diminution du nombre de nœuds analysés. Pour Dijkstra, le nombre de nœuds analysés
pour la décomposition dépend uniquement du nombre de critères, alors que ce n’est pas le cas
pour l’algorithme en stratégie séquentielle. Dans ce cas-là, un nombre inférieur de nœuds analy-
sés implique une réduction de l’exécution, car le nombre de propriétés en lecture est également
réduit (les points verts sont situés à gauche et au-dessous des points violets). Comme prévu, les
algorithmes basés sur Dijkstra analysent moins de nœuds que ceux basés sur Bellman.
8.5 – Expériences 231
2e+05
ScanCount
● ●
●
● ● ●
● ●
● ●
● ● ● ●
● ●
● ● ●
● ● ●
● ●
● ● ●●●● ● ●● ●●● ●● ●
●●●●●● ● ●
● ●●
●
● ●● ●● ● ● ● ●
●
● ●●●● ●● ●
● ● ●● ● ●●●● ●● ● ●
● ●● ●● ●
● ●● ● ● ●
● ● ●●● ●● ●●●●●●
● ● ● ●●●
●● ● ●
●● ●● ● ● ●
● ●● ● ●● ● ●●● ●● ●● ● ●●
● ●
●●●●
●●
●●● ●
●●
●
●●
●
●
●
●●●●●
●●●●●●
●
● ●●● ● ● ●
● ● ● ●● ● ●● ●●● ●●●●●
●
●
●●● ●●●
● ●●●●●● ●
● ●●● ●●●
● ● ●
●
●● ●● ●●
●● ●●
●
●
● ●● ● ●●●● ● ●● ●●
●●
● ● ●●● ●●●●
●●●
●●●●
●
●●●●
●
●
●●●
●
●
●●
●●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
● ●
●●
●●●
●
●
●
●●
●● ● ● ●●
●●●● ●●●● ● ●● ●
●
● ●
●● ●● ●●●● ● ●
●
●● ●● ● ● ●● ●● ● ●
● ●
●●● ● ●● ●●● ●●
●● ●● ● ● ● ●●
●● ●
●●
●●● ● ●● ●●●●●
● ●
●● ● ●●● ● ● ●
●●●●
● ●
●●
● ● ● ●
●●●●● ●●●●●●●●●●●
●●
●● ●●
●●
●
● ●●●●●●●● ●
●
●●
●
●
●●
●●
●
●●●●●●
● ● ●● ●
●●●●●● ●●● ● ● ●● ● ●
● ●●● ●● ●
●●● ● ●● ●●●
●
●
●●●
●●●
●
● ●●●
●● ●●●●●
●
●
●
●●
●●●
●
●
●
●●
●
●● ● ●● ●●● ●● ● ●● ● ●
●●
● ●● ●
●●
● ●●
●
●
●●
●●
● ●
●
●●●●
●●
●●
●●●
●●●●
●●
●●●
●
●●
●●●
●
●
●●●●
●●●●●●
●●
●
●● ●●●●
●● ●●●● ●● ● ● ●
●
●
●●● ●●●
●● ●●●● ●
●●●●
● ●●
●●● ●
● ●●● ● ●● ●● ●
●● ●
● ●●● ● ●●
●● ●●● ●● ●●● ●●
● ●● ●● ●
●● ●● ●● ●●● ●
1e+05 ●●●●● ●●
●
● ●●● ●●
●●●
●
●
●
●
●
●
●
●
●
●●
●●
●● ●●
●●
●
●●
●●
●
●
●
●
●
●
●
●
●●
● ●●● ●
●
●
●●●
●
●
●
●
●●
●
●
●
●
●●●
●
●
●●●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●● ●●● ●
●●●
●●
●●●
●
●●
● ●
● ● ●●●
● ●
●
● ●● ●
●
● ●
●● ●●●●●●●●●●● ●
●
●●
●●
● ● ●●
●
●●●●
● ●
●● ●●●
●●●
●●● ●● ● ●
●●●
●
●●● ●● ●
● ● ● ●●●● ● ●●●● ●
●●
●●
●●●●●● ● ●●
●● ●●
● ● ● ● ● ●
● ●
● ● ●● ●
●
●●● ● ●●
●●
● ●●● ●●●●
●
● ●● ● ● ● ●
● ●● ●
●●●●● ● ● ●
● ● ●
●● ●● ● ●●●
●●● ●
●
● ●●●
●●
● ●●●●●●●●●●
●●● ●●● ● ●●
●●
● ● ●
● ●
● ●●
● ●
●●● ●●
●● ●●
● ●●
●
●● ●●●
●●●● ●
● ●●●●● ● ● ●●● ● ●● ●●
●● ●
●● ●●● ● ● ●
● ●● ●
● ● ●●●●●● ● ●●● ● ●
●● ● ●
●
●● ●● ●
●● ● ● ●● ●●●●● ● ●
●● ●●●●●●● ● ●●● ● ●
● ●●●● ●
●
●●
●●
●●●●
●●●●●
●●●
●●●●●●
● ●● ●●
●
●●●●●
●●
●
●
●●●
●●
●●●
●
●●
●●
●
●●
●●
●
●
●●
●
●●
●●
●●
●
●●●●●●
●
●●
●
●● ● ●
● ●
●●
●
●●●
●●●
●●
●
●●
●●●
●
●
●
●●
●●
●
●
●●
●
●●
●
●
●●
●
●
●●●
●●
●
●
●●
● ●●
●
●●
●●
●●
●●
●●
●●
●●
●●
●● ●●● ●●
●●●
● ●
●●●
●●
●
●●
●
●
●
●●
●
●●
●
●●
●
●
●
●●●
●
●
●●
●
●
●●
●
●●
●
●
●●
●
●
●●
●●
●●●
●
●
●●
●●
●
●
●●●
●
●
●●
●
●
● ●
●●●●●●
●●● ●● ●● ●●
● ●
●●●●●●●● ● ●●
●●
●●
● ● ●● ●●● ●
●
●●
●
●●
●
●●
●
●
●
●●
●
●●
●
●●
●
●
●●
●
●
●●
●●
●
●●
●
●●
●
●●
●
●●
●
●
●●
●
●
● ●●
●●
●●
● ●
●●●
●●● ● ● ●● ● ●●
●●●●
●
● ●●
●●●
●● ●●●●● ●
●
●
● ●
● ●
●
● ● ● ●●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●●
●●
●
●●
●
●
●●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●● ●
●
● ● ●
●●●●
●
●
●●
●●
●●
●
●●
●
●● ●●
●
●●●●
●●
●●● ● ● ●
●●
●● ●
●
●●
●
●
●●
●
●●
●
●●●●
●●
●●●
●
● ● ●
Enfin, le tableau 8.7 donne la moyenne géométrique des améliorations apportées par les algo-
rithmes basés sur la stratégie séquentielle par rapport à ceux basés sur la décomposition en PCC,
en termes de temps d’exécution et de nombre de nœuds analysés. L’amélioration est le rapport
entre le temps d’exécution de l’algorithme en stratégie séquentielle et la décomposition de PCC
pour Bellman ou Dijkstra. L’amélioration est inférieure à 1 si l’algorithme en stratégie sé-
quentielle est meilleur que la décomposition en PCC et supérieure à 1 sinon. Les deux algorithmes
en stratégie séquentielle basés sur Dijkstra ou Bellman réduisent le nombre de nœuds analy-
sés et la réduction augmente avec le nombre de critères. Les temps d’exécution ne sont pas réduits
pour Bellman, mais le sont également pour Dijkstra lorsque le nombre de critères est égal à
un ou deux. Lorsqu’il y a trois critères, la réduction du nombre de nœuds analysés ne compense
pas la parallélisation supplémentaire menée dans le cas de la décomposition.
Dijkstra Bellman
#Criteria Runtime #Scans Runtime #Scans
1 0.69 0.57 1.04 0.81
2 0.79 0.41 1.15 0.57
3 1.09 0.43 1.37 0.49
TABLE 8.7 – Amélioration des algorithmes SEQ par rapport aux décompositions de DCP.
232 C HAPITRE 8 — Sélection des marchés
Conclusion
Le FRP est un problème polynomial issu d’une application dans le domaine du transport aérien
qui peut être résolu par l’algorithme proposé. Même si les deux méthodes renvoient une solution
optimale après un nombre fini d’algorithmes de plus court chemin, la requête est plus lente que
l’algorithme de plusieurs ordres de grandeur. Les performances de l’algorithme respectent déjà les
contraintes sur le temps de réponse de l’application.
L’implémentation et l’évaluation de ces algorithmes nous ont permis de mieux s’interfacer
avec la base de données orientée graphe. Ainsi, nous avons testé ces algorithmes sur les données
de Milanamos. Les résultats montrent que le FRP peut être résolu en quelques secondes. Cela
correspond parfaitement au temps de réponse de l’application. De plus, cela améliore bien le tra-
fic puisqu’on se retrouve avec 90% des aéroports dont les routes ne sont pas intéressantes dans
certains cas. On peut espérer que l’accélération du calcul des indices QSI sera conséquente et
que les résultats obtenus sur le trafic seront cohérents. En effet, les itinéraires qui sont renvoyés
correspondent parfaitement à des itinéraires réalistes dans notre historique.
C HAPITRE 9
Modèles d’estimation
des parts de marchés
Nous présentons dans un premier temps le modèle des parts de marchés utilisé par Mila-
namos, basé sur le modèle QSI. Ensuite, nous introduisons le nouveau modèle de choix
discret basé sur la fonction logit pour faire face aux limites du modèle actuel. Le nou-
veau modèle estime les parts de marchés pour chaque marché sélectionné. Nous décri-
vons dans la suite le jeu de données qui a été exploité et la méthodologie développée en
détails. Nous présentons enfin les études de cas réalisées pour évaluer notre approche.
Dans ce contexte, nous avons proposé de valider le modèle d’estimation des parts de
marchés et ensuite la méthode de la sélection des marchés sur les données historiques
de Milanamos.
233
234 C HAPITRE 9 — Modèles d’estimation des parts de marchés
Nous commençons par présenter le modèle de calcul de part de marché implémenté sur
PlanetOptim, qui est basé sur le modèle QSI (Quality Of Service Index) (voir le chapitre 3).
Ensuite, nous introduisons le modèle proposé basé sur le modèle logit. Ce modèle se base sur le
graphe condensé et ne prend pas en compte la table des horaires. Il permet d’estimer les parts de
marchés qui ont été identifiés par le FRP. Nous finissons par exposer des études de cas.
Fréquence directe
f
Df =
f + Edf
où f représente la fréquence hebdomadaire planifiée du nouveau vol.
Edf le nombre des fréquences existantes entre o et d en vol direct sur la semaine demandée. Edf se
calcule en faisant une requête sur la collection schedule. Celle-ci est appelée dans les requêtes
listées ci-dessous sous le nom :schedule_initial_data.
Fréquence indirecte
f
Idf =
f + (0, 3 × Evf )
où Evf est le nombre des fréquences existantes entre o et d en correspondance sur la semaine
demandée du year_month. On applique un poids de 0,3, les passagers préfèrent en général un
vol direct qu’un vol avec correspondance.
Les étapes suivantes présentent comment calculer Evf :
1. Trouver tous les vols qui partent de o. On note l’ensemble contenant ces vols V (o) (voir la
requête dans le listing E.2 dans l’annexe E.1.2).
2. Trouver tous les vols qui partent des aéroports destinations des vols de l’ensemble V (o) vers
d. L’ensemble renvoyé est noté par V (d).
3. Vérifier la viabilité de chaque connexion connectant o à d en passant par chaque aéroport
de l’ensemble : C = {o(i) = d(j)|i ∈ V (o), j ∈ V (d)}, tel que o(i) (respectivement
d(j))représente l’origine du vol i (respectivement la destination du vol j) (voir la sec-
tion 7.2.1 pour les notations).
Capacité de l’avion
Nous regardons les capacités offertes par les routes similaires en termes de revenu et de volume
des passagers. L’horizon de l’historique est de 12 mois avant le départ du vol étudié.
La première étape consiste à chercher les informations de toutes les routes résultant de l’étape
2 du simulateur (voir la section 2.3.2.2 du chapitre 2), cette étape consiste à trouver les routes
dont les aéroports sont similaires à notre origine et destination. Ensuite, on calcule la capacité
et la fréquence mensuelle pour chaque route. Puis, on calcule la capacité totale par rapport à la
fréquence totale sur la période de 12 mois. Et enfin, on sélectionne les routes dont la capacité
moyenne excède la capacité planifiée (cap). L’ensemble Rh présente ces routes sélectionnées.
Function 10 : Calcul
1 foreach r ∈ R do
Pi=12
capr (i)
2 R̄r = Pi=12
i=1
;
i=1
f reqr (i)
3 if R̄r ≥ cap then
4 r ∈ Rh ;
5 end
6 end
Par défaut, cap = 200. Ainsi, le critère Ac est calculé comme suit :
|Rh |
Ac = 1 −
|R|
Pour calculer le critère Ac , nous utilisons une collection pré-calculée SegmentRoutesAirline
et les résultats de l’étape 2 Clusters du simulateur, cette étape qui consiste à trouver toutes les
routes similaires. La collection SegmentRoutesAirline contient toutes les données men-
suelles et annuelles des segments par compagnie aérienne : nombre de passagers (Pax), revenu
total, fréquence, capacité, et nombre de segments opérés par la compagnie aérienne. C’est
une collection qui a été créée en se basant sur les deux collections schedule et segment
(segment_initial_data dans les requêtes). Cette collection contient les données men-
suelles de chaque segment par compagnie aérienne en terme de Pax et revenu.
|D|
Ap =
|Dall |
où D est l’ensemble de destinations desservies par la compagnie depuis l’origine et Dall est
l’ensemble des destinations desservies par toutes les compagnies aériennes.
Circuit
238 C HAPITRE 9 — Modèles d’estimation des parts de marchés
C’est le rapport de la distance totale de tous les aéroports de correspondance avec le nombre
de ces aéroports. Nous commençons par calculer la distance totale pour chaque aéroport en cor-
respondance de l’ensemble C. Ensuite, nous calculons la distance moyenne d¯v de cet aéroport par
rapport à la distance du vol direct.
Function 11 : Calcul de la distance totale
1 dd = dist(o, d);
; // distance du vol direct
2 dt = 0;
3 foreach v ∈ C do
4 id = dist(o, v) + dist(v, d);
; // distance par correspondance
5 d¯v = 1 − dd
id ;
6 dt = dt + d¯v
7 end
d¯v est défini dans [0, 1[ ; proche de 0 s’il s’agit d’un petit détour. Finalement, le circuit est
calculé en faisant la moyenne. Donc, plus Ct est petit, mieux c’est.
dt
Ct =
|C|
Les critères heure du jour et marque de la compagnie sont fixés par l’utilisateur (des critères
subjectifs). Leurs valeurs sont comprises entre 0 et 120. En fait, ces deux critères dépendent di-
rectement du marché que la compagnie aérienne envisage d’opérer. Par défaut, leurs poids est
0, 5.
La ligne 2 du pseudo-code calcule le nombre de passagers sur la période qu’on regarde. En-
suite, nous calculons la part de marché de chaque route. Cela permet d’estimer la part de marché
capturée de chaque route similaire. Après, nous obtenons le nombre de passagers capturés (TW M S )
et finalement, la part de marché pour la route étudiée est obtenue (RM S).
pax(a)
Ap (r) =
paxt
où paxt est le nombre de passagers total transportés par toutes les compagnies aériennes
depuis o.
6. Le QSI permet d’estimer la probabilité qu’un passager sélectionne un itinéraire particu-
lier. Pour cela, des scores (QSI) sont calculés pour chaque itinéraire possible [Jacobs et al.,
2012]. Le modèle actuel ne compare pas tous les itinéraires possibles entre o et d.
1. Prétraitement des hubs : calcul des plus courts chemins depuis/vers les hubs.
2. Résolution du FRP : la solution du FRP donne les marchés potentiels pour un vol donné.
3. Estimation des parts de marchés : estime des parts de marchés pour chaque marché en se
basant sur le modèle logit. Cette estimation prend en considération les vols directs concur-
rents et les itinéraires passant par les hubs.
L’étape de prétraitement est faite une seule fois, les résultats sont stockés sur la base de données
orientée Neo4j. C’est l’étape la plus coûteuse. Tandis que l’étape de la résolution du FRP, elle
est faite pour chaque vol étudié et l’étape du estime des parts de marchés pour chaque marché
prometteur centré sur le vol étudié.
L’étape du prétraitement des hubs nécessite la liste des hubs identifiée dans la section 7.6.5
et se base sur la méthode Hub labeling présentée dans le chapitre 4 (voir l’étape PRE sur la
figure 9.2).
1. Pour chaque hub, calculer les plus courts chemins depuis/vers les hubs.
2. Ajouter un arc quand un aéroport est atteignable depuis un hub et un hub est atteignable
depuis un hub. Ces arcs sont étiquetés par les informations ci dessous.
Dans le graphe condensé G = (X , U, W), un arc entre deux nœuds représente tous les vols
entre ces deux aéroports. Pour identifier les hubs de la liste (H), nous avons introduit une fonction
indicatrice définie pour un nœud de cette façon :
(
1, si x ∈ H
✶H(x) = (9.1)
0, si x ∈
/H
Avec X (P) et U(P) l’ensemble des nœuds et des arcs du chemin P depuis/vers le hub. u′ est
l’arc ajouté entre le hub et le nœud.
Nous enregistrons ces informations sur la base de données, qui nous seront utiles plus tard
pour l’estimation des parts de marchés.
Résoudre le FRP pour calculer l’ensemble des marchés potentiels (voir l’étape FRP sur la
figure 9.2). Les démarches ont été présentées en détails dans le chapitre 8. On rappelle que chaque
paire O&D entre un aéroport en amont et un autre en aval du vol étudié est un marché potentiel,
9.2 – Nouveau modèle basé sur logit 241
ce qui représente le marché en correspondance. Par ailleurs, il faudra prendre en compte dans
l’estimation des parts de marchés, le marché local, ce qui veut dire le marché concerné par l’ajout
du vol avec l’ensemble d’itinéraires desservant ce marché. Par exemple, le marche local dans le cas
du vol NCE - BKK est NCE & BKK. Dans la figure 9.1), ce marché est desservi par 2 itinéraires
qui passent par CDG et FRA (aéroport de Francfort).
Pour chaque marché OD, on a trois types d’itinéraires à considérer (voir l’étape MS sur la
figure 9.2) :
1. Chemins valides (passant par l’arc (o,d)), résultats du FRP.
2. Chemin direct (vol direct s’il existe) reliant l’origine à la destination du marché.
3. Chemin de o à d passant par des hubs (chemins contractés dans l’étape 1).
Pour estimer le nombre de passagers, il suffit de multiplier la part du marché estimée par la
taille du marché, cette dernière information est à calculer à partir de la table O&D.
Graphe condensé
G = {X , U, W}
(2) : F RP
Chemins contractés
Sous-graphe sortant
G′ = {A, V, Z}
Vol direct
Chemins valides
(3) : M S
Calcul de MS
Si = Pexp(Vi )
exp(Vj )
tandis que l’entité régionale «Ouest-Est» contient des paires d’aéroports partant du fuseau horaire
du Pacifique et arrivant sur la Fuseau horaire de l’Est.
Dans notre modèle, on ne tient pas en compte du fuseau horaire car on a relâché la contrainte
temporelle. On travaille sur le graphe condensé avec uniquement les temps de transfert (voir le
chapitre 7).
Le chapitre 3 présentait les différents modèles de choix discret utilisés en pratique dans le
transport aérien. Nous étudions dans notre étude le choix d’itinéraires : on s’intéresse donc plus
particulièrement aux calculs des parts d’itinéraires. Parmi les modèles de choix : nous avons opté
pour le modèle multinomial logit qui a connu un grand succès [Coldren et al., 2003, Coldren,
2005, Coldren and Koppelman, 2005, Garrow, 2016, Barnhart and Smith, 2012, Abdelghany and
Abdelghany, 2018b].
La partie qui suit présente un rappel de la fonction d’utilité du passagers, ses paramètres et
ses variables. Nous nous sommes basés sur l’étude fournie par [Coldren et al., 2003]. Nous avons
adapté les critères de Coldren en ignorant les critères temporels pour les calculer dans le graphe
condensé. Nous allons aussi garder des critères du QSI.
9.2 – Nouveau modèle basé sur logit 243
k=n
X
Ui = Vi + ǫi = βk Xki + ǫi (9.2)
k=1
Le vecteur de variables X représente uniquement les caractéristiques des itinéraires puisque
celles des passagers ne sont pas connues. Le vecteur β correspond aux poids relatifs des attributs
dans la décision du passager.
Le tableau 9.1 présente les différents attributs de chaque itinéraire, qui sont utilisés en tant que
variables de la fonction d’utilité : niveau de service, deuxième meilleure correspondance, diffé-
rence de temps avec la deuxième meilleure correspondance, meilleure correspondance, rapport de
la distance, fréquence, rapport du prix et capacité. Il existe plusieurs façons de modéliser l’impact
de chacun de ces attributs dans la décision du passager, avec des variables binaires ou réelles, etc.
Avec l’ensemble des données dont nous disposons, nos variables sont classées suivant quatre
catégories (voir le tableau 9.1) :
— Niveau de Service
— Qualité de la connexion
— Attributs du transporteur
— Taille et capacité d’avion
Le tableau 9.2 présente les coefficients estimés à partir de [Coldren et al., 2003], certains sont
modifiés pour pallier les critères manquants. Le signe et la valeur du coefficient seront à comparer
avec la meilleure situation. Par exemple, la variable de la référence correspond au type du meilleur
service disponible sur le marché. S’il existe un vol direct sans escale reliant l’origine et la destina-
tion, alors le coefficient pour ce type d’itinéraire est 0.0000. Ainsi, s’il est négatif, cela signifie que
l’utilité du passager diminue si l’itinéraire a plus d’une escale par rapport à une situation où il n’en
aurait aucune. Nous expliquons plus tard, en détails, le signe et la valeur de chaque coefficient.
Cela nous permettra de mieux comprendre l’impact de la variation du coefficient sur l’utilité de
l’itinéraire.
Variable Coefficients
Niveau de Service (ns)
Itinéraire direct dans un marché direct 0.0000
Itinéraire avec une seule correspondance dans le marché direct -2.7087
Itinéraire avec deux correspondances dans le marché direct -7.5112
Itinéraire avec une seule correspondance dans le marché avec une seule correspondance -0.0000
Itinéraire avec deux correspondances dans le marché avec une seule correspondance -2.5431
Qualité de la correspondance
Deuxième meilleure correspondance (sbc) -0.5322
Différence de temps de deuxième meilleure correspondance(sbctd) -0.0178
Meilleure correspondance(bctd) -0.0093
Rapport de la distance(d) -0.0210
Attributs du transporteur
Fréquence(f ) 0.0078
Rapport du prix(p) -0.0045
Taille d’avion et capacité
Grandes lignes (c) 0.0047
l’itinéraire. En d’autres termes, il ne représente pas le prix du billet de chaque itinéraire. Il mesure
plutôt, en général, si la compagnie aérienne est une compagnie aérienne à bas prix qui propose ou
non des itinéraires bon marché dans la paire de villes.
Dans notre cas, on regarde les itinéraires par rapport au flux, donc le prix correspond plutôt au
revenu minimum par passager.
TABLE 9.3 – Résultats de l’estimation des parts de marchés FSC & LIL. (1 cor. représente une
seule correspondance.)
TABLE 9.4 – résultats de l’estimation des parts de marchés TLS & ETZ.
Les résultats du tableau 9.5 illustrent uniquement trois itinéraires passant par LYS parmi les
10 itinéraires possibles. En effet, pour aller de l’aéroport PIS à n’importe quelle ville française,
il y a une seule possibilité en pratique, c’est celle de passer par l’aéroport LYS. Ce qui revient à
dire, que notre modèle trouve parfaitement le même résultat en termes de l’ensemble d’itinéraires
et également en termes de part de marchés capturées.
TABLE 9.5 – résultats de l’estimation des parts de marchés PIS & NCE.
CDG
NCE LRH
LYS PIS
ORY
La première étape du processus consiste à résoudre le problème de la sélection des marchés sur
le réseau français pour le vol LYS - PIS. Pour raisons de simplicité, on a choisit un seul critère
qui est la durée avec un regret de 3h, ce qui signifie que c’est le coût supplémentaire acceptable
par rapport aux meilleurs chemins, pour un temps de transfert de 2h.
On constate que 65 aéroports en amont et 2 aéroports en aval sont sélectionnés. En termes de
marchés, 130 de marchés sélectionnés parmi 4 225, ce qui veut dire qu’on arrive à éliminer déjà
97% des marchés peu prometteurs pour ce vol. En d’autres termes, ce sont les marchés dont la part
des marchés est nulles.
Parmi les 130 paires d’aéroports sélectionnées, on va se focaliser sur (NCE) & (LRH). Ce qui
implique 4 marchés qui offrent la possibilité de passer par le vol LYS - PIS pour aller de Nice
(NCE) à la Rochelle (LRH).
Le tableau 9.6 représente les résultats obtenus de l’application du modèle de l’estimation des
parts de marchés sur les 4 marchés définis précédemment.
On remarque qu’il y a un seul itinéraire pour chaque marché dans l’historique. On rappelle
qu’un itinéraire est une possibilité pour aller de l’aéroport origine de départ à l’aéroport de la
destination finale. Par ailleurs, on trouve le même ensemble d’itinéraires, ce qui veut dire qu’on
retrouve les mêmes trajets des passagers en pratique avec la même part des marchés. On rappelle
qu’on est sur un niveau stratégique, l’idée est de détecter des opportunités économiques et d’aller
les revérifier sur des niveaux plus bas qui sont tactiques et opérationnelles. Dans cette étude de
cas, on constate qu’une opportunité économique pour Air France serait d’ouvrir un vol direct entre
Lyon (LYS) et la Rochelle (LRH), ce qui lui permettra de capturer les passagers venant en amont
de Lyon mais également ceux passant par Poitiers (PIs) ; cet itinéraire est opéré actuellement par
la compagnie aérienne française Chalair aviation.
252 C HAPITRE 9 — Modèles d’estimation des parts de marchés
Hubs
MCO BKK
JFK PEK
Ici, notre approche intégrée permet d’avoir des résultats très fiable avec un temps de calcul
rapide.
La sélection des marchés qui se fait par une approche algorithmique fournit des résultats très
satisfaisants sur le niveau stratégique. En outre, le modèle de l’estimation des parts de marchés
est très fiable sur les études des cas réalisées, en termes de temps de calcul, qui est très rapide à
l’ordre de quelques secondes par rapport aux approches classiques et en termes d’erreur, où l’écart
ne dépasse par 4%. Ces résultats préliminaires nous permettront ainsi de valider notre approche
intégrée et de nous projeter dans le futur pour proposer des vols qui n’existent pas en réalité.
C HAPITRE 10
Conclusion et
Perspectives
À ce jour, il n’est pas possible de proposer une démarche globale traitant les problèmes de
planification en transport aérien en raison de la complexité du problème étudié. Il n’est certes
pas simple d’optimiser la sélection des marchés aériens dans le domaine déjà très complexe de
l’industrie aérienne.
L’objectif de cette thèse a été d’étudier les méthodes et de fournir un outil d’aide à la décision
afin que les clients de la start-up Milanamos puissent prendre de meilleures décisions :
— modifier la fréquence ;
— proposer un nouveau vol ;
— proposer un vol partagé.
Le résultat obtenu devrait permettre à Milanamos d’améliorer l’efficacité globale et la qua-
lité du calcul de part de marché, en prenant en compte des marchés O&D impactés ainsi que
l’ensemble d’itinéraires reliant la paire O&D. Nos travaux sont orientés vers les niveaux anti-
cipés de décision. Milanamos utilise les données historiques des 17 dernières années. L’un des
défis de ce travail de thèse est la gestion d’un grand volume de données hétérogènes et incom-
plètes. Dans une première partie de ce manuscrit, nous présentons le contexte industriel de la
thèse, l’outil développé par Milanamos et le modèle actuel pour le calcul des parts de marchés. La
plupart des approches proposées dans la littérature traitant ce problème se focalisent sur un seul
marché où le vol sera ouvert. Elles se contentent ainsi d’énumérer tous les itinéraires reliant la
paire O&D. En pratique, la combinatoire sur l’énumération des itinéraires interdit le temps réel.
Toutefois, ils ne prennent pas en considération les autres marchés impactés par l’ouverture de ce
vol. Par exemple, un voyageur voyageant de Bordeaux/France (BOD) à Bangkok/Thaïlande (BKK)
via Charles De Gaulle/France(CDG), sera potentiellement intéressé par l’ouverture du vol direct
Nice/France (NCE) - BKK.
Nous consacrons ensuite la deuxième partie de ce travail aux travaux existant dans la littéra-
ture. Nous sommes intéressés par l’étude de trois axes de recherche :
1. Aide à la décision dans le transport aérien
2. Bases de données
3. Théorie des graphes
Le premier axe vise à étudier les différents problèmes d’optimisation qui découlent du proces-
sus de la planification dans le transport aérien ainsi que les approches proposées pour les résoudre.
255
256 C HAPITRE 10 — Conclusion et Perspectives
Ensuite, le deuxième axe nous aidera à choisir la base de données adéquate, à savoir, passer à un
autre système de gestion de base de données pour représenter plus naturellement notre graphe et
décrire plus efficacement les algorithmes. Cela nous permet de stocker notre graphe modélisant le
réseau aérien et faire face aux limites de la base actuelle de Milanamos. La théorie des graphes
nous permet ainsi de formaliser le problème, déterminer sa complexité, et éventuellement choisir
l’algorithme adéquat sur notre graphe pour résoudre la problématique de la recherche.
La troisième partie de ce manuscrit présente les contributions scientifiques de ce travail de
thèse qu’on peut résumer en quatre points. Le premier point est lié à l’analyse des données aé-
riennes de Milanamos. Comme les données viennent du monde réel, des données massives, in-
complètes et hétérogènes, cette étape de pré-traitement des données est primordiale et est le point
d’entrée pour mieux préparer nos données. En effet, la qualité des données joue un rôle très im-
portant sur le résultat attendu. Nous avons ainsi pu mieux comprendre les anomalies, faire des
hypothèses tout en conservant un maximum de réalisme, estimer la taille et la complexité du pro-
blème.
Le deuxième point consiste à proposer une approche pour modéliser notre réseau aérien sui-
vant nos hypothèses. Notre travail a pour but de trouver des opportunités économiques en te-
nant compte des préférences des passagers. Nous avons ainsi omis les horaires des vols et opté
pour l’approche indépendante du temps. Nous avons proposé un modèle hybride entre le modèle
condensé et le modèle temporel étendu. Le modèle condensé nous permettra de contrôler la taille
du graphe, représenter sa structure et donc de tester rapidement la connexité. En outre, nous inté-
grerons quelques éléments du modèle temporel étendu, cela nous permettra d’inclure les temps de
transfert dans le graphe pour avoir des trajets réalistes. Avec cette approche, nous sommes arrivés
à calculer des bornes inférieures sur les plus courts chemins, qui sont largement suffisantes dans
notre cadre d’étude.
En posant plusieurs hypothèses et en utilisant diverses approches pour simplifier le problème
tout en conservant un maximum de réalisme, le réseau aérien est modélisé par un graphe indé-
pendant du temps tel que les nœuds représentent les aéroports tandis qu’un arc indique l’existence
d’un vol entre deux aéroports pour un year_month. Ce réseau sera utilisé par la suite pour estimer
les parts de marchés. Toutefois, il a un intérêt immédiat pour répondre à de nombreuses ques-
tions auxquelles étaient très long voire difficile ou impossible d’y répondre avec la base actuelle
optimode.
Le troisième point répond au problème de la sélection des marchés, qui expose la formulation
mathématique proposée pour modéliser notre problème Flight Radius. Il s’agit de trouver un sous-
graphe maximal, en termes de nœuds tels que les chemins sont valides. Un chemin valide est un
chemin qui limite le surcoût sur le temps, la distance ou bien le prix. La formulation mathématique
que nous avons proposée tient compte des préférences des usagers du réseau de transport aérien.
Pour résoudre le Flight Radius Problem, nous avons commencé par tester les méthodes pro-
posées par la base de données orientée graphe Neo4j. Les résultats n’étaient pas satisfaisants en
termes de temps. Nous avons ainsi proposé une approche algorithmique basée sur l’algorithme
classique de Dijkstra. Les résultats préliminaires ont démontré que l’algorithme répond en
quelques secondes dans le pire des cas. Par ailleurs, la solution renvoie également les vols avec
plus d’une correspondance contrairement à l’affichage actuel sur Milanamos. De nombreux aéro-
ports sont filtrés, ce qui permet d’accélérer le calcul des parts de marché.
Cependant, nous avons étudié plusieurs pistes d’amélioration : une optimisation fine de l’al-
gorithme de Dijkstra et notamment de la queue de priorité, mais aussi l’évaluation des perfor-
mances d’autres algorithmes de plus courts chemins comme Bellman. C’est dans ce cadre que
10.0 – 257
nous avons proposé deux approches différentes : une approche séquentielle basée sur la décompo-
sition en plus court chemin et une approche basée sur le parallélisme.
Pour évaluer leur performance, nous avons choisi deux métriques : temps d’exécution et
nombre de nœuds scannés par l’algorithme. En effet, le vrai défi sur les bases de données orientées
graphe est de gérer les propriétés qui sont stockées dans des fichiers séparés, ce qui est coûteux
puisque gourmand en accès mémoire. Les propriétés correspondent aux étiquettes en théorie des
graphes. Les résultats obtenus démontrent que l’algorithme basé sur Dijkstra est le meilleur
en termes de performance.
Le Flight Radius Problem est un problème polynomial lié au problème de recherche des plus
courts chemins, issu d’une application dans le domaine du transport aérien qui peut être résolu
par l’algorithme proposé. Même si les deux méthodes renvoient une solution après un nombre
fini d’appels à des algorithmes de plus court chemin, la requête est plus lente que l’algorithme de
plusieurs ordres de grandeur. Les performances de l’algorithme respectent les contraintes sur le
temps de réponse de l’application.
Le dernier point de ce manuscrit présente les études de cas que nous avons proposées pour ac-
célérer le calcul des parts de marché et faire face aux limites du modèle actuel de Milanamos. En
effet, nous avons proposé un nouveau modèle basé sur le modèle multinomial couplé à des tech-
niques d’accélération de calcul des plus courts chemins, notamment la technique du Hub Labeling,
pour réduire la combinatoire sur l’énumération des itinéraires.
En comparant les résultats avec l’historique de Milanamos, nous avons validé le modèle. Nous
espérons ainsi l’étendre pour tout marché potentiel de l’ensemble des marchés de la solution du
Flight Radius Problem.
Pour conclure, si nous avions à résumer notre démarche de travail, nous proposerions un plan
à neuf points :
1. analyser les données aériennes,
2. modéliser le réseau aérien,
3. construire le graphe,
4. transformer le graphe,
5. stoker le graphe,
6. analyser le réseau aérien,
7. identifier les hubs,
8. résoudre le problème de la sélection des marchés,
9. modéliser l’estimation des parts de marchés.
Perspectives
Les travaux développés dans cette thèse représentent la toute première étude sur l’analyse
et la sélection des nouveaux marchés au sein de la start-up Milanamos. De ce fait, un travail
d’analyse et de formalisation du problème ont été réalisés afin de disposer d’une vue claire de la
problématique. Ceci constitue en soi un apport important et réutilisable pour les prochaines études
sur ce sujet. C’est également le premier travail dans la littérature qui traite le modèle des parts de
marché d’un point de vue plus combinatoire. Dans ce contexte, les résultats de cette thèse ouvrent
de nombreuses perspectives.
258 C HAPITRE 10 — Conclusion et Perspectives
À l’échelle de l’aérien, le nouveau modèle proposé pour le calcul des parts de marché se base
sur le modèle multinomial (logit). Les coefficients ont été estimés pour le réseau des États-Unis.
En analysant les coefficients, on remarque que les vols avec plus d’une correspondance sont plus
pénalisés. Il est vrai que le réseau des États-Unis est plus grand que celui de la France. Ceci nous
permettra d’ouvrir une piste pour estimer les coefficients en se basant sur les données de la France.
Par ailleurs, le modèle multinomial utilisé dépasse le modèle QSI d’après les résultats dans la
littérature. Toutefois, le modèle multinomial devient difficile quand il s’agit de manipuler plusieurs
critères. Dans ce cas-là, il se peut que l’utilisation des méthodes de l’apprentissage automatique
puisse faciliter cette tâche pour les deux modèles. On pourrait ainsi améliorer le modèle du QSI
développé par Milanamos suivant deux axes :
1. utiliser les méthodes de l’apprentissage automatique pour fixer au préalable les coefficients ;
2. reprendre la méthodologie du calcul de part de marché qui a été proposée avec le logit mais
en remplaçant ce dernier par le modèle QSI.
Dans une direction similaire, nous pourrions intégrer les horaires. Il est essentiel de rappeler
que notre modèle relâche les contraintes temporelles, le fait de passer d’une fréquence mensuelle à
une fréquence hebdomadaire nous permettra d’apporter une aide à la décision sur le plan tactique
en proposant au client une liste des choix des heures de départ du vol proposé.
À l’échelle des bases de données, plusieurs algorithmes de calcul de chemins ont été dévelop-
pés récemment par Neo4j [NeoTechnology, 2018]. Il serait intéressant d’évaluer ces algorithmes,
avec l’espoir à terme, d’améliorer les temps d’exécution. Dans ce sens, l’appel à des algorithmes
des plus courts chemins sur des bases de données typiquement Neo4j, engendre un coût qui
devient vite important à cause du stockage des propriétés. Pour pallier cela, nous avons utilisé
des techniques de parallélisme. L’algorithme qui a donné des bons résultats est l’algorithme basé
sur Dijkstra dans une approche séquentielle. On rappelle que l’algorithme traite les directions
en parallèle et les critères en séquentiel. Il semble ainsi raisonnable de paralléliser l’algorithme
également pour les critères puisqu’ils sont traités indépendamment.
Nous avons aussi fait des pré-traitements afin de réduire la combinatoire sur l’énumération
des itinéraires entre chaque paire d’aéroports de marché potentiel. La méthode basée sur l’algo-
rithme Hub Labeling fonctionne parfaitement quand la liste des hubs est fournie sur un petit jeu
de données. Toutefois, elle ne passe pas à grande échelle. En outre, un profilage du code lors de
l’implémentation pourrait apporter des améliorations certaines en réduisant les temps de calcul de
certaines parties du code qui sont sollicitées fréquemment et qui représentent la plus grande charge
de travail à effectuer par l’ordinateur. Mais ce travail relève plutôt du génie logiciel.
L’idée principale reste toutefois valide : il serait envisageable de changer les techniques utilisées.
En effet, le fait de se concentrer uniquement sur les itinéraires passant par des hubs nous permettra
de capturer tout le flux des passagers. La démarche utilisée pour réduire le graphe et ne garder que
les marchés potentiels où les parts de marchés sont significatives demeure une bonne idée.
Un dernier point sur la collecte des données qui représente la clé de tout processus d’aide à
la décision. D’après nos analyses, nous avons remarqué que les données extraites de la base de
Milanamos comportent des erreurs. L’analyse du graphe nous a permis de détecter ces erreurs et
de les remonter aux responsables pour les corriger. Nous avons ainsi passé du temps à refaire la
démarche mais en faisant un pré-traitement avant la génération du graphe. Travailler avec des jeux
de données plus complets conduirait à des résultats plus précis, notamment, le manque sur les
données des revenus, distance et durée.
10.0 – 259
Le croisement des cinq disciplines abordées dans cette thèse, l’aérien, les formules écono-
miques, les bases de données, la théorie des graphe et l’aide à la décision, permet de mieux mo-
déliser les problèmes réels, notamment sur le plan stratégique et opérationnel. On peut prendre
l’exemple du virus COVID-19. En regardant la carte mondiale des cas, on remarque qu’il existe
une forte corrélation entre les principaux aéroports internationaux et la venue du virus dans ces
pays, car en effet, les passagers aériens en provenance de pays infectés propageaient le virus dans
le pays destination : les passagers étaient donc le vecteur de propagation du virus. L’analyse du
réseau aérien permettra ainsi de mieux suivre la propagation du virus.
Bibliographie
A. Abdelghany and K. Abdelghany. Airline Network Planning and Scheduling. John Wiley &
Sons, 2018a.
A. Abdelghany and K. Abdelghany. Airline Network Planning and Scheduling. John Wiley &
Sons, 2018b.
I. Abraham, D. Delling, A. V. Goldberg, and R. F. Werneck. A hub-based labeling algorithm for
shortest paths in road networks. In International Symposium on Experimental Algorithms, pages
230–241. Springer, 2011.
I. Abraham, D. Delling, A. V. Goldberg, and R. F. Werneck. Hierarchical hub labelings for
shortest paths. In European Symposium on Algorithms, pages 24–35. Springer, 2012.
N. Adler. Hub-spoke network choice under competition with an application to western europe.
Transportation science, 39(1) :58–72, 2005.
S. Agrawal and A. Patel. A study on graph storage database of nosql. International Journal on
Soft Computing, Artificial Intelligence and Applications, 5 :33–39, 02 2016. doi : 10.5121/ijscai.
2016.5104.
R. K. Ahuja, T. L. Magnanti, and J. B. Orlin. Network flows : theory, algorithms, and applica-
tions. Prentice hall, 1993.
D. Allen, A. Hodler, M. Hunger, M. Knobloch, W. Lyon, M. Needham, and H. Voigt. Unders-
tanding trolls with efficient analytics of large graphs in neo4j. BTW 2019, 2019.
R. Angles. A comparison of current graph database models. In 2012 IEEE 28th International
Conference on Data Engineering Workshops, pages 171–177. IEEE, 2012.
R. Angles and C. Gutierrez. Survey of graph database models. ACM Computing Surveys (CSUR),
40(1) :1, 2008.
C. Barnhart and A. Cohn. Airline schedule planning : Accomplishments and opportunities. Ma-
nufacturing & service operations management, 6(1) :3–22, 2004.
C. Barnhart and B. Smith. Quantitative problem solving methods in the airline industry. Springer,
2012.
C. Barnhart, P. Belobaba, and A. R. Odoni. Applications of operations research in the air transport
industry. Transportation science, 37(4) :368–391, 2003a.
C. Barnhart, P. Belobaba, and A. R. Odoni. Applications of operations research in the air transport
industry. Transportation science, 37(4) :368–391, 2003b.
H. Bast, D. Delling, A. Goldberg, M. Müller-Hannemann, T. Pajor, P. Sanders, D. Wagner, and
R. F. Werneck. Route planning in transportation networks. In Algorithm engineering, pages
19–80. Springer, 2016.
S. Batra and C. Tyagi. Comparative analysis of relational and graph databases. International
Journal of Soft Computing and Engineering (IJSCE), 2(2) :509–512, 2012.
N. Béchet. État de l’art sur les systèmes de recommandation. 2012.
261
262 BIBLIOGRAPHIE
P. Belobaba, A. Odoni, and C. Barnhart. The global airline industry. John Wiley & Sons, 2015.
I. Ben-Gan, A. Machanic, D. Sarka, and K. Farlee. T-SQL Querying. Microsoft Press, 2015.
C. Berge. Graphes et hypergraphes. 1973.
K. Bhamra. A comparative analysis of mongodb and cassandra. Master’s thesis, The University
of Bergen, 2017.
J. A. Bondy, U. S. R. Murty, et al. Graph theory with applications, volume 290. Citeseer, 1976.
M. Braimniotis. Transformation from ORM Conceptual Models to Neo4j Graph Database. PhD
thesis, 2017.
R. Bruchez. Les bases de données NoSQL et le BigData : Comprendre et mettre en oeuvre.
Editions Eyrolles, 2015.
N. Budhiraja, M. Pal, and A. Pal. Airline network design and fleet assignment : using logit-
based dynamic demand-supply interaction. Technical report, working Paper, Indian Institute of
Management Calcutta, 2006.
M. Buerli. The current state of graph databases. 2012.
Bureau de l’observation du marché. Bulletin statistique du trafic aérien commercial, 2017.
J. G. Busquets, E. Alonso, and A. D. Evans. Air itinerary shares estimation using multinomial
logit models. Transportation Planning and Technology, 41(1) :3–16, 2018.
D. Chakrabarti and C. Faloutsos. Graph mining : Laws, generators, and algorithms. ACM com-
puting surveys (CSUR), 38(1) :2, 2006.
D. G. Chandra. Base analysis of nosql database. Future Generation Computer Systems, 52 :
13–21, 2015.
B. V. Cherkassky, A. V. Goldberg, and T. Radzik. Shortest paths algorithms : Theory and expe-
rimental evaluation. Mathematical programming, 73(2) :129–174, 1996.
K. Chodorow. MongoDB : the definitive guide : powerful and scalable data storage. " O’Reilly
Media, Inc.", 2013.
M. Ciglan, A. Averbuch, and L. Hluchy. Benchmarking traversal operations over graph databases.
In 2012 IEEE 28th International Conference on Data Engineering Workshops, pages 186–189.
IEEE, 2012.
E. F. Codd. Data models in database management. ACM Sigmod Record, 11(2) :112–114, 1981.
E. Cohen, E. Halperin, H. Kaplan, and U. Zwick. Reachability and distance queries via 2-hop
labels. SIAM Journal on Computing, 32(5) :1338–1355, 2003.
G. M. Coldren. Modeling the Competitive Dynamic Among Air-travel Itineraries with Generalize
Extreme Value Models. PhD thesis, Northwestern University, 2005.
G. M. Coldren and F. S. Koppelman. Modeling the competition among air-travel itinerary shares :
Gev model development. Transportation Research Part A : Policy and Practice, 39(4) :345–365,
2005.
G. M. Coldren, F. S. Koppelman, K. Kasturirangan, and A. Mukherjee. Modeling aggregate air-
travel itinerary shares : logit model development at a major us airline. Journal of Air Transport
Management, 9(6) :361–369, 2003.
D. Comer. Ubiquitous b-tree. ACM Computing Surveys (CSUR), 11(2) :121–137, 1979.
BIBLIOGRAPHIE 263
A. Czerepicki. Application of graph databases for transport purposes. Bulletin of the Polish
Academy of Sciences Technical Sciences, 64(3) :457–466, 2016.
C. Dasadia and A. Nayak. MongoDB Cookbook. Packt Publishing Ltd, 2016.
D. Delling, T. Pajor, D. Wagner, and C. Zaroliagis. Efficient Route Planning in Flight Networks.
ATMOS, 12, 2009a. ISSN 2190-6807. doi : http://dx.doi.org/10.4230/OASIcs.ATMOS.2009.
2145. URL http://drops.dagstuhl.de/opus/volltexte/2009/2145.
D. Delling, P. Sanders, D. Schultes, and D. Wagner. Engineering route planning algorithms. In
Algorithmics of large and complex networks, pages 117–139. Springer, 2009b.
D. Delling, A. V. Goldberg, and R. F. Werneck. Hub label compression. In International Sympo-
sium on Experimental Algorithms, pages 18–29. Springer, 2013.
D. Delling, A. V. Goldberg, R. Savchenko, and R. F. Werneck. Hub labels : Theory and practice.
In International Symposium on Experimental Algorithms, pages 259–270. Springer, 2014.
A. Dey, A. Fekete, and U. Röhm. Scalable transactions across heterogeneous nosql key-value
data stores. Proceedings of the VLDB Endowment, 6(12) :1434–1439, 2013.
D. Di Wang, D. Klabjan, and S. Shebalov. Attractiveness-based airline network models with
embedded spill and recapture. Journal of Airline and Airport Management, 7(1) :1–25, 2014.
G. Dobson and P. J. Lederer. Airline scheduling and routing in a hub-and-spoke system. Trans-
portation Science, 27(3) :281–297, 1993.
M. Ehrgott. Multicriteria optimization, volume 491. Springer Science & Business Media, 2005.
R. Elmasri and S. Navathe. Fundamentals of database systems. Addison-Wesley Publishing
Company, 2010.
A. E. Eltoukhy, F. T. Chan, and S. H. Chung. Airline schedule planning : a review and future
directions. Industrial Management & Data Systems, 117(6) :1201–1243, 2017.
L. Euler. Solutio problematis ad geometriam situs pertinentis. Commentarii academiae scientia-
rum Petropolitanae, pages 128–140, 1741.
D. Fernandes and J. Bernardino. Graph databases comparison : Allegrograph, arangodb, infini-
tegraph, neo4j, and orientdb. 2018.
P. Fortin, C. Morency, and M. Trépanier. Innovative gtfs data application for transit network
analysis using a graph-oriented method. Journal of Public Transportation, 19(4) :2, 2016.
L. R. Foulds. Graph theory applications. Springer Science & Business Media, 2012.
M. L. Fredman and R. E. Tarjan. Fibonacci heaps and their uses in improved network optimiza-
tion algorithms. Journal of the ACM (JACM), 34(3) :596–615, 1987.
L. C. Freeman. A set of measures of centrality based on betweenness. Sociometry, pages 35–41,
1977.
P. Gachoki and M. Muraya. Comparison of models used to predict flight delays at jomo kenyatta
international airport. Asian Journal of Probability and Statistics, pages 1–8, 2019.
X. Gandibleux, F. Beugnies, and S. Randriamasy. Martins’ algorithm revisited for multi-objective
shortest path problems with a maxmin cost function. 4OR : A Quarterly Journal of Operations
Research, 4(1) :47–59, 2006.
G. Gardarin. Bases de données. Editions Eyrolles, 2003.
264 BIBLIOGRAPHIE
L. A. Garrow. Discrete choice modelling and air travel demand : theory and applications. Rout-
ledge, 2016.
R. Geisberger. Advanced route planning in transportation networks. PhD thesis, Universitat
Karlsruhe (TH) - Institut für Theoretische Informatik (ITI), 2011.
R. Geisberger, P. Sanders, D. Schultes, and D. Delling. Contraction hierarchies : Faster and
simpler hierarchical routing in road networks. In International Workshop on Experimental and
Efficient Algorithms, pages 319–333. Springer, 2008.
P. Goedeking. Networks in aviation : strategies and structures. Springer Science & Business
Media, 2010.
T. Grosche. Computational intelligence in integrated airline scheduling, volume 173. Springer-
Verlag Berlin Heidelberg, 2009a.
T. Grosche. Airline scheduling process. In Computational Intelligence in Integrated Airline
Scheduling, pages 7–46. Springer, 2009b.
T. Grosche and F. Rothlauf. Air travel itinerary market share estimation. 04 2007.
J. A. Gubner. Probability and random processes for electrical and computer engineers. Cam-
bridge University Press, 2006.
O. A. Guide. DOT ANALYSER USER GUIDE, JULY 2018. URL http://www.oag.com.
N. Halpern and A. Graham. Airport route development : A survey of current practice. Tourism
Management, 46 :213–221, 2015.
J. Hölsch, T. Schmidt, and M. Grossniklaus. On the performance of analytical and pattern mat-
ching graph queries in neo4j and a relational database. In EDBT/ICDT 2017 Joint Conference :
6th International Workshop on Querying Graph Structured Data (GraphQ), 2017.
F. Holzschuher and R. Peinl. Performance of graph query languages : comparison of cypher,
gremlin and native access in neo4j. In Proceedings of the Joint EDBT/ICDT 2013 Workshops,
pages 195–204. ACM, 2013.
F. Holzschuher and R. Peinl. Performance optimization for querying social network data. In
EDBT/ICDT Workshops, pages 232–239, 2014.
ICAO. List of low-cost-carriers(lccs. https://www.icao.int/sustainability/
Documents/LCC-List.pdf, 2017.
A. K. Idrissi, A. Malapert, and R. Jolin. The route network development problem based on qsi
models. pages 3–11, 2017.
A. K. Idrissi, A. Malapert, and R. Jolin. Solving the flight radius problem. pages 304–311, 2018.
doi : 10.5220/0006654003040311.
A. K. Idrissi., A. Malapert., and R. Jolin. Flight radius algorithms. pages 370–377, 2019. doi :
10.5220/0007388503700377.
T. L. Jacobs, L. A. Garrow, M. Lohatepanont, F. S. Koppelman, G. M. Coldren, and H. Purnomo.
Airline planning and schedule development. In Quantitative Problem Solving Methods in the
Airline Industry, pages 35–99. Springer, 2012.
P. S. Jadhav and R. Oberoi. Comparative analysis of different graph databases. International
Journal of Engineering Research & Technology (IJERT), 3(9) :820–824, 2015.
BIBLIOGRAPHIE 265
P. Jaillet, G. Song, and G. Yu. Airline network design and hub location problems. Location
science, 4(3) :195–212, 1996.
U. Kang, C. E. Tsourakakis, A. P. Appel, C. Faloutsos, and J. Leskovec. Radius plots for mining
tera-byte scale graphs : Algorithms, patterns, and observations. In Proceedings of the 2010 SIAM
International Conference on Data Mining, pages 548–558. SIAM, 2010.
D. Kim and C. Barnhart. Transportation service network design : Models and algorithms. In
Computer-Aided Transit Scheduling, pages 259–283. Springer, 1999.
D. Kirchler. Efficient routing on multi-modal transportation networks. PhD thesis, Ecole Poly-
technique X, 2013.
F. S. Koppelman, G. M. Coldren, and R. A. Parker. Schedule delay impacts on air-travel itinerary
demand. Transportation Research Part B : Methodological, 42(3) :263–273, 2008.
D. M. Kroenke and D. J. Auer. Database processing, volume 6. Prentice Hall, 2013.
P. Lacomme, C. Prins, and M. Sevaux. Algorithmes de graphes, volume 28. Eyrolles Paris, 2003.
M. Lal. Neo4J Graph Data Modeling. Packt Publishing, 2015. ISBN 1784393444,
9781784393441.
P. Larsson. Analyzing and adapting graph algorithms for large persistent graphs, 2008.
P. J. Lederer and R. S. Nambimadom. Airline network design. Operations Research, 46(6) :
785–804, 1998.
J. Leskovec, J. Kleinberg, and C. Faloutsos. Graphs over time : densification laws, shrinking
diameters and possible explanations. In Proceedings of the eleventh ACM SIGKDD international
conference on Knowledge discovery in data mining, pages 177–187. ACM, 2005.
M. Lohatepanont and C. Barnhart. Airline schedule planning : Integrated models and algorithms
for schedule design and fleet assignment. Transportation Science, 38(1) :19–32, 2004.
A. E. Lotfy, A. I. Saleh, H. A. El-Ghareeb, and H. A. Ali. A middle layer solution to support
acid properties for nosql databases. Journal of King Saud University-Computer and Information
Sciences, 28(1) :133–145, 2016.
J. J. Louviere, D. A. Hensher, and J. D. Swait. Stated choice methods : analysis and applications.
Cambridge university press, 2000.
I. Maduako, E. Cavalheri, and M. Wachowicz. Exploring the use of time-varying graphs for
modelling transit networks. arXiv preprint arXiv :1803.07610, 2018.
T. L. Magnanti and R. T. Wong. Network design and transportation planning : Models and
algorithms. Transportation science, 18(1) :1–55, 1984.
A. Martínez Porras, R. Mora Rodríguez, D. Alvarado González, G. López Herrera, and
S. Quirós Barrantes. A comparison between a relational database and a graph database in the
context of a personalized cancer treatment application. 2016.
D. McFadden et al. Conditional logit analysis of qualitative choice behavior. 1974.
Milanamos. User Manual of PlanetOptim, 2016. URL http://po.milanamos.com/
usermanual.
M. Miler, D. Medak, and D. Odobašić. The shortest path algorithm performance comparison in
graph and relational database on a transportation network. Promet-Traffic&Transportation, 26
(1) :75–82, 2014.
266 BIBLIOGRAPHIE
J. J. Miller. Graph database applications and concepts with neo4j. In Proceedings of the Southern
Association for Information Systems Conference, Atlanta, GA, USA, volume 2324, page 36, 2013.
MongoDB. Mongodb manual. https://docs.mongodb.com, 2016.
MongoDB. Mongodb manual, 2017.
S. Morishima and H. Matsutani. Performance evaluations of graph database using cuda and
openmp compatible libraries. ACM SIGARCH Computer Architecture News, 42(4) :75–80, 2014.
S. A. T. Mpinda, L. C. Ferreira, M. X. Ribeiro, and M. T. P. Santos. Evaluation of graph data-
bases performance through indexing techniques. International Journal of Artificial Intelligence
& Applications (IJAIA) Vol, 6 :87–98, 2015.
A. Nayak, A. Poriya, and D. Poojary. Type of nosql databases and its comparison with relational
databases. International Journal of Applied Information Systems, 5(4) :16–19, 2013.
N. T. Neo4j and Cypher. Neo4j apoc library, 2020.
NeoTechnology. Community detection algorithms, 2018.
J. Nesetril, E. Milková, and H. Nesetrilová. Otakar boruvka on minimum spanning tree problem
translation of both the 1926 papers, comments, history. Discrete Mathematics, 233(1-3) :3–
36, 2001. doi : 10.1016/S0012-365X(00)00224-7. URL https://doi.org/10.1016/
S0012-365X(00)00224-7.
Oracle. Mysql reference manual, 2019.
T. Pajor. Multi-modal route planning. PhD thesis, Universitat Karlsruhe (TH) - Institut für
Theoretische Informatik (ITI), 2009.
T. Pajor. Algorithm Engineering for Realistic Journey Planning in Transportation Networks. PhD
thesis, 2013.
C. Partl, S. Gratzl, M. Streit, A. M. Wassermann, H. Pfister, D. Schmalstieg, and A. Lex. Pathfin-
der : Visual analysis of paths in graphs. In Computer Graphics Forum, volume 35, pages 71–80.
Wiley Online Library, 2016.
J. Pokornỳ. Graph databases : their power and limitations. In IFIP International Conference on
Computer Information Systems and Industrial Management, pages 58–69. Springer, 2015.
R. C. Prim. Shortest connection networks and some generalizations. The Bell System Technical
Journal, 36(6) :1389–1401, 1957.
R. Rai and P. Chettri. Nosql hands on. In Advances in Computers, volume 109, pages 157–277.
Elsevier, 2018.
S. Raj. Neo4j high performance. Packt Publishing Ltd, 2015.
T. Reiners, J. Pahl, M. Maroszek, and C. Rettig. Integrated aircraft scheduling problem : An
auto-adapting algorithm to find robust aircraft assignments for large flight plans. In 2012 45th
Hawaii International Conference on System Sciences, pages 1267–1276. IEEE, 2012.
I. Robinson, J. Webber, and E. Eifrem. Graph databases : new opportunities for connected data.
" O’Reilly Media, Inc.", 2015.
C. C. Robusto. The cosine-haversine formula. The American Mathematical Monthly, 64(1) :
38–40, 1957.
M. A. Rodriguez and P. Neubauer. Constructions from dots and lines. Bulletin of the American
Society for Information Science and Technology, 36(6) :35–41, 2010.
BIBLIOGRAPHIE 267
État de l’art
3.1 Processus de planification pour une compagnie aérienne. . . . . . . . . . . . . . 43
3.2 Sous-problèmes de la planification d’équipages. . . . . . . . . . . . . . . . . . . 47
3.3 Étapes du problème FS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.4 Réseau Point à point. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.5 Réseau Hub & Spoke. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.6 Étapes de planification de réseau. . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.7 Schéma des méthodes de résolution du problème FS. . . . . . . . . . . . . . . . 56
3.8 Schéma du fonctionnement des modèles de MS basés sur les modèles logit . . . 60
3.9 Schéma du processus des modèles de choix discrets. . . . . . . . . . . . . . . . 66
269
270 TABLE DES FIGURES
5.1 Réseau aérien de vols. Le graphe contient 16 nœuds (aéroports) et 21 arcs (vols) . 98
5.2 Diagramme entité-relation du 2-hops. PK (respectivement FK) correspond à la clé
primaire (respectivement secondaire). . . . . . . . . . . . . . . . . . . . . . . . 101
5.3 Schéma d’une base de données MongoDB. Les documents d’une même collection
peuvent avoir des champs différents. . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4 Modèle de base de données graphe. . . . . . . . . . . . . . . . . . . . . . . . . 117
5.5 Interface Neo4j. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.6 Résultat en mode tableau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.7 Résultat en mode texte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.8 Exemple de graphe en Neo4j. . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.9 Résultat de la requête du listing 5.31. . . . . . . . . . . . . . . . . . . . . . . . 120
5.10 Réseau aérien de la figure 5.1 sur Neo4j. . . . . . . . . . . . . . . . . . . . . . 122
5.11 Liste des destinations depuis l’aéroport NCE. . . . . . . . . . . . . . . . . . . . 123
5.12 Résultat de la requête du listing 5.41. . . . . . . . . . . . . . . . . . . . . . . . 123
5.13 Structure du fichier de la base de données orientée graphe. Le graphe modélise un
réseau de vol tel que les nœuds sont les aéroports et les relations représentent les
vols. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
5.14 Stockage cache/disque. Les flèches en pointillés représentent les références.
Toutes les références se font par ID. Les relations sont regroupées par type.
{T1 , T2 } sont les types des relations de ce nœud. . . . . . . . . . . . . . . . . . 128
Contributions
6.1 Diagramme entité-association de la base de données optimode. . . . . . . . . 139
6.2 Visions représentées dans optimode. . . . . . . . . . . . . . . . . . . . . . . . 140
6.3 Perspectives des segments. L’aéroport concerné par la vision est représenté par un
double carré. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
6.4 Répartition des aéroports par région. . . . . . . . . . . . . . . . . . . . . . . . . 150
6.5 Écart des passagers entre les données de Milanamos et les statistiques publiées. . 154
6.6 Capacité des liaisons ayant moins de 100 000 pax. . . . . . . . . . . . . . . . . 155
État de l’art
3.1 Récapitulatif des travaux traitant le problème RD dans la littérature. . . . . . . . 58
3.2 liste des critères pris en compte dans l’étude [Coldren et al., 2003] . . . . . . . . 71
Contributions
6.1 résultats de la requête du listing 6.5. . . . . . . . . . . . . . . . . . . . . . . . . 142
6.2 exemple de la représentation de segment Bridge de la figure 6.3 dans la collection
segment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
6.3 les données manquantes de la collection airport. . . . . . . . . . . . . . . . 149
6.4 statistiques de la comparaison. . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
6.5 récapitulatif des collections de la base de données aérienne optimode. . . . . . 156
7.1 Comparaison entre les différentes approches de modélisation des réseaux de trans-
port. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
7.2 Correspondance des étiquettes du CFN avec les métriques des requêtes 7.2 et 7.3. 175
7.3 Statistiques sur la période 2015. Tn représente le temps de création des nœuds,
Ttot est le temps du processus total en secondes. . . . . . . . . . . . . . . . . . 176
7.4 Statistiques de la génération du graphe condensé pour l’année 2015. . . . . . . . 177
7.5 Versions du CFN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
7.6 Composantes connexes du graphe condensé. . . . . . . . . . . . . . . . . . . . 181
7.7 Statistiques des composantes connexes. CC est le nombre des composantes
connexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
7.8 Composantes fortement connexes. . . . . . . . . . . . . . . . . . . . . . . . . . 183
273
274 LISTE DES TABLEAUX
7.9 Statistiques des composantes fortement connexes. SCC est le nombre des compo-
santes fortement connexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
7.10 Composantes fortement connexes dans le graphe condensé pour une période d’un
an. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.11 Statistiques des composantes fortement connexes pour une période d’un an. . . . 185
7.12 Cas considérés dans la requête du listing 7.23. . . . . . . . . . . . . . . . . . . 193
7.13 Valeurs de préférences et sources de données des critères. . . . . . . . . . . . . 197
275
Liste des exemples
277
Liste des codes
5.1 syntaxe globale d’une requête en SQL . . . . . . . . . . . . . . . . . . . . . . . 100
5.2 requête pour créer la table airports en SQL . . . . . . . . . . . . . . . . . . 100
5.3 requête pour insérer des données en SQL dans la table airports . . . . . . . . 101
5.4 requête pour importer des données à partir d’un fichier CSV en SQL . . . . . . . 101
5.5 requête pour afficher la table airports en SQL . . . . . . . . . . . . . . . . . 102
5.6 requête pour récupérer la liste des destinations en SQL . . . . . . . . . . . . . . 102
5.7 requête pour récupérer les destinations en moins de 2h en SQL . . . . . . . . . . 102
5.8 requête pour trouver la destination la moins chère en SQL . . . . . . . . . . . . . 103
5.9 requête pour récupérer les noms en SQL . . . . . . . . . . . . . . . . . . . . . . 103
5.10 requête pour chercher les aéroports avec 2 sauts en SQL . . . . . . . . . . . . . . 104
5.11 syntaxe globale d’une requête en MongoDB . . . . . . . . . . . . . . . . . . . . 108
5.12 exemple de la méthode find() . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.13 requête pour créer un index en MongoDB . . . . . . . . . . . . . . . . . . . . . 109
5.14 requête pour insérer des données en MongoDB . . . . . . . . . . . . . . . . . . 110
5.15 commande pour importer des données à partir d’un fichier CSV en MongoDB . . 110
5.16 requête pour afficher une collection en MongoDB . . . . . . . . . . . . . . . . . 110
5.17 requête pour récupérer la liste des destinations en MongoDB . . . . . . . . . . . 110
5.18 résultat de la requête du listing 5.17 . . . . . . . . . . . . . . . . . . . . . . . . 110
5.19 requête pour récupérer les destinations à moins de 2h en MongoDB . . . . . . . . 111
5.20 résultat de la requête du listing 5.19 . . . . . . . . . . . . . . . . . . . . . . . . 111
5.21 requête pour trouver la destination la moins chère en MongoDB . . . . . . . . . 111
5.22 résultat de la requête du listing 5.21 . . . . . . . . . . . . . . . . . . . . . . . . 111
5.23 requête pour récupérer les codes des aéroports de la collection flights en
MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
5.24 requête pour récupérer les noms en MongoDB . . . . . . . . . . . . . . . . . . . 112
5.25 résultat de la requête du listing 5.24 . . . . . . . . . . . . . . . . . . . . . . . . 112
5.26 résultat de la requête du listing B.1 . . . . . . . . . . . . . . . . . . . . . . . . . 113
5.27 deuxième implémentation en MongoDB . . . . . . . . . . . . . . . . . . . . . . 113
5.28 requête pour récupérer les liste des destinations d’une liste de destinations en
MongoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.29 exemple de nœuds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.30 exemple de relations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.31 requête de création en Neo4j . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.32 requête pour créer une contrainte d’unicité en Neo4j . . . . . . . . . . . . . . . 120
5.33 requête Cypher pour créer une contrainte d’existence . . . . . . . . . . . . . . . 120
5.34 requête pour créer les nœuds à partir d’un fichier csv en Neo4j . . . . . . . . . 121
5.35 requête pour créer une relation en Neo4j à partir d’un fichier csv . . . . . . . . 121
5.36 requête pour l’affichage en Cypher . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.37 requête pour récupérer la liste des destinations en Cypher . . . . . . . . . . . . . 122
5.38 requête du listing 5.37 sous forme d’un graphe . . . . . . . . . . . . . . . . . . . 123
5.39 requête pour récupérer les destinations en moins de 2h en Cypher . . . . . . . . . 123
279
5.40 requête pour chercher la destination la moins chère en Cypher . . . . . . . . . . 123
5.41 requête pour récupérer les noms en Cypher . . . . . . . . . . . . . . . . . . . . 124
5.42 requête pour répondre au problème de 2-hops en Neo4j . . . . . . . . . . . . . 124
6.1 requête pour les statistiques de la base de données optimode . . . . . . . . . . . 140
6.2 résultats de la requête 6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.3 nombre de documents de la collection airport . . . . . . . . . . . . . . . . . 142
6.4 nombre de documents correspondant à des structures géographiques . . . . . . . 142
6.5 Top 5 des aéroports français . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
6.6 requête des statistiques de la collection airport . . . . . . . . . . . . . . . . . 142
6.7 statistiques de la collection airport . . . . . . . . . . . . . . . . . . . . . . . 142
6.8 statistiques de la collection airport en kilobyte . . . . . . . . . . . . . . . . . 143
6.9 taille de la collection airport . . . . . . . . . . . . . . . . . . . . . . . . . . 143
6.10 exemple d’extrait de document de la collection segment . . . . . . . . . . . . . 143
6.11 requête des statistiques de la collection segment . . . . . . . . . . . . . . . . . 144
6.12 résultat de la requête du listing 6.11 . . . . . . . . . . . . . . . . . . . . . . . . 144
6.13 requête pour trouver l’ancien year_month dans la collection segment . . . . 144
6.14 résultat de la requête du listing 6.13 . . . . . . . . . . . . . . . . . . . . . . . . 145
6.15 requête pour trouver le year_month le plus récent dans la collection segment 145
6.16 résultat de la requête du listing 6.15 . . . . . . . . . . . . . . . . . . . . . . . . 145
6.17 segments avec moins de dix passagers par mois. . . . . . . . . . . . . . . . . . . 149
6.18 requête pour trouver la liste des régions des aéroports sans coordonnées géogra-
phiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
6.19 segments sans horaires de vols . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
6.20 segments de vols sans informations sur le trafic . . . . . . . . . . . . . . . . . . 151
6.21 script pour l’analyse des collections en Python . . . . . . . . . . . . . . . . . . 151
6.22 requête pour le nombre des compagnies aériennes LCC . . . . . . . . . . . . . . 152
6.23 requête pour des compagnies aériennes sans catégorie . . . . . . . . . . . . . . . 152
6.24 requête pour le calcul du Pax . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
6.25 requête pour trouver les documents correspondant aux données ferroviaires . . . 156
6.26 requête pour trouver les documents correspondant aux données de bus . . . . . . 156
7.1 requête pour récupérer les aéroports . . . . . . . . . . . . . . . . . . . . . . . . 171
7.2 requête pour l’agrégation de la collection segment . . . . . . . . . . . . . . . . 174
7.3 requête pour l’agrégation de la collection schedule. . . . . . . . . . . . . . . 174
7.4 requête pour le test 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.5 script de vérification du CFN en Cypher. . . . . . . . . . . . . . . . . . . . . . . 179
7.6 requête pour le calcul des nœuds isolés. . . . . . . . . . . . . . . . . . . . . . . 180
7.7 requête pour la suppression des nœuds. . . . . . . . . . . . . . . . . . . . . . . . 180
7.8 requête pour l’estimation des arcs manquants. . . . . . . . . . . . . . . . . . . . 180
7.9 requête pour l’estimation des arcs manquants pour une paire de nœuds. . . . . . . 181
7.10 requête pour l’estimation des arcs sans la propriété revenu minmum. . . . . . . . 181
7.11 requête pour le calcul des composantes connexes. . . . . . . . . . . . . . . . . . 181
7.12 requête pour le nombre et la taille des composantes connexes. . . . . . . . . . . . 182
7.13 requête pour le calcul des nœuds isolés pour le mois de janvier de 2016. . . . . . 182
7.14 requête pour le calcul des composantes fortement connexes. . . . . . . . . . . . 182
7.15 requête pour calculer le nombre des nœuds sources pour le mois janvier 2016 . . 183
7.16 requête pour calculer le nombre des nœuds puits pour le mois de janvier 2016. . . 183
7.17 requête pour le calcul des composantes fortement connexes pour une période d’un
an. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.18 requête pour le calcul des composantes fortemment connexes pour une période
d’un an. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
7.19 requête pour le calcul de la densité. . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.20 requête pour la distribution des degrés . . . . . . . . . . . . . . . . . . . . . . . 187
7.21 requête pour trouver les aéroports ayant moins de 5 destinations . . . . . . . . . 189
7.22 requête pour le calcul du diamètre proposé dans l’article Hölsch et al. [2017] . . . 192
7.23 requête du listing 7.22 pour le mois de janvier 2016 . . . . . . . . . . . . . . . . 192
7.24 requête pour le calcul du diamètre du graphe condensé . . . . . . . . . . . . . . 193
7.25 requête pour la localisation géographique en Cypher . . . . . . . . . . . . . . . 197
7.26 requête pour trouver les aéroports qui ont moyen et long courrier . . . . . . . . . 198
7.27 requête pour trouver la liste des destinations en Cypher . . . . . . . . . . . . . . 198
7.28 requête pour trouver la liste des compagnies aériennes en Cypher . . . . . . . . . 198
8.1 résolution avec une requête Cypher pour un seul critère . . . . . . . . . . . . . . 210
B.1 programme pour récupérer la liste des destinations Python . . . . . . . . . . . 287
D.1 partie du programme pour l’identification des hubs en Python . . . . . . . . . . 291
E.1 requête pour la première étape du calcul de la fréquence directe. . . . . . . . . . 294
E.2 requête pour la première étape du calcul de la fréquence indirecte. . . . . . . . . 295
E.3 requête pour la deuxiéme étape du calcul de la fréquence indirecte. . . . . . . . . 296
E.4 requête pour trouver la liste des destinations desservies par chaque compagnie
aérienne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
E.5 requête de la contraction du graphe en Cypher pour la direction sortante . . . . . 297
E.6 requête pour le calcul du niveau de service. . . . . . . . . . . . . . . . . . . . . 298
E.7 requête pour le calcul de la fréquence et la capacité. . . . . . . . . . . . . . . . . 298
E.8 requête pour le calcul des critères de la distance et le revenu et la durée. . . . . . 298
E.9 requête pour le calcul des critères de la qualité de la correspondance . . . . . . . 299
E.10 requête de prétraitement par lot . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
E.11 requête pour l’estimation des arcs crées . . . . . . . . . . . . . . . . . . . . . . 300
Liste des Algorithmes
1 SCAN(x) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
2 Dijkstra Algorithm(DA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3 Bellman Algorithm(BA) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
283
Annexes
A Description des données
Voici les fichiers des données sur les aéroports et les vols utilisés dans ce chapitre.
Code Name
NCE Nice Côte d’Azur Airport
CDG Chales De Gaulle Airport
DXB Dubaï International Airport
ICN Incheon International Airport
DOH Hamad International Airport
CMN Mohammed V International Airport
ABJ Félix Houphouët Boigny International Airport
KWI Koweït International Airport
NBO Jomo Kenyatta International Airport
BKK Suvarnabhumi Airport
LIS Lisbon International Airport
ESB Ankara Esenboğa Airport
LHR Heathrow Airport
GLA Glasgow Airport
FNC Madeira Airport
IST Istanbul Atatürk Airport
B Programme 2-hops
Nous fournissons ici le programme proposé pour la méthode 1 de la requête 2-hops en
MongoDB présenté dans la section 5.4.6.2 du chapitre 5.
1 from pymongo import MongoClient
2
3 def destinations(origin):
4 pipe = [
5 {’$match’: {’Origin’: origin}},
6 {’$group’: {
7 ’_id’: None,
8 ’mesDest’: {’$addToSet’: ’$Destination’}}}]
9 cursor = db.flights.aggregate(pipe)
10 return cursor
11
12 def destinationsDeMesDest(orgListDest,listDest):
13 pipe = [
14 {’$match’: {’Origin’: {’$in’:listDest},
15 ’Destination’:{’$nin’:orgListDest}}},
16 {’$group’: {
17 ’_id’: None,
18 ’leurDest’: {’$addToSet’: ’$Destination’}}}]
19 cursor = db.flights.aggregate(pipe)
20 return cursor
21
22 def main():
23 print("connect to flightdatabase")
24 # Create a new connection to MongoDB instance
25 connection = MongoClient()
26 # Create and get a data base (db) from this connection
27 db = connection.testFlightDB
28
29 origin = ’NCE’
30 listDest = destinations(origin)
31 for doc in listDest:
32 mesDest = doc[’mesDest’]
33 orgListDest = list(mesDest) + [origin]
34 desMesDest = destinationsDeMesDest(orgListDest, mesDest)
35 for doc in desMesDest:
36 leurDest = doc[’leurDest’]
37
38 print("liste des destinations: ", leurDest)
39
40 if __name__ == ’__main__’:
41 main()
Listing B.1 – programme pour récupérer la liste des destinations Python
1 db . s c h e d u l e _ i n i t i a l _ d a t a . a g g r e g a t e ( [
2 {
3 ’$match’ : {
4 ’record_ok’ : t r u e ,
5 ’active_rec’ : t r u e ,
6 ’flights_dates’ : {
7 ’$gte’ : ISODate ( "2019-03-11T00:00:00.000Z" ) ,
8 ’$lte’ : ISODate ( "2019-03-17T00:00:00.000Z" ) } ,
9 ’year_month’ : {’$gte’ : ’2019-03’ , ’$lte’ : ’2019-03’ } ,
10 ’origin’ : $o ,
11 ’destination’ : $d ,
12 ’code_share’ : f a l s e ,
13 ’schedule_type’ : ’AIR’
14 }
15 } ,
16 {’$unwind’ : ’$flights_dates’ } ,
17 {’$match’ : {’flights_dates’ : {
18 ’$gte’ : ISODate ( "2019-03-11T00:00:00.000Z" ) ,
19 ’$lte’ : ISODate ( "2019-03-17T00:00:00.000Z" ) } } } ,
20 {
21 ’$group’ : {
22 ’_id’ : {
23 ’origin’ : ’$origin’ ,
24 ’operating_airline’ : ’$operating_airline’ ,
25 ’hour’ : ’$arrival_time.hour’ ,
26 ’mn’ : ’$arrival_time.mn’ ,
27 ’flight_date’ : ’$flights_dates’
28 }
29 }
30 },
31 {
32 ’$group’ : {
33 ’_id’ : 1 ,
34 ’count’ : {’$sum’ : 1}
35 }}] ,{ allowDiskUse : true })
Listing E.1 – requête pour la première étape du calcul de la fréquence directe.
1 db . s c h e d u l e _ i n i t i a l _ d a t a . a g g r e g a t e ( [
2 {
3 ’$match’ : {
4 ’record_ok’ : t r u e ,
5 ’active_rec’ : t r u e ,
6 ’flights_dates’ : {
7 ’$gte’ : ISODate ( "2019-03-11T00:00:00.000Z" ) ,
8 ’$lte’ : ISODate ( "2019-03-17T00:00:00.000Z" ) } ,
9 ’year_month’ : {’$gte’ : "2019-03" , ’$lte’ : "2019-03" } ,
10 ’origin’ : $o ,
11 ’code_share’ : f a l s e ,
12 ’schedule_type’ : ’AIR’ } } ,
13 {’$unwind’ : ’$flights_dates’ } ,
14 {’$match’ : {’flights_dates’ : {
15 ’$gte’ : ISODate ( "2019-03-11T00:00:00.000Z" ) ,
16 ’$lte’ : ISODate ( "2019-03-17T00:00:00.000Z" ) } } } ,
17 {
18 ’$group’ : {
19 ’_id’ : {
20 ’connection’ : ’$destination’ ,
21 ’base_airport’ : ’$o’ ,
22 ’operating_airline’ : ’$operating_airline’ ,
23 ’hour’ : ’$arrival_time.hour’ ,
24 ’mn’ : ’$arrival_time.mn’
25 },
26 ’flights_dates’ : {
27 ’$addToSet’ : ’$flights_dates’ } , } }
28 ] , { a l l o w D i s k U s e : t r u e } )
Listing E.2 – requête pour la première étape du calcul de la fréquence indirecte.
Le dernier bloc group de la requête ci-dessous permet de regrouper le résultat pour chaque
paire (origine, d).
1 db . s c h e d u l e _ i n i t i a l _ d a t a . a g g r e g a t e ( [
2 {
3 ’$match’ : {
4 ’record_ok’ : t r u e ,
5 ’active_rec’ : t r u e ,
6 ’flights_dates’ : {
7 ’$gte’ : ISODate ( "2019-03-11T00:00:00.000Z" ) ,
8 ’$lte’ : ISODate ( "2019-03-17T00:00:00.000Z" ) } ,
9 ’year_month’ : {’$gte’ : "2019-03" , ’$lte’ : "2019-03" } ,
10 ’destination’ : $d ,
11 ’code_share’ : f a l s e ,
12 ’schedule_type’ : ’AIR’ } } ,
13 {’$unwind’ : ’$flights_dates’ } ,
14 {’$match’ : {’flights_dates’ : {
15 ’$gte’ : ISODate ( "2019-03-11T00:00:00.000Z" ) ,
16 ’$lte’ : ISODate ( "2019-03-17T00:00:00.000Z" ) } } } ,
17 {
18 ’$group’ : {
19 ’_id’ : {
20 ’connection’ : ’$origin’ ,
21 ’base_airport’ : ’$d’ ,
22 ’operating_airline’ : ’$operating_airline’ ,
23 ’hour’ : ’$arrival_time.hour’ ,
24 ’mn’ : ’$arrival_time.mn’
25 },
26 ’flights_dates’ : {
27 ’$addToSet’ : ’$flights_dates’ } , } }
28 ] , { a l l o w D i s k U s e : t r u e } )
Listing E.3 – requête pour la deuxiéme étape du calcul de la fréquence indirecte.
1 db . s c h e d u l e _ i n i t i a l _ d a t a . a g g r e g a t e ( [
2 {
3 ’$match’ : {
4 ’record_ok’ : t r u e ,
5 ’active_rec’ : t r u e ,
6 ’flights_dates’ : {
7 ’$gte’ : ISODate ( "2019-03-11T00:00:00.000Z" ) ,
8 ’$lte’ : ISODate ( "2019-03-17T00:00:00.000Z" ) } ,
9 ’year_month’ : {’$gte’ : "2019-03" , ’$lte’ : "2019-03" } ,
10 ’origin’ : $o ,
11 ’code_share’ : f a l s e ,
12 ’schedule_type’ : ’AIR’ } } ,
13 {’$unwind’ : ’$flights_dates’ } ,
14 {’$match’ : {’flights_dates’ : {
15 ’$gte’ : ISODate ( "2019-03-11T00:00:00.000Z" ) ,
16 ’$lte’ : ISODate ( "2019-03-17T00:00:00.000Z" ) } } } ,
17 {
18 ’$group’ : {
19 ’_id’ : {
20 ’operating_airline’ : ’$operating_airline’ ,
21 },
22 ’destinations’ : {’$addToSet’ : ’$destination’}
23 }}])
Listing E.4 – requête pour trouver la liste des destinations desservies par chaque compagnie aé-
rienne.
1 MATCH (h:Hub:Airport),(a:Arrival)
2 WHERE h.code <> a.code
3 CALL apoc.algo.dijkstra(h,a,’2017-10>|BOARD_AT|CONNECT_TO>’, ’duration_min’)
YIELD path AS pH, weight AS dur
4 WITH path, duration, SIZE([node IN NODES(path)[2..-1] WHERE node:Hub]) / 2 AS
wei,
5 apoc.coll.sum([rel IN RELATIONSHIPS(path) | COALESCE(rel.distance, 0)]) AS
distance,
6 apoc.coll.sum([rel IN RELATIONSHIPS(path) | COALESCE(rel.revenue_min, 0)]) AS
revenue,
7 apoc.coll.min([rel IN RELATIONSHIPS(path) WHERE EXISTS(rel.frequency) | rel.
frequency]) AS frequency,
8 apoc.coll.min([rel IN RELATIONSHIPS(path) WHERE EXISTS(rel.capacity) | rel.
capacity]) AS capacity
9 RETURN {path:path, duration:duration, wei:wei, distance:distance, revenue:
revenue, frequency:frequency, capacity:capacity} AS path
Listing E.8 – requête pour le calcul des critères de la distance et le revenu et la durée.
La requête du listing E.9 consiste à calculer les critères de la catégorie : qualité de la corres-
pondance.