Juste Milieu

La méthode

Comment on trouve le juste milieu.

Pas de barycentre, pas de distance à vol d'oiseau : chaque lieu envisagé est évalué avec les temps de trajet réels de chaque participant, puis classé selon trois définitions explicites de ce qu'est un « bon » point de rendez-vous.

01

Le principe

Le centre géographique d'un groupe est un mauvais point de rendez-vous : il ignore les lignes de métro, les ponts, les autoroutes et les vitesses de chacun. Deux amis peuvent être à 5 km l'un de l'autre et à 40 minutes de trajet.

Juste Milieu raisonne donc en minutes porte-à-porte. Pour un lieu candidat c et chaque participant i, on calcule le temps de trajet réel tᵢ(c) avec son propre moyen de transport, puis on cherche le lieu qui optimise un critère sur le vecteur (t₁, …, tₙ).

02

Les données

  • Transports en commun — Transitous (moteur MOTIS) alimenté par les données GTFS officielles des réseaux (IDFM, SNCF, réseaux urbains…). Marche d'accès, attente et correspondances sont incluses. Les itinéraires sont calculés pour arriver au plus tard à l'heure du rendez-vous.
  • Voiture — OSRM sur le réseau routier OpenStreetMap (Valhalla en secours). Les temps sont hors trafic et hors stationnement : c'est affiché comme tel.
  • Vélo et marche — Valhalla (profils cycliste et piéton OpenStreetMap), OSRM en secours.
  • Adresses — Base Adresse Nationale (IGN) pour les adresses françaises, Photon (OpenStreetMap) pour les lieux et l'international. Lieux (cafés, bistrots, parcs…) : Photon / OpenStreetMap, Overpass en secours.

03

L'algorithme, étape par étape

  1. 1. Délimiter la zone utile. On prend l'enveloppe convexe des points de départ, élargie d'une marge m proportionnelle au diamètre D du groupe :
    m = 0,15 × Dbornée entre 0,8 km et 15 km
  2. 2. Explorer. La zone est couverte par une grille hexagonale d'environ 64 points (couverture uniforme, pas s calculé à partir de l'aire), complétée de « graines » : barycentre, médiane géométrique (algorithme de Weiszfeld), centre du plus petit cercle englobant (Welzl) et milieux des paires. Ces points ne sont jamais choisis pour leur distance : ils servent à cartographier la surface des temps de trajet.
    s = √( A / (64 × √3/2) )aire d'une cellule hexagonale = s²·√3/2
    Pour chaque point et chaque participant, on obtient un temps réel : matrices de temps des moteurs routiers (une requête couvre des dizaines de points), et pour les transports en commun une requête « un-vers-tous » qui renvoie l'heure d'arrivée à chacun des milliers d'arrêts atteignables :
    tᵢ(c) = min( marche(i→c) , minₛ [ arrivéeᵢ(s) + marche(s→c) ] )s : arrêts à moins de 1,8 km
  3. 3. Se recentrer sur de vrais lieux. Les 4 meilleures zones de chaque stratégie sont retenues. Dans un rayon de max(700 m, 0,9·s) autour d'elles, on récupère les gares et stations (lieux où l'on se donne naturellement rendez-vous), plus 6 points d'affinage autour du meilleur point de chaque stratégie. Tous sont évalués avec les temps réels.
  4. 4. Vérifier. Pour la présélection (3 meilleurs lieux « compromis », 2 « équilibrés », 2 « rapides »), on calcule l'itinéraire porte-à-porte exact de chaque participant en transports en commun (lignes, correspondances, marche).
  5. 5. Choisir. Chaque stratégie désigne son lieu parmi les lieux vérifiés. Les minutes sont arrondies à l'unité avant le calcul des métriques : ce qui est affiché est exactement ce qui a été classé.

04

Les métriques

Pour un lieu et n participants de temps t₁ … tₙ (en minutes) :

T = Σ tᵢtemps total cumulé
μ = T / ntemps moyen
M = max tᵢ · m = min tᵢ · R = M − mtrajet le plus long, le plus court, écart
σ = √( Σ (tᵢ − μ)² / n )écart-type : la dispersion des trajets
E = 100 × (1 − σ / (μ + 5))indice d'équité, de 0 à 100

L'indice d'équité vaut 100 quand tout le monde voyage exactement autant. Les 5 minutes ajoutées au dénominateur évitent de juger « inéquitable » un écart de 3 minutes entre deux trajets à pied très courts. Lecture : ≥ 90 excellente, ≥ 80 bonne, ≥ 65 moyenne, en dessous faible.

05

Les trois stratégies

C — Le plus rapide

argmin Tdépartage : trajet le plus long

L'optimum « utilitariste » : le moins de minutes au total. Il favorise souvent les participants nombreux d'un même côté, au détriment des plus éloignés.

B — Le plus équilibré

argmin R sous la contrainte M ≤ 1,15 × M* + 2 minM* : le plus petit trajet maximal possible

On minimise l'écart entre le trajet le plus long et le plus court. Sans contrainte, ce critère pourrait choisir un lieu où tout le monde voyage une heure — « équitable » mais absurde. On ne retient donc que les lieux où personne n'a un trajet excessif (au plus 15 % au-dessus du meilleur trajet maximal possible), puis on départage par l'écart-type.

A — Le meilleur compromis (recommandé)

argmin μ + λ·σcritère moyenne–dispersion, λ = 1

Chaque minute de dispersion coûte autant qu'une minute de trajet moyen. Ce critère, classique en aide à la décision, récompense les lieux à la fois rapides et justes ; les deux unités étant des minutes, aucune normalisation arbitraire n'est nécessaire.

Quand deux stratégies désignent le même lieu, c'est indiqué tel quel (« = A ») : c'est le signe d'un lieu robuste, bon sur plusieurs critères à la fois. Les « autres lieux envisagés » permettent d'explorer des alternatives.

06

Données réelles ou simulées

Chaque durée porte sa provenance : itinéraire réel (réseau OpenStreetMap), horaires réels (transports en commun) ou estimation. Si un service ne répond pas, l'application continue avec un modèle d'estimation et l'affiche clairement (symbole ≈, barres hachurées, bandeau d'avertissement) :

t ≈ d / v(d) + temps fixes (accès, attente, stationnement)d : distance à vol d'oiseau × facteur de détour (1,25 à 1,35)

Le mode démo (case à cocher dans le formulaire, ou DEMO_MODE=true) n'appelle aucun service externe : adresses issues d'un petit répertoire embarqué, durées simulées, lieux fictifs — le tout signalé.

07

Architecture

Next.js (App Router, TypeScript), Tailwind CSS, Leaflet. Le calcul tourne côté serveur (route /api/optimize) et envoie sa progression en continu au navigateur. Chaque service externe est derrière une interface (géocodage, matrices de temps, transports, lieux) avec une chaîne de secours : remplacer OSRM par GraphHopper, ou Transitous par Navitia, ne touche pas à l'algorithme. Les résultats sont stockés pour être partagés par un simple lien.

08

Limites connues

  • Voiture : pas de trafic en temps réel ni de temps de stationnement.
  • Transports : horaires théoriques, sans perturbations en temps réel.
  • Les services publics gratuits utilisés ont des quotas : pour un usage à grande échelle, il faut héberger ses propres instances.
  • Les lieux proposés (cafés, bistrots…) viennent d'OpenStreetMap : horaires d'ouverture non vérifiés.

Envie de voir l'algorithme à l'œuvre ?

Essayer avec un exemple