# Algorithme de Gale et Shapley

En informatique, l'algorithme de Gale et Shapley est un algorithme qui résout le problème des mariages stables. Il est nommé d'après ses inventeurs David Gale et Lloyd Shapley tous deux mathématiciens et économistes. Dans ce problème, il y a un même nombre d'hommes et de femmes. Chaque homme a des préférences sur les femmes : chaque femme a des préférences sur les hommes. L'objectif est de marier hommes et femmes de façon stable, c'est-à-dire sans qu'il y ait un homme et une femme qui préféreraient quitter leurs partenaires pour se mettre ensemble. Le principe de l'algorithme de Gale et Shapley est le suivant : chaque homme fait des propositions en commençant par la femme qu'il préfère ; les femmes, elles, disposent en fonction de leurs propres préférences.

## Principe et algorithme
### Principe et définitions

En 1962, David Gale et Lloyd Shapley ont prouvé qu'il était toujours possible de résoudre le problème des mariages stables. Ils ont de plus présenté un algorithme permettant de trouver une solution$^,$$^,$$^,$.
L'une des façons de présenter cet algorithme est de fonctionner par étapes. À chaque étape, chaque homme célibataire se propose à la femme qu'il préfère parmi celles à qui il ne s'est jamais proposé (sans regarder si elle est déjà en couple). Chaque femme considère alors les propositions qui lui sont faites (en incluant éventuellement celui avec qui elle est déjà), puis dit « peut-être » à l'homme qu'elle préfère et « non » à tous les autres.
Afin d'écrire formellement l'algorithme de Gale-Shapley, on définit ci-dessous les notions intervenant dans l'écriture de l'algorithme et dans son étude. Soient $\textstyle M$ un ensemble d’hommes et $\textstyle W$ un ensemble de femmes tous deux de cardinal $\textstyle n$ et supposés disjoints.
* On appelle ensemble de couples engagés un ensemble $\textstyle S\subset M\times W$ tel que tout élément de $\textstyle M\cup W$ n’apparaît au plus que dans un seul couple de $\textstyle S$. Cela revient à dire que la polygamie n’est pas prise en compte dans l’étude des problèmes des mariages stables.
* Pour tout homme $\textstyle m\in M$, on appelle relation de préférence de $\textstyle m$ une relation d’ordre total stricte sur $\textstyle W$, notée $\textstyle >_{m}$. Si $\textstyle w\in W$ et $\textstyle w'\in W$, on dit que $\textstyle m$ préfère $\textstyle w$ à $\textstyle w'$ si : $\textstyle w>_{m}w'$. On définit, pour toute femme $\textstyle w\in W$, la relation de préférence de $\textstyle w$, notée $\textstyle >_{w}$, comme ci-dessus.
On note $\textstyle L$ la famille des relations de préférence de tous les hommes de $\textstyle M$ et de toutes les femmes de $\textstyle W$, c’est-à-dire que : $\textstyle L=((>_{m})_{m\in M}\,;(>_{w})_{w\in W})$
* Étant donnés une famille $\textstyle L$ et un ensemble de couples engagés $\textstyle S$, on dit qu’un couple $\textstyle (m;w')\in M\times W$ est une instabilité pour $\textstyle S$ s’il existe des couples $\textstyle (m;w)\in S$ et $\textstyle (m';w')\in S$ tels que : $\textstyle w'>_{m}w$ et $\textstyle m>_{w'}m'$.

### Pseudo-code
## Propriétés

Cet algorithme assure que, étant donnés un ensemble d’hommes $\textstyle M$, un ensemble de femmes $\textstyle W$ tous deux de cardinal $\textstyle n$ et supposés disjoints, une famille $\textstyle L$ de relations de préférences et $\textstyle S$ un ensemble des couples engagés (homme ; femme) renvoyé par l’algorithme :

### Au plus n$^2$ itérations

Le nombre d’itérations de la boucle de l’algorithme est d’au plus $\textstyle n^{2}$ : On commence par faire quelques remarques qui découlent immédiatement d’observations de l’algorithme de Gale-Shapley :
* Toute femme $\textstyle w\in W$ reste engagée jusqu’à la fin d’une exécution de l’algorithme dès qu’elle a reçu une première proposition d’engagement. De plus, la liste de partenaires de $\textstyle w$ engagés avec elle au cours d’une exécution de l’algorithme devient « de mieux en mieux » au sens de la relation de préférence de $\textstyle w$. En d’autres termes, à chaque fois que $\textstyle w$ change de partenaire $\textstyle m\in M$ pour un partenaire $\textstyle m'\in M$ au cours d’une exécution de l’algorithme, on a : $\textstyle m'>_{w}m$.
* Tout homme $\textstyle m\in M$ peut alterner entre engagement et célibat, du début d’une exécution de l’algorithme jusqu’à la fin de cette dernière. De plus, la liste de partenaires de $\textstyle m$ engagées avec lui au cours d’une exécution de l’algorithme devient « de pire en pire » au sens de la relation de préférence de $\textstyle m$. En d’autres termes, à chaque fois que $\textstyle m$ change de partenaire $\textstyle w\in W$ pour une partenaire $\textstyle w'\in W$ au cours d’une exécution de l’algorithme, on a : $\textstyle w>_{m}w'$.
Afin de montrer la propriété énoncée ci-dessus, on va exhiber une quantité (entière) qui croît strictement à chaque itération de l’algorithme. Soient $\textstyle C(t)$ l’ensemble des couples $\textstyle (m;w)$ où $\textstyle m$ a fait une proposition à $\textstyle w$ entre le début de l’algorithme et la $\textstyle t^{\text{ème}}$ itération, et $\textstyle n(t)$ le cardinal de l’ensemble $\textstyle C(t)$. De manière équivalente, l’ensemble $\textstyle C(t)$ correspond à l’ensemble des propositions qui ont été faites entre le début de l’algorithme et la $\textstyle t^{\text{e}}$ itération. Alors, on a :
* $\forall$ $\textstyle t,$ $n(t)<n(t+1)$ ;
* $\forall$ $\textstyle t,$ $n(t)\leq n^{2}$.
Ainsi, il ne peut y avoir au plus que $\textstyle n^{2}$ itérations dans l’algorithme.

### Tout le monde finit par être en couple

Si une femme est déjà en couple (après avoir dit « peut-être » à un homme), elle le reste pour toute la suite de l'algorithme. À la fin, il ne peut donc pas y avoir un homme et une femme célibataires, puisque l'homme se sera forcément proposé à la femme à un moment donné.
De manière plus formelle, on va montrer que tout élément de $\textstyle M\cup \textstyle W$apparaît exactement une et une seule fois dans un couple de $\textstyle S$. Pour cela, on va montrer que la propriété
$\textstyle (P)$ : « $\forall$ homme $\textstyle m\in \textstyle M$, $\textstyle m$ est célibataire $\Rightarrow \textstyle m$ ne s’est pas proposé à toutes les femmes $\textstyle w\in \textstyle W$» est un invariant de l’algorithme. Raisonnons par l’absurde et supposons que $\textstyle (P)$ ne soit pas un invariant. Alors, $\textstyle (P)$ est fausse à un instant donné, c’est-à-dire à un tour de boucle donné. Alors : $\exists$ un homme $\textstyle m_{0}$ $\in \textstyle M$, $\textstyle m_{0}$ est célibataire $\land$ $\textstyle m_{0}$ s’est proposé à toutes les femmes $\textstyle w\in \textstyle W$. Donc, nécessairement, toutes les femmes $\textstyle w\in \textstyle W$ sont engagées avec d’autres hommes. Or, les ensembles $\textstyle M$ et $\textstyle W$ étant de même cardinal et une même femme ne pouvant s’engager avec deux hommes différents d’après l’algorithme (voir fonction mariageStable ci-dessus), cela signifie que $\textstyle m_{0}$ est engagé avec une femme. On a donc une contradiction avec l’affirmation de départ : « $\textstyle (P)$ n’est pas un invariant ». C’est donc que $\textstyle (P)$ est un invariant, et donc, celui-ci est vrai pour tous les tours de boucle de l’algorithme.
Ainsi, en quittant l’algorithme, la condition de la boucle est fausse. Donc : $\forall$ homme $\textstyle m\in \textstyle M$, $\textstyle m$ est engagé $\lor$ $\textstyle m$ s’est proposé à toutes les femmes $\textstyle w\in \textstyle W$. Soit $\textstyle m\in \textstyle M$. Si $\textstyle m$ s’est proposé à toutes les femmes $\textstyle w\in \textstyle W$, alors comme $\textstyle (P)$ est un invariant de cet algorithme, il est vrai à la fin de ce dernier. Donc, en particulier, comme : « $\textstyle m$ est célibataire $\Rightarrow \textstyle m$ ne s’est pas proposé à toutes les femmes $\textstyle w\in \textstyle W$ », la contraposée nous affirme que $\textstyle m$ est engagé. Par conséquent, à la fin de l’algorithme, tous les hommes $\textstyle m\in \textstyle M$ sont engagés. Pour conclure, comme les ensembles $\textstyle M$ et $\textstyle W$ sont de même cardinal et qu’une même femme ne peut être engagée avec deux hommes différents, on en déduit que toutes les femmes sont également engagées. Ainsi, à la fin de l’algorithme, tout le monde finit par être en couple.

### Les mariages sont stables

Donnons-nous, à la fin de l'algorithme, une femme Alice et un homme Bob tous les deux mariés, mais pas ensemble. Si Bob préfère Alice à sa femme, cela veut dire qu'il s'était proposé à Alice avant de se proposer à sa femme. Si Alice avait accepté, puisqu'elle n'est plus avec lui à la fin, c'est qu'elle l'a remplacé par quelqu'un qu'elle préférait et donc qu'elle ne préfère pas Bob à son mari. Si Alice avait refusé, c'est qu'elle était déjà avec quelqu'un qu'elle préférait à Bob.
De manière plus formelle, raisonnons par l’absurde et supposons qu’il existe une instabilité dans l’un des mariages. Alors, par définition, cela signifie qu’il existe $\textstyle (m;w),(m';w')\in \textstyle S$ tels que $\textstyle m$ préfère $\textstyle w'$ à $\textstyle w$ et $\textstyle w'$ préfère $\textstyle m$ à $\textstyle m'$. Comme $\textstyle m$ et $\textstyle w$ sont engagés ensemble, d’après l’algorithme, cela signifie que la dernière proposition de $\textstyle m$ a été faite à $\textstyle w$. Y a-t-il eu une proposition de $\textstyle m$ à $\textstyle w'$ ?
* S’il n’y en a pas eu, alors cela signifie que $\textstyle m$ s’était déjà engagé avec une autre femme qui ne l’a pas rejeté, soit $\textstyle w$ (car ils sont engagés ensemble à la fin de l’algorithme), et donc que $\textstyle m$ préfère $\textstyle w$ à $\textstyle w'$. On a alors une contradiction avec l’affirmation de départ.
* S’il y en a eu une, alors cela signifie que $\textstyle m$ s’est fait rejeter par $\textstyle w'$, car ils ne sont pas engagés ensemble. Donc, cela induit que $\textstyle w'$ a reçu une proposition d’un homme $\textstyle m''\in \textstyle M$ (qu’elle a acceptée). Ainsi, on en déduit que $\textstyle w'$ préfère $\textstyle m''$ à $\textstyle m$. Or, $\textstyle m'$ est le partenaire de $\textstyle w'$ à la fin de l’algorithme. Donc :
* Soit $\textstyle m'=m''$ ;
* Soit $\textstyle w'$ préfère $\textstyle m'$ à $\textstyle m''$.
Mais, dans les deux cas, on obtient que $\textstyle w'$ préfère $\textstyle m'$ à $\textstyle m$. On a alors une contradiction avec l’affirmation de départ.
Par conséquent, dans tous les cas, on aboutit à une contradiction de l’affirmation de départ. C’est donc que celle-ci est fausse et qu’il n’y a pas d’instabilité dans l’un des mariages. Pour conclure, tous les mariages sont stables.

## Optimalité de la solution

Bien que la solution soit stable, ce n'est pas nécessairement une solution optimale pour tous les individus. La forme traditionnelle de l'algorithme est optimale pour ceux qui se proposent mais pas forcément pour ceux qui choisissent. Voici un exemple :
Il y a trois prétendants A, B et C et trois choisisseurs X, Y et Z, dont l'ordre des préférences respectif est : A : YXZ, B : ZYX, C : XZY, X : BAC, Y : CBA, Z: ACB
Il y a trois solutions stables à ce problème de mariages :
* les prétendants ont leur premier choix et les choisisseurs leur troisième (AY, BZ, CX) ;
* tous les participants ont leur deuxième choix (AX, BY, CZ) ;
* les choisisseurs ont leur premier choix et les prétendants leur troisième (AZ, BX, CY).
L'algorithme présenté ci-dessus en exemple de pseudo-code donne la première solution.
En reprenant les mêmes notations que dans les sections ci-dessus, nous allons montrer que :

### Chaque homme est engagé avec sa partenaire préférée parmi toutes ses partenaires stables

On commence par définir quelques notions :
* On dit qu’une femme $\textstyle w\in W$ est une partenaire stable d’un homme $\textstyle m\in M$ s’il existe un ensemble $\textstyle S$ de couples engagés (homme ; femme) contenant tous les individus et sans instabilité qui contient $\textstyle (m;w)$.
* La meilleure partenaire de $\textstyle m\in M$, notée $\textstyle best(m)\in W$, est l’unique partenaire stable de $\textstyle m$ telle que : $\forall$ $\textstyle w\in W\setminus \{best(m)\}$, $\textstyle (w$ est une partenaire stable de $\textstyle m\Rightarrow m$ préfère $\textstyle best(m)$ à $\textstyle w)$
* On note $\textstyle S^{*}$ = {($\textstyle m$ ; $\textstyle best(m)$) / $\textstyle m\in M$} en tant qu’ensemble de couples engagés.
On va montrer que toute exécution de l’algorithme de Gale-Shapley retourne $\textstyle S^{*}$.
$\textstyle S^{*}$ contient tous les hommes et toutes les femmes : En effet, par définition de $\textstyle S^{*}$, il contient tous les hommes $\textstyle m\in M$. De plus, un homme $\textstyle m\in M$ a une unique meilleure partenaire $\textstyle best(m)\in W$ par définition. Donc, $\textstyle m$ ne peut être engagé avec deux femmes différentes. Il reste à voir qu’une même femme préférée $\textstyle best(m)\in W$, où $\textstyle m\in M$, ne peut être engagée avec un autre homme $\textstyle m'\in M$ différent de $\textstyle m$ dans $\textstyle S^{*}$. C’est immédiat par définition d’un ensemble de couples engagés. En effet sinon, on pourrait avoir : $\textstyle best(m)=best(m')$, c’est-à-dire que $\textstyle m$ et $\textstyle m'$ préfèreraient tous les deux la même femme. Mais alors, $\textstyle best(m)$ apparaîtrait au moins deux fois dans $\textstyle S^{*}$, ce qui est impossible car $\textstyle S^{*}$ est un ensemble de couples engagés. Ainsi, comme les ensembles $\textstyle M$ et $\textstyle W$ sont de même cardinal, $\textstyle S^{*}$ contient également toutes les femmes.
$\textstyle S^{*}$ n’a pas d’instabilité : Raisonnons par l’absurde et supposons que $\textstyle S^{*}$ ait une instabilité $\textstyle (m;w)\in M\times W$ avec $\textstyle w\neq best(m)$. Alors, par définition d’une instabilité, cela signifie que $\textstyle m$ préfère $\textstyle w$ à $\textstyle best(m)$. Cela contredit la définition de $\textstyle best(m)$, car $\textstyle w$ est alors une partenaire stable de $\textstyle m$ préférée à $\textstyle best(m)$. Ainsi, $\textstyle S^{*}$ n’a pas d’instabilité.
L’algorithme renvoie $\textstyle S^{*}$ : Raisonnons par l’absurde et supposons qu’il existe une exécution de l’algorithme qui retourne un ensemble $\textstyle S\neq S^{*}$. Alors, il existe un homme $\textstyle m\in M$ tel que $\textstyle (m;best(m))\notin S$. On en déduit immédiatement que $\textstyle m$ a été rejeté par une femme au cours de l’algorithme (car sinon, $\textstyle m$ serait engagé avec une femme $\textstyle w\neq best(m)$, et d’après l’algorithme, $\textstyle w$ serait alors une partenaire stable de $\textstyle m$ préférée à $\textstyle best(m)$, ce qui est impossible par définition). Considérons le premier moment $\textstyle t_{0}$ où un certain homme $\textstyle m_{0}\in M$ a été rejeté par une certaine femme $\textstyle w_{0}\in W$ valide. Alors, d’après l’algorithme, comme $\textstyle m_{0}$ fait sa première proposition à $\textstyle best(m_{0})$, on a nécessairement que : $\textstyle w_{0}=best(m_{0})$. En effet sinon, cela signifie que $\textstyle m_{0}$ préfère $\textstyle w_{0}$ à $\textstyle best(m_{0})$, ce qui est impossible par définition de cette dernière. D’après l’algorithme, il y a deux cas possibles qui permettent le rejet de $\textstyle m_{0}$ par $\textstyle best(m_{0})$ :
* Soit $\textstyle m_{0}$ a fait une proposition à $\textstyle best(m_{0})$ qui est déjà engagée avec un homme $\textstyle m'\in M$ à l’instant $\textstyle t_{0}$ et $\textstyle best(m_{0})$ préfère $\textstyle m'$ à $\textstyle m_{0}$ ;
* Soit $\textstyle best(m_{0})$ était engagée avec $\textstyle m_{0}$ et a reçu à l’instant $\textstyle t_{0}$ une proposition d’un homme $\textstyle m''\in M$ qu’elle a acceptée. Donc, cela signifie que $\textstyle best(m_{0})$ préfère $\textstyle m''$ à $\textstyle m_{0}$.
Dans les deux cas, cela signifie qu’il existe un homme $\textstyle m_{1}\in M$ tel que $\textstyle best(m_{0})$ préfère $\textstyle m_{1}$ à $\textstyle m_{0}$. Après le rejet de $\textstyle m_{0}$ par $\textstyle best(m_{0})$ (donc à l’instant $\textstyle t_{0}$), on a alors l’engagement (homme ; femme) : $\textstyle (m_{1};best(m_{0}))\in M\times W$. Or, par définition de $\textstyle best(m_{0})$, c’est une partenaire stable pour $\textstyle m_{0}$. Donc, par définition d’une partenaire valide, cela induit l’existence d’un ensemble de couples engagés (homme ; femme) $\textstyle S'$ sans instabilité, tel que : $\textstyle (m_{0};best(m_{0}))\in S'$. Soit $\textstyle w_{1}\in W$ la femme engagée avec $\textstyle m_{1}$ dans $\textstyle S'$, c’est-à-dire telle que : $\textstyle (m_{1};w_{1})\in S'$. D’après l’algorithme, on a : $\textstyle w_{1}\neq best(m_{0})$. On reprend l’étude de l’exécution de l’algorithme de Gale-Shapley permettant d’obtenir l’ensemble $\textstyle S$. Comme $\textstyle m_{0}$ est le premier homme à être rejeté au cours de l’exécution de l’algorithme (car associé à l’instant $\textstyle t_{0}$) et qu’à la fin de l’instant $\textstyle t_{0}$, $\textstyle m_{1}$ est engagé avec $\textstyle best(m_{0})$, on en déduit que $\textstyle m_{1}$ n’a pas été rejeté avant l’instant $\textstyle t_{0}$, et donc que sa première proposition a été faite à $\textstyle best(m_{0})$. Ainsi, $\textstyle m_{1}$ préfère $\textstyle best(m_{0})$ à $\textstyle w_{1}$. Pour résumé, on a donc :
* $\textstyle (m_{1};w_{1})\in S'$ ;
* $\textstyle (m_{0};best(m_{0}))\in S'$ ;
* $\textstyle best(m_{0})$ préfère $\textstyle m_{1}$ à $\textstyle m_{0}$ ;
* $\textstyle m_{1}$ préfère $\textstyle best(m_{0})$ à $\textstyle w_{1}$.
Donc, par définition, $\textstyle (m_{1};best(m_{0}))$ est une instabilité pour $\textstyle S'$. Or, $\textstyle S'$ est défini sans instabilité. On aboutit donc à une contradiction avec la définition de $\textstyle S'$. C’est donc que l’hypothèse de départ est fausse et qu’il n’y a pas d’exécution de l’algorithme de Gale-Shapley qui ne retourne un ensemble de couples engagés (homme ; femme) différent de $\textstyle S^{*}$. Par conséquent, toutes les exécutions de cet algorithme retournent $\textstyle S^{*}$.

### Chaque femme est engagée avec son partenaire le moins aimé parmi tous ses partenaires stables

On commence par définir quelques notions :
* On dit qu’un homme $\textstyle m\in M$ est un partenaire stable d’une femme $\textstyle w\in W$ s’il existe un ensemble $\textstyle S$ de couples engagés (homme ; femme) contenant tous les individus et sans instabilité qui contient $\textstyle (m;w)$.
* Le pire partenaire de $\textstyle w\in W$, noté $\textstyle worst(w)\in M$, est l’unique partenaire stable de $\textstyle w$ tel que : $\forall$ $\textstyle m\in M\setminus \{worst(w)\}$, $\textstyle (m$ est un partenaire stable de $\textstyle w\Rightarrow w$ préfère $\textstyle m$ à $\textstyle worst(w))$
On va montrer que, dans l’ensemble $\textstyle S^{*}$, chaque femme est engagée avec son pire partenaire parmi ses partenaires stables.
Raisonnons par l’absurde et supposons qu’il existe $\textstyle (m;w)\in S^{*}$ tel que : $\textstyle m\neq worst(w)$. Alors, par définition de $\textstyle worst(w)$, il existe un partenaire stable $\textstyle m'\in M$ de $\textstyle w$ tel que $\textstyle w$ préfère $\textstyle m$ à $\textstyle m'$. En effet, sinon, $\textstyle m$ serait le partenaire stable le moins aimé de $\textstyle w$, et donc on aurait : $\textstyle m=worst(w)$. Comme $\textstyle m'$ est un partenaire valide de $\textstyle w$, par définition, il existe un ensemble de couples engagés $\textstyle S'$ sans instabilité tel que : $\textstyle (m';w)\in S'$. Soit $\textstyle w'\in W$ la femme engagée avec $\textstyle m$ dans $\textstyle S'$, c’est-à-dire telle que : $\textstyle (m;w')\in S'$. Donc, $\textstyle w'$ est une partenaire stable de $\textstyle m$ et on a : $\textstyle w'\neq w$. Par ailleurs, comme $\textstyle (m;w)\in S^{*}$, on en déduit que $\textstyle w=best(m)$ et donc que $\textstyle m$ préfère $\textstyle w$ à $\textstyle w'$. Pour résumé, on a donc :
* $\textstyle (m';w)\in S'$ ;
* $\textstyle (m;w')\in S'$ ;
* $\textstyle w$ préfère $\textstyle m$ à $\textstyle m'$ ;
* $\textstyle m$ préfère $\textstyle w$ à $\textstyle w'$.
Donc, par définition, $\textstyle (m;w)$ est une instabilité pour $\textstyle S'$. Or, $\textstyle S'$ est défini sans instabilité. On aboutit donc à une contradiction avec la définition de $\textstyle S'$. C’est donc que l’hypothèse de départ est fausse et qu’il n’y a pas de femme qui ne soit engagée dans $\textstyle S^{*}$ avec un homme différent de son pire partenaire. Par conséquent, dans l’ensemble $\textstyle S^{*}$, chaque femme est engagée avec son pire partenaire parmi ses partenaires stables.

## Implémentation

L'algorithme de Gale-Shapley peut être implémenté par exemple en Java. Il a une complexité de $\textstyle O(n^{2})$ en temps, où $\textstyle n$ est le nombre d'hommes et de femmes considéré pour le problème des mariages stables :
On décrit ci-dessous les différents objets intervenant dans cette fonction, et on explique son fonctionnement.

### Éléments de la fonction Gale-Shapley

* Les éléments $\textstyle M$ et $\textstyle W$ sont des tableaux d'entiers de taille $\textstyle n$ contenant les entiers de 1 jusqu'à $\textstyle n$ dans cet ordre pour les deux tableaux. Ces deux tableaux représentent les ensembles d'hommes $\textstyle M'$ et de femmes $\textstyle W'$ considérés pour le problème des mariages stables.
* Les éléments $\textstyle MPref$ et $\textstyle WPref$ sont des tableaux bidimensionnels d'entiers de taille $\textstyle n\times n$ et contenant des entiers entre 1 et $\textstyle n$ pour les deux tableaux. Ils représentent la famille des préférences de tous les hommes de $\textstyle M'$ (pour $\textstyle MPref$) et la famille des préférences de toutes les femmes de $\textstyle W'$ (pour $\textstyle WPref$). Chaque ligne de l'un des deux tableaux correspond à la relation de préférence d'un individu. Si $\textstyle m\in \{1;\ldots ;n\}$ et $\textstyle i\in \{1;\ldots ;n\}$, alors $\textstyle MPref[m-1][i-1]$ est l'entier $\textstyle j\in \{1;\ldots ;n\}$ correspondant à la $\textstyle i$-ème femme préférée de $\textstyle m$ dans $\textstyle W'$. Il en est de même pour $\textstyle WPref$.
* L'élément $\textstyle Libre$ est une liste chaînée stockant l'ensemble des hommes de $\textstyle M'$ qui sont célibataires (identifiés par leur nombre dans $\textstyle M$).
* L'élément $\textstyle Prochain$ est un tableau d'entiers de taille $\textstyle n$. Il permet de déterminer à quelle femme un homme doit se présenter au prochain tour de boucle de la fonction. Ainsi, si $\textstyle m\in \{1;\ldots ;n\}$, $\textstyle Prochain[m-1]$ est le rang dans la relation de préférence de l'homme associé à $\textstyle m$ dans $\textstyle M'$. En d'autres termes, à chaque tour de boucle de la fonction, l'homme associé à $\textstyle m$ dans $\textstyle M'$ (si c'est lui qui est choisi) propose à la femme dans $\textstyle W'$ associée à $\textstyle MPref[m-1][Prochain[m-1]]$. $\textstyle Prochain[m-1]$ est ensuite incrémenté de 1 à la fin du tour de boucle. Au début de la fonction, avant d'entrer dans la boucle, $\textstyle Prochain$ est donc initialisé avec des 0 partout (ce qui signifie que chaque homme va faire sa première proposition à la femme qu'il préfère).
* L'élément $\textstyle Actuel$ est un tableau d'entiers de taille $\textstyle n$. Il stocke les partenaires actuels (identifiés par leur nombre dans $\textstyle M$) de toutes les femmes de $\textstyle W'$ (identifiées par leur nombre dans $\textstyle W$). Donc, si $\textstyle w\in \{1;\ldots ;n\}$, $\textstyle Actuel[w-1]$ est le nombre associé au partenaire de la femme associée à $\textstyle w$, si cette femme est engagée avec un homme, ou 0 si elle célibataire. Au début de la fonction, avant d'entrer dans la boucle, $\textstyle Actuel$ est donc initialisé avec des 0 partout, car toutes les femmes sont célibataires.

### Explication de la fonction Gale-Shapley

L'explication de la fonction est la suivante :
Tant que la liste $\textstyle Libre$ n'est pas vide, c'est-à-dire tant qu'il reste au moins un homme célibataire, on choisit un tel homme ($\textstyle m$ dans la fonction). On considère la femme qu'il préfère parmi toutes celles à qui il ne s'est pas proposé ($\textstyle w$ dans la fonction).
* Si $\textstyle w$ est célibataire $\textstyle (Actuel[w-1]==0)$, alors $\textstyle m$ et $\textstyle w$ s'engagent ensemble $\textstyle (Actuel[w-1]=m)$ et $\textstyle m$ n'est plus célibataire, donc il quitte la liste $\textstyle Libre$.
* Sinon, $\textstyle w$ est engagée avec un autre homme ($\textstyle m0$ dans la fonction). On recherche alors son partenaire préféré entre $\textstyle m$ et $\textstyle m0$. Pour cela, on recherche le plus petit indice $\textstyle i\in \{1;\ldots ;n\}$ tel que $\textstyle WPref[w-1][i-1]$ soit $\textstyle m$ ou $\textstyle m0$, par définition de $\textstyle WPref$. Si elle préfère $\textstyle m$ à $\textstyle m0$ $\textstyle (WPref[w-1][i-1]==m)$, alors $\textstyle w$ s'engage avec $\textstyle m$ $\textstyle (Actuel[w-1]=m)$ et $\textstyle m$ quitte la liste $\textstyle Libre$ car il n'est plus célibataire alors que $\textstyle m0$ devient célibataire et rejoint la liste $\textstyle Libre$. Si $\textstyle w$ préfère $\textstyle m0$ à $\textstyle m$, alors rien ne change, $\textstyle w$ reste engagée avec $\textstyle m0$ et $\textstyle m$ reste célibataire, donc dans la liste $\textstyle Libre$.
Pour finir, quelle que soit la situation de $\textstyle m$ vis-à-vis de $\textstyle w$ à la fin du tour de boucle (célibataire ou engagé avec $\textstyle w$), s'il reste célibataire dans la suite de l'exécution de la fonction, alors il devra faire une nouvelle proposition à une autre femme qu'il aimera moins que $\textstyle m$ $\textstyle (Prochain[m-1]++)$. La fonction rend enfin le tableau $\textstyle Actuel$, ce qui permet de lire directement les couples formés.
On voit ainsi que l'on obtient bien une implémentation de l'algorithme de Gale-Shapley en Java. De plus, on remarque que le coût de cette fonction est bien en $\textstyle O(n^{2})$.

## Bibliothèques

* R : L'algorithme de Gale-Shapley pour le problème des mariages stables et le problème de l'admission à l'université sont disponibles dans le paquet matchingMarkets$^,$.
* API : L'API MatchingTools fournit une interface de programmation applicative pour l'algorithme.
* Python : L'algorithme de Gale-Shapley est disponible dans la librairie QuantEcon/MatchingMarkets.py
* Julia : L'algorithme de Gale-Shapley est disponible dans les librairies$^,$.