تاپيک: Q-Learning
نمايش پست تنها
قديمي ۰۵-۳۱-۱۳۸۹, ۰۶:۵۳ بعد از ظهر   #3 (لینک دائم)
Astaraki Female
Administrator
 
آواتار Astaraki
 
تاريخ عضويت: خرداد ۱۳۸۷
محل سكونت: تهران-کرج!
پست ها: 3,465
تشكرها: 754
16,337 تشكر در 3,127 پست
My Mood: Mehrabon
ارسال پيغام Yahoo به Astaraki
Wink

این برنامه پیاده سازیه روش Q-Learning هست که برای یافتن یک هدف در مکان نا معلوم به وسیله ی یک agent نوشته شده.
در این برنامه ابتدا به وسیله ی این الگوریتم و چندین بار حرکت agent در مسیر ، هزینه هایی برای این مسیر پیدا میشه و در پایان هم بهترین مسیر تا هدف رو انتخاب میکنیم (در این برنامه از الگوریتم Dijkstra برای این کار استفاده شده)
به این نکته هم توجه داشت باشین که بهترین مسیر در این روش ، مسیری است که بزرگترین هرینه رو در هر مرحله انتخاب کنه

كد:
//Q-Learning
#include
#include
#include
using namespace std;

const int SIZE=6;
//*********************
struct node
{
       int destination;
       int s;
       float distance;
       string p;
};
//*********************
int max_distance(node []);
void dijkstra ( int ,int, float [][6] );
//*********************

class Q_Learning
{
       public:
              Q_Learning(int,int);
              void displayR();
              void displayQ();
              void routing();
       private:
               float Q_cal(int,int);
               float find_max(int);
               float Q[6][6];
               float R[6][6];
               int start_state;
               int goal_state;
               float Y;
               // state shoroo ham bayad bashe baadan
};
//*********************
Q_Learning :: Q_Learning(int s , int g)
{
           int i,j,k,l,state,action;
           float temp;
           vector states;
           Y=0.8;
           start_state=s;
           goal_state=g;
           for ( i=0 ; i< if * vector<1200 (k="0" episode displayR(); R namayeshe srand(time(0)); R[i][goal_state]="=" 0 R[5][5]="0;" R[4][5]="0;R[5][1]=0;R[5][4]=0;" R[3][4]="0;R[4][0]=0;R[4][3]=0;" R[2][3]="0;R[3][1]=0;R[3][2]=0;" R[0][4]="0;R[1][3]=0;R[1][5]=0;" R[i][j]="-1;" j++ i++> states;
      for (i=0 ; i< if && max="Q[b][" ) :: Q_Learning float ********************* j++) j::min(); // MIN_FLOAT
         }
     dijkstra ( start_state ,goal_state,  temp );
}
//*********************

void Q_Learning :: displayR()//namayeshe maghadire R
{
     int i,j;
     char item[6]={'A','B','C','D','E','F'};
     system("cls");
     cout<<"\n -1 --> No way\n 0 --> Is way\n 100 --> Direct way\n";
     cout<<"\nRoads matrix = :\n\n  ";
     for (i=0 ; i<6 ; i++)
         cout<<<" int { void } ?; main() while char ; cin :: Q_Learning ********************* j++) j<::min();
    for (i=0 ; i max && a[i].s == 0)
        {
           max = a[i].distance;
           max_index = i;
        }
    }
    return max_index;
}
//*********************
void dijkstra ( int v ,int g, float P[6][6] )
{
     int u,i,j,k;
     float NP[6][6];
     char ch[6]={'A','B','C','D','E','F'};
     node state[6];
     
     for (i=0 ; i< SIZE ; i++)
         for (j=0 ; j< SIZE ; j++)
         {
             NP[i][j]=P[i][j];
             if (NP[i][j] == 0 && i!=j)
                NP[i][j]=std::numeric_limits::min(); // MIN_FLOAT
         }
     
     for (i=0 ; i< SIZE ; i++)
     {
         state[i].destination=i;
         state[i].s=0;
         state[i].distance=NP[v][i];
         state[i].p = v+'0';
     }
     state[v].s=1;
     
     
     for (j=1 ; j< SIZE ; j++)
     {
         u=max_distance(state);
         state[u].s=1;
         state[u].p += u+'0';
         
         for (k=0 ; k< SIZE ; k++)
             if (state[k].s == 0)
             {
                if ( NP[u][k] != std::numeric_limits::min() )
                   if ( state[k].distance < state[u].distance + NP[u][k] )
                   {
                        state[k].distance = state[u].distance + NP[u][k];
                        state[k].p = state[u].p;
                   }
             }
             
     }
     /*for (i=0 ;i< SIZE ; i++)
     {
         cout<<"From "<<<" (start state) to ";
         cout<<<'\t';
         //cout<<<'\t';
         cout<<"Distance: ";
         cout<<(int)state[i].distance<<"\t\t";

         cout<<"Rout:";
         for (j=0 ; j<<' '<<< cout<
Astaraki آفلاين است   پاسخ با نقل قول
از Astaraki تشكر كرده اند:
aimaryam (۰۷-۱۷-۱۳۸۹), moosavianmz (۰۷-۴-۱۳۹۲)