TPA : Mincut, maxflow et réseaux de distribution d’eau

Je viens de regarder une vidéo intitulée Efficient Maximum Flow Algorithms (en anglais), et comme je me demandais depuis quelques jours ce dont je pourrais bien parler dans un TPA, c’est arrivé à point nommé. Donc, aujourd’hui, on va parler de « max flow » ou, en français, « flot maximum ». Commençons par donner un petit exemple. Supposons qu’on veuille trimbaler de l’eau depuis un point A à un point B. Pour cela, on dispose d’un réseau de tuyaux qui ont tous une certaine capacité, en terme de nombre de litres par seconde qui peuvent y circuler, et on se pose la question de savoir combien de litres par seconde peuvent arriver au point A. Faisons un petit dessin :

On a le point A, le point B, quelques points intermédiaires reliés par des tuyaux, et la capacité de chaque tuyau est indiquée sur chaque tuyau. Sur un « petit » réseau comme celui-ci, on peut s’en sortir en regardant très fort le schéma et en tentant de répartir l’eau au maximum dans les tuyaux de façon à ce qu’aucun tuyau ne soit en surcapacité, sinon ça explose et ça fait désordre (spoiler : sauf erreur grossière de ma part, on arrive avec ce réseau à 5600 litres par seconde).

Évidemment, plus le réseau est compliqué, plus le calcul l’est, et au-delà d’une certaine taille ça devient franchement pénible à faire à la main. Beaucoup de gens se sont intéressés au problème, qui est à la fois considéré comme un problème « classique » voire « résolu » (par exemple la bibliothèque C++ Boost a quelques implémentations pour le résoudre), et comme un domaine actif de recherche (il est, par exemple, en couverture du numéro d’août des Communications of the ACM). Au lieu de parler de litres d’eau et de tuyaux, on utilise notre modèle préféré, qui est celui d’un graphe (comme le laisse vaguement sous-entendre mon petit schéma au-dessus) ; le type de graphe qu’on considère a cependant quelques éléments supplémentaires par rapport aux graphes que nous avons manipulés jusqu’ici, par exemple lorsque nous avons parlé du théorème des cinq couleurs. On a, comme d’habitude, des sommets (les points A, B et les points intermédiaires) et des arcs (les tuyaux). Dans les sommets, on a deux sommets « spéciaux », les points A et B, que l’on appelle la source et le puits. Sur les arcs, on a deux informations supplémentaires : la direction, représentée sur le schéma par une flèche (on dit que le graphe est dirigé) et la capacité. Et on veut trimbaler une certaine quantité de trucs, c’est-à-dire un « flot », de A à B. Le problème peut donc être formulé comme « étant donné un graphe dirigé, dont les arcs ont des capacités, et étant donnés une source et un puits, quelle est la quantité maximum de flot qui peut être transportée de A à B ? ». Les algorithmes permettant de répondre à cette question ne sont pas forcément très compliqués, mais ils sont plus longs que ce que j’ai envie de détailler ici. Il en existe plusieurs, et il peut être intéressant de ne pas utiliser les mêmes en fonction du graphe considéré (on n’utilisera par exemple pas forcément le même algorithme pour un graphe ayant peu ou beaucoup d’arcs).

Considérons maintenant un autre problème. Supposons que j’aie une fuite massive d’eau en B, et que je veuille couper l’eau qui arrive en B en coupant la circulation dans des tuyaux, et ce de la manière la plus « efficace » possible. L’efficacité, dans mon exemple imaginaire, se mesure en débit total des tuyaux que je coupe : je veux le minimiser, pour que la reprise du service soit la plus facile possible. Quels tuyaux dois-je couper ? Il faut impérativement que je coupe le tuyau direct à 4000 entre A et B (sinon j’ai forcément de l’eau qui continue à arriver en B). Je peux couper tout ce qui arrive en B : j’ai deux tuyaux à 1000 et un à 900, ça fait un « coût » total de 2900. Mais en regardant d’un peu plus près mon graphe, plutôt que de couper l’arrivée en B, si je coupe les départs en A (hors la ligne à 4000, qui est coupée quoi qu’il arrive), je peux m’en sortir pour 2300, c’est mieux. Et en regardant d’encore plus près, si au lieu de couper le tuyau à 2000 je coupe celui à 500 et celui à 800, je descends à 1600 (300 + 500 + 800). Coïncidence amusante, si je fais la somme de tous les tuyaux que je coupe (4000+300+500+800), j’obtiens le même nombre que le nombre maximum de litres que je peux faire circuler dans mon réseau entre A et B, c’est à dire 5600.

Il se trouve que ce n’est pas une coïncidence. Ce second problème est connu sous le nom de « min cut » ou, en français, « coupe minimum » : étant donné un graphe avec des coûts ou poids sur les arcs, comment déconnecter deux points donnés A et B en supprimant des arcs de manière à ce que la somme de leurs poids soit minimum ? Et étant donné un graphe dirigé avec des capacités/poids, le théorème dit « min cut/max flow » dit que, pour toutes les paires de sommets A et B du graphe, la quantité maximum de flot qui peut aller de A à B est égale au poids minimum des arcs à supprimer pour déconnecter A et B. Pour donner une idée de la preuve, on peut voir qu’une coupe (un ensemble d’arcs qui, lorsqu’on les supprime, déconnecte A et B) est un goulot d’étranglement : il est impossible de faire passer plus de flot entre A et B que la capacité des arcs qui forment cette coupe. Ça permet de déduire que le flot maximum est forcément inférieur (ou égal) au poids de la coupe minimum. L’autre direction (montrer que la valeur de la coupe minimum est effectivement atteinte) est un peu plus délicate. L’idée est que si on a un flot maximum, alors on a des arcs qui sont saturés, c’est-à-dire que pour que le flot puisse passer de A à B, il faut faire passer une valeur de flot égale à la capacité de l’arc par l’arc en question. Si ce n’était pas le cas, on pourrait augmenter le flot, ce qui ne peut pas arriver (puisqu’on considère un flot maximum). On peut aussi voir que tous les chemins de A à B contiennent au moins un arc saturé – sinon, on pourrait augmenter le flot sur le chemin en question. Maintenant, on explore le graphe en partant de A, en avançant sur tous les chemins possibles, et on marque tous les sommets que l’on peut atteindre sans passer par un arc saturé. Si on retire tous les arcs qui partent de cet ensemble de sommets marqués vers l’ensemble des sommets non-marqués, on obtient une coupe (sinon il existerait un chemin de A à B contenant un arc non saturé). De plus, ces arcs sont saturés, et la somme de leur poids est exactement la valeur du flot maximum (puisqu’il s’agit de l’ensemble des arcs qui sortent de l’ensemble des sommets marqués). Donc la valeur de flot maximum est égale à la valeur d’une coupe, elle-même supérieure ou égale à la valeur de la coupe minimum. Tout ceci nous permet de déduire que la valeur de la coupe minimum est égale à la valeur du flot maximum (puisqu’elle lui est à la fois inférieure ou égale et supérieure ou égale), et donc on est contents. Pour une certaine définition de « contents » – l’idée de la preuve que j’ai donnée ici n’est pas des plus rigoureuse (en espérant qu’elle soit correcte, il a fallu que je m’y reprenne à trois ou quatre fois…), mais j’espère en avoir donné tout de même une idée raisonnable !

#balisebooks – Juin 2014

Quoi ? Poster le #balisebooks de juin le 1er juillet ? mais tout se perd…

Le mois de mai était peu inspirant, le mois de juin l’est bien plus, sur 6 bouquins lus, j’en ai mis 3 à 5 étoiles sur mon GoodReads – c’est rare.

Gameboard of the Gods, de Richelle Mead (L’Échiquier des dieux, en français) est le premier tome de la série Age of X (L’Ère des miracles, en français). On est balancé sans beaucoup de préliminaires dans une société future séparée en deux gros blocs principaux (en gros l’Amérique du nord (RUNA) et la Chine/Russie (EA)) et les « provinces » considérées comme plus ou moins barbares. Justin March a été exilé à Panama (l’une de ces provinces, donc) suite à des événements qui seront expliqués… plus tard. Mae Koskinen est une super-soldat du RUNA, et sa mission initiale est d’aller rechercher Justin March pour le sortir de son exil, pour des raisons initialement peu claires (mais qui, encore une fois, finissent par s’éclaircir). On ajoute à ça que, sur une base de société a priori très rationnelle et anti-religieuse, les dieux de panthéons divers ont apparemment une certaine tendance à laisser des empreintes de gros doigts partout, et ça donne Gameboard of the Gods. Et ben, c’est chouette. Ça me paraît un niveau au-dessus de Vampire Academy (bon, c’est pas très dur) et de Succubus (déjà plus dur, c’est pas mal, Succubus) et, une fois passé le « choc » du peu d’explications sur l’univers en question, on se retrouve avec un bouquin difficile à lâcher.

Unlocked: An Oral History of Haden’s Syndrome, de John Scalzi (pas encore de traduction en français) est une intro au prochain bouquin de Scalzi, Lock In. C’est l’histoire du syndrome d’Haden, une pandémie qui s’étend dans un futur relativement proche. Beaucoup de morts dans la première vague, et un certain nombre de gens se retrouvent conscients dans un corps presque complètement paralysé (en gros, le cœur et les poumons marchent, mais c’est à peu près tout). Unlocked raconte le début de cette épidémie et les différentes réponses apportées aux problèmes générés, le tout sous la forme de témoignages et d’interviews de gens qui y assistent. Ça se lit tout seul, et c’est super enthousiasmant pour Lock In (qui sort cet été… je sens qu’il va faire partie des trucs que je vais acheter au prix fort dès sa sortie).

The Alloy of Law, de Brandon Sanderson (L’Alliage de la justice, en français) se passe quelque 300 ans après la trilogie Mistborn – en gros, on mélange l’univers de Retour vers le futur III avec celui de Mistborn, on obtient celui de Alloy of Law. On a en gros la ville, Elendel, et le far-west autour. Waxillium « Wax » Landrian est né dans une bonne famille d’Elendel, a été shérif en-dehors de la ville, et revient maintenant à Elendel pour se marier et se ranger. Évidemment, c’est pas aussi simple : des convois de marchandises sont volés, sa fiancée est kidnappée, et Wax se retrouve, aidé par son acolyte Wayne et par la cousine de sa fiancée Marasi, au milieu de tout ce cirque. C’est drôle, les persos sont très chouettes, et en fait je me demande a posteriori pourquoi il a pas gagné ses 5 étoiles. Une suite semble prévue pour la fin de cette année, ça paraît une bonne idée.

Dark Currents, de Jacqueline Carey (pas de traduction française pour l’instant), est le premier tome de la série Agent of Hel. On y rencontre Daisy Johanssen, fille de démon, habitante de Pemkowet (le hub surnaturel du coin) et liaison humains/eldritch de Hel, déesse nordique. Un gamin est mort noyé dans des circonstances pas nettes, et Daisy se retrouve à enquêter. C’est plaisant, ça a clairement un feeling « Sookie Stackhouse », et c’est clairement en-deçà des Kushiel (et oui, c’était le reproche que je faisais aux Saints Astray aussi). Mais bon, on ne boude tout de même pas son plaisir.

A Widow for One Year, de John Irving (Une Veuve de papier, en français), est un des premiers bouquins que je relis depuis que j’ai commencé à écrire les #balisebooks (et/ou à lire sur tablette plutôt que sur papier, la corrélation exacte n’est pas claire). On y suit essentiellement quatre personnages, Ted Cole, Marion Cole, leur fille Ruth Cole, et Eddie O’Hare, embauché comme assistant/chauffeur de Ted alors que Ruth a quatre ans. L’histoire se passe à trois époques, lorsque Ruth a 4 ans, 36 ans et 41 ans, respectivement.  La première partie est centrée autour d’Eddie, la deuxième et la troisième partie sont plutôt centrées autour de Ruth. Il y a juste la bonne dose d’invraisemblance, c’est plutôt drôle, parfois dérangeant – bref, c’est pas mon Irving préféré (parce que c’est Cider House Rules, évidemment), mais ça reste de l’Irving, quoi. Bizarrement, j’avais déjà lu celui-ci il y a plusieurs années, et beaucoup de détails me sont revenus à la lecture, mais l’histoire principale m’avait complètement échappé.

The Martian, d’Andy Weir (pas encore de traduction en français) est, comment dire, absolument phénoménal. C’est l’histoire de Mark Watney qui, par un concours de circonstances idiot, se retrouve échoué tout seul sur Mars. Heureusement, il a quelques ressources à sa disposition, un cerveau en état de fonctionnement et une propension à transformer le désespoir en humour. J’ai éclaté de rire à plusieurs moments, j’ai été émue aux larmes (vraiment), et j’ai frénétiquement tourné les pages pour savoir CE QU’IL ALLAIT SE PASSER AAAAH plus d’une fois. C’est un peu « bon, j’ai ce problème à résoudre, comment résoudre ça ? <intense yak shaving> <problème résolu> et le problème suivant est… » pendant 350 pages, mais c’est très très bien fait. Et puis bon, c’est quand même un type qui résout tout un tas d’emmerdes avec de la SCIENCE et de l’ingénierie (et du duct tape), et ça fait du bien à lire, voilà (d’autant plus que la science est crédible, du moins à mon petit niveau). Très chaudement recommandé.

S’il n’y en avait qu’un à lire… The Martian.