Groupe : - MARRONE Fabien - ZWILLINGER Damien - MAIRE Thibault Tuteur : Marietta Manolessou Projet : 2A Groupe C Date de création : Samedi 19 Janvier 2006 Date de modification : Mercredi 25 Janvier 2006 PROJET 2A – Groupe C OPTIMISATION -- Processus Stochastiques -- A) PARTIE MATHEMATIQUE 1) Chaines de MARKOV a) Définitions essentielles o Chaine de Markov : Soient : - (Ω, F, P) un espace de probabilité - T un ensemble quelconque - (E, ℓ) un espace mesurable - E = ensemble fini ou dénombrable : ensemble des états du système - T = sous-ensemble de R+, ensemble des paramètres du temps On appelle processus stochastique défini sur Ω, avec T ensemble des temps et E espace des états, toute famille {X(t)}tЄT de variables aléatoires à valeurs dans E : - la variable aléatoire X(t) est appelée : état à l’instant t. Un processus stochastique défini sur un espace de probabilité (Ω, F, P) est appelé Chaîne de Markov si l’égalité suivante entre probabilités conditionnelles est bien vérifiée : P[X t+s = j | Xt0 =i0, Xt1 =i1, …, Xtn =in, Xt =i] = P[Xt+s = j | Xt = i] o Loi de probabilité d’état initial : П(0) = P[X0 = i] (i Є E) o Vecteur de probabilité : u = {u1, u2, …, un} Є Rn La somme des ui pour i=1 à i=n doit être égal à 1 o Matrice Stochastique P : Une matrice carrée P = {pij} Є Mn( R ) est une matrice stochastique si chacune de ses lignes est un vecteur de probabilité. b) Graphe orienté d’une chaîne de Markov Le graphe associé à une chaîne de Markov (et à sa matrice de transition P) est défini par : - Ses sommets qui représentent les états du système (i Є E) - Ses arètes ( i -> j ) associées aux probabilités de transition : pij > 0 c) Régime du système Le vecteur de probabilité des états du système à l’instant t = n (ligne de P à l’instant n), : П(n) est appelé régime du système à l’instant n. o Régime stationnaire : Un régime П est stationnaire ssi : П.P = П , avec la somme des Пi = 1 et Пi >= 0 o Régime permanent : On appelle régime permanent, le vecteur de probabilité : П t.q. Пi = lim n->∞ П(n) ou lim n->∞ П(0). P(n) = П o Ergodicité : On dit qu’une chaîne de Markov est ergodique ssi il existe : П avec П = lim n->∞ П(n) pour tout régime initial П(0) d) Propriétés des états dans une chaîne de Markov : On considère l’application fi de l’ensemble des états E vers l’intervalle I = [0,1] : E [0,1] fi : i fi fi = P[Xn = i |X0 = i] pour n>0 o Etat transitoire : Si fi < 1 o Etat récurrent : Si fi = 1 o Etat périodique : Soit di = pgcd des longueurs de chemins partant de i et arrivant en i Si di = 1 L’état i est dit apériodique Si di différent de 1 L’état i est dit périodique de période di o Etat absorbant : Lorsque le système se trouve à l’état i et qu’il ne peut plus en sortir, on dit que l’état est absorbant. e) Classes d’équivalence d’une chaîne de Markov : Voir états, les classes ont les mêmes propriétés que les états, ainsi il existe : - des classes transitoires - des classes récurrentes - des classes absorbantes 2) Simplexe – Méthode des pénalités B) PARTIE INFORMATIQUE 1. Le package AWT (Abstract Windowing Toolkit) Contient toutes les classes pour créer des interfaces utilisateur et pour dessiner des graphiques et des images. Un objet d'interface utilisateur comme un bouton ou une barre déroulante est appelé, dans la terminologie AWT, un composant. La classe Component est la racine de tous les composants AWT. Quelques composants renvoient des événements quand un utilisateur agit réciproquement avec les composants (des listeners) La classe AWT.Event et ses sous-classes sont utilisées pour représenter les événements que les composants d’AWT peuvent renvoyer. Un conteneur est un composant qui peut contenir des composants et d'autres conteneurs. Un conteneur peut aussi avoir un manager de disposition (LayoutManager) qui contrôle le placement visuel de composants dans le conteneur. Le package AWT contient plusieurs manager de disposition des classes et une interface pour construire le manager de disposition propre. On appelle le package AWT ainsi dans notre programme : - import java.awt.*; import java.awt.event.* ; 2. Le package SWING Contrairement au package AWT, le package Swing met à disposition des composants dont l'aspect est indépendant du système sur lequel les applications sont utilisées. On y retrouve les composants classiques comme les boutons, les listes, les cases à cocher, etc..., mais aussi un grand nombre de nouveaux composants comme : Classes utilisées : - JMenu : exécution d'un menu -- une fenêtre automatique contenant JMenuItems qui est montré quand l'utilisateur choisit un article sur le JMenuBar - JMenubar : barre de menu - JMenuItem : bouton de menu. - JDekstopPane : conteneur permettant de créer une interface de documents (ou fenêtres) multiples sur un bureau virtuel. - JTextPane : Un composant de texte qui peut être identifié par les attributs qui sont représentés graphiquement. - JScrollPane: vue déroulante pour un composant. - JFrame: extension de java.awt.frame - JLabel: petite zone de texte et/ou d’image. - JButton: bouton cliquable. - JTextField: composant qui permet l'édition d'une ligne simple de texte. . 3. Le package JGRAPH Dérivée de JComponent du package SWING, cette classe graphique permet de dessiner les figures graphiques les plus complexes. Nous utilisons cette classe pour dessiner le graphe orienté de la chaîne de Markov. Petit mais totalement fonctionnel, JGraph est un composant Java qui facilite le développement de représentations graphiques de réseau grâce aux principes de la théorie des graphes. À l'aide de JGraph, il est possible de réaliser des projets allant d'un simple éditeur graphique à la carte d'un réseau informatique, en passant par un programme de recherche du plus court chemin. JGraph, qui est dérivé de la classe Swing JComponent, il peut être utilisé pour afficher un réseau d'objets associés à l'aide du paradigme bien connu que constitue un graphe JGraph nous permet donc de : - Créer un graphique. - Adapter un graphique. - Répondre à des interactions. - Adapter l'affichage aux besoins du client d'un graphique. - Changer dynamiquement un graphique. C) REALISATION 1. Les classes et fichiers de notre programme Notre programme est composé des fichiers suivants : cellule.java (nous parlerons de cellules en tant qu’états en mathématique) Dans ce fichier, nous définissons la structure de l’objet cellule qui par défaut à ses champs valeur et suivant nuls Valeur donne le numéro de la cellule Suivant renseigne sur la cellule suivante à la cellule de numéro valeur public void cellule() { valeur=null; suivant=null; } Nous définissions également toutes les opérations sur les cellules dans ce fichier comme : - affecter_valeur(Object o) - affecter_suivant(cellule cel) - recuperer_valeur() - recuperer_suivant() liste.java (définit un tableau de cellule) Dans ce fichier nous définissons la structure de l’objet liste ainsi que les fonctions décrivant les opérations sur les objets liste : - ajouter_valeur(Object o) - remplacer_valeur(Object old, Object new) : remplace la valeur old d’une cellule par la valeur new - recuperer_position(Object o) - recuperer_position(int i) : surcharge de la fonction recuperer_position(Object o) - contient(liste l) : fonction booléenne qui regarde si un object contient la liste l matrice.java (définit la matrice stochastique et les opérations) Nous définissons ici l’objet matrice stochastique et toutes les opérations sur les matrices : - matrice : constructeur de l’objet matrice par défaut - matrice(l,c) : constructeur de matrice carrée de nb_ligne = l - ajouter_valeur() : ajout d’une valeur dans la matrice - multiplication() : gère la multiplication entre deux matrices, entre un vecteur et une matrice - recuperer_valeur(int l, int c) : récupère la valeur à la ligne l et la colonne c - recupere_nb_ligne() et recupere_nb_col() : récupère le nombre de ligne, colonne Markov.java Dans les fichiers précédents nous avons posé les bases des objets nécessaires pour les chaînes de Markov. Dans ce fichier, nous gèreront toutes les opérations relatives aux chaînes de Markov. Voici les plus grosses fonctions du programme : - verification() Cette fonction vérifie que : 2) la somme des poids des arètes partant d’une cellule est bien égale à 1 3) que Π(0) a bien été donné 4) retourne « vraie » si 1) et 2) sont valides public boolean verif(){ int i, j; float total; liste classes; String str; str = "Vérification des poids des cellules : \n"; for(i=0; i<nbS; i++) { total=0; for(j=0; j<nbS; j++) total+=((Float)P.rec_valeur(i,j)).floatValue(); str += "Cellule "+j+" : "+total+"\n"; if(total!=1) { str += "ERREUR : au moins un poids d'une cellule est different de 1 \n"; return false; } } // Vérification des poids de Pi0 : doit etre au moins égal à 1 total=0; for(i=0; i<nbS; i++) total+=((Float)Pi0.rec_valeur(i,0)).floatValue(); str += "Verification poids de pi0 : "+total+"\n"; if(total!=1) { str += "ERREUR : poids Pi0 different de 1"; return false; } Labelres.setText(Labelres.getText()+'\n'+str); return true; } - atteind1(int S) : constitue l’ensemble des sommets atteignables à partir d’un sommet donné S avec la fonction atteind1 qui renvoie la liste des sommets T tels que P( S, T) <> 0 public liste atteind1(int S){ int i; liste res=new liste(); for(i=0; i<nbS; i++) if(((Float)P.rec_valeur(S,i)).floatValue()!=0) res.ajouter_valeur(new Integer(i)); return res; } - atteind(int S) : constitue la liste des sommets atteignables en partant d’un sommet S en un nombre quelconque d'étapes. - typeclasse(liste c) : calcule et retourne le type des classes trouvées dans le graphe. public int typeclasse(liste c){ int res, tmp, i; liste att; res=-1; if(c.rec_taille()==1) { tmp=((Integer)c.rec_valeur(0)).intValue(); if(((Float)P.rec_valeur(tmp,tmp)).floatValue()==1) res=1; else res=3; } else { att=atteind1(((Integer)c.rec_valeur(0)).intValue()); for(i=1; i<c.rec_taille(); i++) att=att.unionint(atteind1(((Integer)c.rec_valeur(i)).intValue())); c.trieint(); att.trieint(); if(c.egalint(att)) res=2; else res=3; } return res;} - affiche_classe() : fonction qui affiche les classes du graphe - calculPiN(int n) : fonction qui calcule Π à l’instant n, cette fonction ne fait que transposé Π à l’instant 0, multiplie par la matrice stochastique, retourne son résultat et le multiplie par le multiplie par la matrice stochastique jusqu’au temps n - ergodicite() : fonction booléenne qui retourne vrai ou faux. graph.java Ce fichier permet de définir l’objet graph composé d’une liste de sommets (objet liste). Il permet de définir les opérations sur les sommets et sur les arètes de l’objet graph. Graphique.java Ce fichier sert à construire l’interface graphique du fichier et de définir les listeners permettant de donner une action à un clic par exemple. Nous utilisons les packages AWT et SWING pour créer l’interface graphique. 2. Aperçu du programme