Page 1 of 2

État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 14:56
by cpierquet
Hello la communauté, je reviens "à la charge" avec les graphes probabilistes / chaînes de Markov et la recherche de l'éventuel état stable.

Ce matin avec les Spé on a fait un exo de recherche d'état stable en dimension 3 et un des élèves a remarqué que le procédé était assez mécanique, et que d'un point de vue algorithmique cela devait pouvoir se faire.

J'ai donc réfléchi un peu à la manière de précéder pour que cela puisse passer sur une calculatrice, en conservant l'esprit du programme en obtenant l'éventuel état stable par système.

Voilà donc les grandes lignes du procédé :
  1. on détermine la matrice de transition
    $mathjax$M$mathjax$
    carrée d'ordre
    $mathjax$n$mathjax$
    du graphe (qui admet une puissance dont aucun des coefficients n'est nul...)
  2. l'état stable
    $mathjax$\Pi$mathjax$
    vérifiant
    $mathjax$\Pi=\Pi \times M$mathjax$
    donne un système linéaire de
    $mathjax$n$mathjax$
    équations à
    $mathjax$n$mathjax$
    inconnues (en transposant...)
  3. ce système, tel quel, ne peut pas se résoudre car les équations sont "liées"
  4. on retire une équation (la première par exemple) que l'on remplace par celle venant du fait que la somme des coefficients de
    $mathjax$\Pi$mathjax$
    vaut 1
  5. le nouveau système se transforme matriciellement sous forme
    $mathjax$AX=B$mathjax$
  6. la solution du système est donnée par
    $mathjax$X=A^{-1} \times B$mathjax$

Prenons un petit exemple pour comprendre comment "construire" les matrices
$mathjax$A$mathjax$
et
$mathjax$B$mathjax$
:

  • on prend par exemple comme matrice de transition
    $mathjax$M=\begin{pmatrix} 0,1 & 0 & 0,9 \\ 0,9 & 0,1 & 0 \\ 0,3 & 0,1 & 0,6 \end{pmatrix}$mathjax$
  • on vérifie que
    $mathjax$M^2$mathjax$
    ne comporte aucun 0, et donc qu'il existe un état stable
    $mathjax$\Pi=\begin{pmatrix} x & y & z \end{pmatrix}$mathjax$
  • $mathjax$\Pi=\Pi \times M$mathjax$
    donne directement
    $mathjax$\begin{pmatrix} x & y & z \end{pmatrix}=\begin{pmatrix} 0,1x+0,9y+0,3z & 0x+0,1y+0,1z & 0,9x+0y+0,6z \end{pmatrix}$mathjax$
  • soit encore
    $mathjax$\begin{cases}0,1x+0,9y+0,3z=x \\ 0x+0,1y+0,1z=y \\ 0,9x+0y+0,6z=z \end{cases} \Leftrightarrow \begin{cases}-0,9x+0,9y+0,3z=0 \\ 0x-0,9y+0,1z=0 \\ 0,9x+0y-0,4z=0 \end{cases}$mathjax$
  • la matrice associée à ce système est
    $mathjax$\begin{pmatrix} -0,9 & 0,9 & 0,3 \\ 0 & -0,9& 0,1 \\ 0,9 & 0 & -0,4 \end{pmatrix}$mathjax$
    et le lecteur peut vérifier "facilement" qu'elle vaut
    $mathjax$(M-I_3)^\top$mathjax$
  • on remplace la première équation par
    $mathjax$x+y+z=1$mathjax$
    et on obtient
    $mathjax$\begin{cases}x+y+z=1 \\ 0x-0,9y+0,1z=0 \\ 0,9x+0y-0,4z=0 \end{cases}$mathjax$
  • ce nouveau système s'écrit
    $mathjax$AX=B$mathjax$
    avec
    $mathjax$A=\begin{pmatrix} 1 & 1 & 1 \\ 0 & -0,9& 0,1 \\ 0,9 & 0 & -0,4 \end{pmatrix}$mathjax$
    ,
    $mathjax$X=\begin{pmatrix} x \\ y \\ z \end{pmatrix}$mathjax$
    et
    $mathjax$B=\begin{pmatrix} 1 \\ 0 \\ 0 \end{pmatrix}$mathjax$
  • on fait travailler la calculatrice, et on obtient
    $mathjax$X=A^{-1}B=\begin{pmatrix} \frac27 \\ \frac{1}{14} \\ \frac{9}{14} \end{pmatrix}$mathjax$
    soit
    $mathjax$\Pi=\begin{pmatrix} \dfrac27 & \dfrac{1}{14} & \dfrac{9}{14} \end{pmatrix}$mathjax$

Il restait donc à programmer tout cela, ce n'est pas du tout optimisé, mais cela fonctionne !
Avec la matrice
$mathjax$M$mathjax$
définie coefficient par coefficient, on calcule
$mathjax$A=(M-I_n)^\top$mathjax$
puis on remplace la première ligne par des 1 ; la matrice
$mathjax$B$mathjax$
est quant à elle constituée d'un 1 et de 0 ensuite...
J'ai rajouté un petit test après la saisie d'une ligne pour vérifier une éventuelle erreur (je pense que le test est suffisant d'ailleurs...)

Code: Select all
Disp "MATRICE M CARREE ORDRE n"
Input "n=",N
{N,N}→dim([J])
For(I,1,N)
0→S
For(J,1,N)
Input "COEFF DANS [0,1]=",K
K→[J](I,J)
S+K→S
End
If S=1
Then
Disp "LIGNE OK"
Else
Disp "LIGNE PAS OK"
Stop
End
End
Disp "MATRICE M"
Pause [J]
([J]-unité(N))t→[I] (avec t la transposition !)
For(L,1,N)
1→[I](1,L)
End
Disp "SYSTEME AX=B"
Disp "A=",[I]
Pause
{N,1}→dim([H])
1→[H](1,1)
For(L,2,N)
0→[H](L,1)
End
Disp "B=",[H]
Pause
Disp "X="
Pause [I]^(-1])[H]>Frac
Disp "ETAT STABLE="
Disp [I]^(-1)[H]>Frac


Et voilà le déroulé sur TI83CE :
Capturer 1.png
Capturer 2.png
Capturer 3.png
Capturer 4.png
Capturer 5.png
Capturer 6.png
ETSTABLE.gif

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 15:05
by critor
Félicitations ! :bj:


A un moment j'avais pour projet de compléter le programme GraphMaster pour TI-Nspire avec la saisie d'un état initial et la recherche d'un état stable.

Mais plus la date fatidique du 1er janvier 2018 se rapproche (c'est-à-dire l'entrée en vigueur du mode examen détruisant tout programme non préchargé d'origine dans la calculatrice par le constructeur), moins j'en trouve la motivation.

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 15:08
by Bisam
Il y a un problème si les 2 premières lignes de la transposée de M-In sont indépendantes et la 3ème proportionnelle à la seconde. En remplaçant la première, on n'obtient pas une matrice inversible.
Il vaut mieux chercher le noyau de la transposée de M-In puis diviser le vecteur directeur obtenu par la somme de ses coefficients pour le "normaliser".
Pour cela, on peut utiliser la méthode du pivot de Gauss (et la fonction "ref").
C'est un poil plus technique à écrire, cependant.

On peut aussi chercher quelle ligne on peut éliminer... en cherchant si elle est combinaison des autres... mais cela revient à chercher le noyau, donc on n'y gagne rien.

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 15:52
by cpierquet
Oui, merci Bisam pour les précisions, je n'avais pas aux différentes possibilités de "liaison" des lignes... erf... et pour le coup ce ne sont pas trop les élèves qui auraient pu me lancer sur cette piste...
Je n'avais pas assez réfléchi à ce problème éventuel :?

Du coup niveau TS cela devient difficilement programmable !
Ou alors commencer par remplacer la 1ère ligne, tester l'inversibilité, et tant qu'elle n'est pas inversible on remplace la ligne suivante... faisable je pense...

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 16:01
by Bisam
Si le but est de faire programmer les élèves, effectivement, ça risque d'être difficile... mais ça l'était déjà un peu.
On peut "tricher" en testant les lignes 1 par 1, jusqu'à obtenir celle que l'on peut remplacer par une liste de 1 pour avoir une matrice inversible. Il suffit d'expliquer aux élèves que la calculette connait une façon de tester si une matrice est inversible.
Algorithmiquement, c'est un peu moins efficace, mais plus facile à expliquer.

Sinon, tu peux aussi utiliser la méthode dite de "la boîte noire" en leur fournissant un bout de code qui renvoie un vecteur directeur de
$mathjax$\ker\left({}_{}^{t}(M-I_n)\right)$mathjax$
...

Par ailleurs, il faudrait aussi prévoir les cas où M-In est inversible... et où, par conséquent, il n'y a PAS d'état stable.

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 16:08
by cpierquet
Il y a un problème si les 2 premières lignes de la transposée de M-In sont indépendantes et la 3ème proportionnelle à la seconde. En remplaçant la première, on n'obtient pas une matrice inversible.


Je n'arrive pas - ça doit être le weekend qui approche... - à construire une
$mathjax$M$mathjax$
telle que
$mathjax$(M-I_n)^\top$mathjax$
donne les lignes 1 et 2 indépendantes et la 2 et la 3 proportionnelles...

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 16:17
by Bisam
J'ai répondu machinalement, sans me préoccuper du contexte des chaînes de Markov...
Du coup, je ne suis pas certain que l'on puisse effectivement rencontrer ce cas !

Je creuse...

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 16:38
by Bisam
Bon, après quelques minutes, il s'avère que le seul cas où cela pourrait survenir serait une matrice de la forme :
$mathjax$M=\begin{pmatrix}1&0&0\\
0&a&1-a\\
0&b&1-b\\
\end{pmatrix}$mathjax$

Mais tu excluais ce cas par ton 1)... et, en plus, dans ce cas, l'état stable n'est pas difficile à trouver !

Finalement, beaucoup de bruit pour rien.
Il faut juste envisager que l'élève puisse utiliser le programme dans ce cas aussi... ou, pire, dans le cas suivant :
$mathjax$M=\begin{pmatrix}0&1&0\\
0&0&1\\
1&0&0\\
\end{pmatrix}$mathjax$
.

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 17:07
by cpierquet
Merci pour la précision !

Par contre, je précise bien que j'utilise l'algorithme dans le cas où on a une puissance de M qui ne comporte aucun zéro, donc dans le cas
$mathjax$M=\begin{pmatrix}0&1&0\\ 1&0&0\\ 0&0&1\\ \end{pmatrix}$mathjax$
on "passe"...

Pour poursuivre quand même avec les éventuels cas particuliers, est-il possible de tomber dans un cas de lignes liées en dimension 4 (ou +) de telle sorte que ce ne soit pas la première qu'il faille remplacer ? J'avais fait un exemple de marche aléatoire avec mes élèves qui simulait un lancer de ballon entre eux 6 de manière "programmée", et le remplacement de la 1ère ligne marchait :)

Et puis sinon je n'ai pas demandé aux élèves de faire le programme, mais je leur ai montré le principe ;-) ils sont un peu curieux !!

Re: État stable marche aléatoire

Unread postPosted: 26 Feb 2016, 17:17
by Bisam
Je pense que le calcul que j'ai effectué (sur ma feuille) prouve que le remplacement de la 1ère ligne ne marche pas seulement dans le cas où la 1ère colonne de M est un 1 suivi de plein de 0 (et du coup, la 1ère ligne aussi).
Cela est dû au fait que les coefficients sont entre 0 et 1... Je te laisse t'en convaincre.

Au fait, ton test sur S et P ne suffit pas pour contenir les coefficients entre 0 et 1 :
Contre-exemples : (2, -1/2, -1/2), ou encore (2, 0, -1) ou (1,1,1,-1,-1) passent le test...