Advertisement
mosaid

PDM_VI_GSVI_MPI.cpp

Apr 10th, 2017
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <conio.h>
  4. #include <malloc.h>
  5. #include <math.h>
  6. #include <iostream>
  7.  
  8. //  Définition de la classe Classes_FC pour le calcul
  9. // de la forme canonique de la matrice de transition
  10. class VI_MDP{
  11.     public:
  12.     int nbr_etats;          // Nombre d'états 
  13.     float eps, alpha;
  14.     float Prb[100][10][100];
  15.     float gains[100][10];
  16.     float *Vopt;
  17.     int *nbr_actions;
  18.     int *strategie;
  19.            
  20.     VI_MDP( int n );    //Constructeur
  21.     void lire_nbr_actions( );
  22.     void lire_gains();
  23.     void lire_Piaj();      
  24.     void VI();
  25.     void MPI(); //algorithme modifié d'itération de la politique
  26.     void GSVI();   
  27.     void Affiche_strategie();  
  28. };
  29.  
  30. //Conxtructeur
  31. VI_MDP::VI_MDP( int n ){       
  32.     nbr_etats=n;
  33.     nbr_actions= new int[n];      
  34.     strategie= new int[n];
  35.     Vopt= new float[n];
  36.     eps=0.1;
  37.     alpha=0.5;
  38. }
  39.  
  40. //Lecture du nombre d'actions par etat
  41. void VI_MDP::lire_nbr_actions(){           
  42.     for(int i=0; i<nbr_etats; i++){
  43.         printf(" entrer le nombre d'actions dans l'etat %d :", i+1);
  44.         scanf("%d", &nbr_actions[i]);      
  45.     }  
  46. }
  47.  
  48. //Lecture des recompenses
  49. void VI_MDP::lire_gains(  ){               
  50.     for(int i=0; i<nbr_etats; i++){
  51.         for(int a=0; a<nbr_actions[i]; a++){
  52.             printf(" entrer R(%d,%d) :", i+1,a+1);
  53.             scanf("%f", &gains[i][a]);         
  54.         }
  55.     }
  56. }
  57.  
  58. //Lecture des probabilites de transitions
  59. void VI_MDP::lire_Piaj( ){     
  60.     for(int i=0; i<nbr_etats; i++){
  61.         for(int a=0; a<nbr_actions[i]; a++){
  62.             for(int j=0; j<nbr_etats; j++){
  63.                 printf(" entrer la proba P(%d,%d,%d):", i+1,a+1,j+1);
  64.                 scanf("%f", &Prb[i][a][j]);
  65.             }
  66.         }
  67.     }  
  68. }
  69.  
  70. //L'algorithme d'iteration de la valeur
  71. void VI_MDP::VI( ){
  72.   float *Vt=new float[nbr_etats];
  73.   float Maxv, tmpv, cv;
  74.   int itr=0,argmax;
  75.   for(int i=0; i<nbr_etats;i++)Vopt[i]=0;
  76.   do{
  77.     cv=0;itr++;
  78.     for(int i=0; i<nbr_etats;i++){
  79.         Maxv=gains[i][0];argmax=0;
  80.         for(int j=0; j<nbr_etats;j++){
  81.             Maxv += alpha*Prb[i][0][j]*Vopt[j];
  82.         }
  83.         for(int a=1; a<nbr_actions[i]; a++){
  84.             tmpv=gains[i][a];
  85.             for(int j=0; j<nbr_etats;j++){
  86.                 tmpv += alpha*Prb[i][a][j]*Vopt[j];
  87.             }
  88.             if( tmpv>Maxv){
  89.                 Maxv=tmpv; argmax=a;
  90.             }
  91.         }
  92.         Vt[i]=Maxv;
  93.         if( fabs(Vt[i]-Vopt[i])>cv)cv=fabs(Vt[i]-Vopt[i]);
  94.         strategie[i]=argmax;
  95.     }
  96.     printf("\nVopt a l'iteration %d: ", itr);
  97.     for(int i=0; i<nbr_etats;i++){
  98.         Vopt[i]=Vt[i];
  99.         printf("%f, ", Vopt[i]);
  100.     }
  101.   }while( cv>=eps);    
  102. }
  103.  
  104.  
  105. //L'algorithme Gauss-seidel d'iteration de la valeur
  106. void VI_MDP::GSVI( ){
  107.   float *Vt=new float[nbr_etats];
  108.   float Maxv, tmpv, cv;
  109.   int itr=0,argmax;
  110.   for(int i=0; i<nbr_etats;i++)Vopt[i]=0;
  111.   do{
  112.     cv=0;itr++;
  113.     for(int i=0; i<nbr_etats;i++){
  114.         Maxv=gains[i][0];argmax=0;
  115.         for(int j=0; j<nbr_etats;j++){
  116.             Maxv += alpha*Prb[i][0][j]*Vopt[j];
  117.         }
  118.         for(int a=1; a<nbr_actions[i]; a++){
  119.             tmpv=gains[i][a];
  120.             for(int j=0; j<nbr_etats;j++){
  121.                 tmpv += alpha*Prb[i][a][j]*Vopt[j];
  122.             }
  123.             if( tmpv>Maxv){
  124.                 Maxv=tmpv; argmax=a;
  125.             }
  126.         }
  127.         Vt[i]=Maxv;
  128.         if( fabs(Vt[i]-Vopt[i])>cv)cv=fabs(Vt[i]-Vopt[i]);
  129.         strategie[i]=argmax;
  130.         Vopt[i]=Vt[i];
  131.     }
  132.     printf("\nVopt a l'iteration %d: ", itr);
  133.     for(int i=0; i<nbr_etats;i++){         
  134.         printf("%f, ", Vopt[i]);
  135.     }
  136.   }while( cv>=eps);    
  137. }
  138.  
  139. //Affichage de la strategie
  140. void VI_MDP::Affiche_strategie(){
  141.     printf("\nStrategie =  ");
  142.     for( int i=0; i<nbr_etats; i++){
  143.         printf("%d, ",strategie[i]+1 );
  144.     }
  145. }
  146.  
  147.  
  148. void VI_MDP::MPI( ){
  149.  float *Vt=new float[nbr_etats];   
  150.  float Maxv, tmpv;
  151.  int argmax;
  152.  int *St0=new int[nbr_etats]; //pour l'initialisation de la strategie
  153.  for(int i=0; i<nbr_etats; i++)St0[i]=0;//initialisation de la strategie
  154.  
  155.     printf("\n strategie initiale est :" );
  156.     for(int i=0; i<nbr_etats;i++){     
  157.         printf("%d, ", St0[i]+1);
  158.     }
  159.  
  160.  bool cv1=false;
  161.  float cv2;
  162.  int nbr_itr=0;
  163.  do{
  164.     nbr_itr++;
  165.     cv1=true;
  166.    
  167.     //Calcul du vecteur gain pour la startegie St0[]
  168.     for(int i=0; i<nbr_etats;i++)Vopt[i]=0; //initialisation du vecteur
  169.     //Calcul jusqu'au convergence
  170.     do{
  171.         cv2=0; 
  172.         for(int i=0; i<nbr_etats;i++){
  173.             Vt[i]=gains[i][St0[i]];
  174.             for(int j=0; j<nbr_etats;j++){
  175.              Vt[i]+= alpha*Prb[i][St0[i]][j]*Vopt[j];
  176.             }
  177.             if( fabs(Vt[i]-Vopt[i])>cv2) cv2=fabs(Vt[i]-Vopt[i]);
  178.             Vopt[i]=Vt[i];
  179.         }      
  180.     }while( cv2>=eps);
  181.    
  182.     printf("\n Vecteur gain a l'iteration %d est:",nbr_itr );
  183.     for(int i=0; i<nbr_etats;i++){
  184.         printf("%f, ", Vopt[i]);
  185.     }
  186.     //Calcul de la strategie argmax du vecteur Vopt[]
  187.     for(int i=0; i<nbr_etats;i++){
  188.        
  189.         Maxv=gains[i][0];argmax=0;
  190.         for(int j=0; j<nbr_etats;j++){
  191.             Maxv += alpha*Prb[i][0][j]*Vopt[j];
  192.         }
  193.        
  194.         for(int a=1; a<nbr_actions[i]; a++){
  195.             tmpv=gains[i][a];
  196.             for(int j=0; j<nbr_etats;j++){
  197.                 tmpv += alpha*Prb[i][a][j]*Vopt[j];
  198.             }
  199.             if( tmpv>Maxv){Maxv=tmpv; argmax=a;}
  200.         }
  201.         strategie[i]=argmax;
  202.         if(strategie[i] != St0[i])cv1=false;
  203.     }
  204.     printf("\n strategie a l'iteration %d est:",nbr_itr );
  205.     for(int i=0; i<nbr_etats;i++){
  206.         St0[i]=strategie[i];
  207.         printf("%d, ", St0[i]+1);
  208.     }
  209.    
  210.  }while(cv1==false);
  211.    
  212. }
  213.  
  214.  
  215. int main (){
  216.     int n;
  217.     printf("entrer le nombre d'etats :");
  218.     scanf("%d",&n);
  219.     VI_MDP MDP(n); //constructeur
  220.     MDP.lire_nbr_actions();
  221.     printf("********* Faite attention a la saisie des donnees*********\n:");
  222.     MDP.lire_gains();
  223.     printf("********* Faite attention a la saisie des donnees*********\n:");   
  224.     MDP.lire_Piaj();       
  225.     etq:
  226.     printf("\n\nq-   quitter\n");
  227.     printf("1-   L'algorithme d'iteration de la valeur\n");
  228.     printf("2-   L'algorithme d'iteration de la valeur de Gauss-seidel\n");
  229.     printf("3-   L'algorithme modifier d'iteration de la politique\n");
  230.     printf("         votre choix : ? ");
  231.     char c=getch();
  232.     switch (c){
  233.         case '1':  MDP.VI();
  234.             MDP.Affiche_strategie();           
  235.             break;
  236.         case '2':
  237.             MDP.GSVI();
  238.             MDP.Affiche_strategie();           
  239.             break;
  240.         case '3':
  241.             MDP.MPI();
  242.             MDP.Affiche_strategie();           
  243.             break;                 
  244.     }
  245.    
  246.     if( (c != 'q') && (c !='Q') )goto etq;
  247.     getch();
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement