声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1601|回复: 1

[C/C++] 强化学习---Boltzmann选择

[复制链接]
发表于 2008-1-17 18:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
下面的强化学习 代码

epsilon_greedy选择怎么改成  Boltzmann选择?
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #include <math.h>

  5. int move(int a, int &x, int &y, int x_size);
  6. int xy2s(int x, int y, int x_size);
  7. int select_action(int s, int num_a, double** Qtable);
  8. double max_Qval(int s, int num_a, double** Qtable);
  9. int epsilon_greedy(int epsilon,int s, int num_a, double** Qtable);
  10. int main()
  11. {
  12. int x_size;//x軸方向,迷路大小(x_size=10 时,x=0~9)
  13. int y_size;
  14. double alpha, gamma;
  15. int x, y, x_init, y_init;
  16. int **maze;
  17. int num_step;//Q值更新次数
  18. int num_trial;//运行回数
  19. int i,j,k;
  20. int a,s,sd;
  21. int num_a;
  22. int num_s;
  23. double **Qtable;
  24. int reward;
  25. double Qmax;
  26. int epsilon;

  27. //初期值
  28. alpha=0.5;
  29. gamma=0.9;
  30. epsilon=10;
  31. x_size=10;
  32. y_size=9;
  33. x_init=1;
  34. y_init=1;
  35. num_step=100;
  36. num_trial=500;
  37. num_a=4;
  38. num_s=x_size*y_size;

  39. int *suc_sum;
  40. int *suc_sum2;

  41. suc_sum= new int [(int)(num_trial/100)];
  42. suc_sum2= new int [(int)(num_trial/100)];
  43. //初始化
  44. srand( (unsigned)time( NULL ) );
  45. //Q-table
  46. Qtable=new double*[num_s];
  47. for(i=0;i<num_s;i++){
  48.   Qtable[i]=new double[num_a];
  49. }

  50. //Q-table初始化
  51. for(i=0;i<num_s;i++){
  52.   for(j=0;j<num_a;j++){
  53.    Qtable[i][j]=0.1;
  54.   }
  55. }

  56. //迷路
  57. maze=new int*[x_size];
  58. for(i=0;i<x_size;i++){
  59.   maze[i]=new int[y_size];
  60. }

  61. //迷路初始化(设置迷路墙壁)
  62. for(i=0;i<x_size;i++){
  63.   for(j=0;j<y_size;j++){
  64.    if(i==0 || j==0 || i==(x_size-1) || j==(y_size-1)){
  65.     maze[i][j]=-1;
  66.     for(k=0;k<num_a;k++){
  67.      Qtable[xy2s(i,j,x_size)][k]=0.0;
  68.     }
  69.    }
  70.    else{
  71.     maze[i][j]=0;
  72.    }
  73.   }
  74. }

  75. //设置墙壁
  76. maze[1][2]=-1;
  77. maze[2][2]=-1;
  78. maze[3][2]=-1;
  79. maze[5][4]=-1;
  80. maze[6][4]=-1;
  81. maze[6][3]=-1;
  82. maze[7][3]=-1;
  83. maze[8][3]=-1;
  84. maze[2][6]=-1;
  85. maze[2][7]=-1;
  86. maze[3][6]=-1;
  87. maze[6][7]=-1;
  88. for(i=0;i<x_size;i++){
  89.   for(j=0;j<y_size;j++){
  90.    if (maze[i][j]==-1){
  91.     for(k=0;k<num_a;k++){
  92.      Qtable[xy2s(i,j,x_size)][k]=0.0;
  93.     }
  94.    }
  95.   }
  96. }
  97. //设置maze
  98. maze[8][6]=10;

  99. for(i=0;i<x_size;i++){
  100.   for(j=0;j<y_size;j++){
  101.    printf("%3d",maze[i][j]);
  102.   }
  103.   printf("\n");
  104. }

  105. //初期设定
  106. x=x_init;
  107. y=y_init;
  108. s=xy2s(x,y,x_size);
  109. for(i=0;i<num_trial/100;i++){
  110.   suc_sum[i]=0;
  111. }
  112. for(i=0;i<num_trial/100;i++){
  113.   suc_sum2[i]=0;
  114. }

  115. //开始学习
  116. for(i=0;i<num_trial;i++){
  117.   printf("trial=%d\n",i);
  118.   for(j=0;j<num_step;j++){
  119. [size=3][color=red][b]   a=epsilon_greedy(epsilon,s,num_a,Qtable);//<--改为 Boltzmann选择[/b][/color][/size]
  120.    sd = move(a,x,y,x_size);
  121.    reward=maze[x][y];
  122.    Qmax=max_Qval(sd,num_a,Qtable);
  123.    Qtable[s][a]=(1 - alpha) * Qtable[s][a] + alpha * ((double)reward + gamma * Qmax);
  124.    if(reward<0){
  125.     //失败
  126.     x=x_init;
  127.     y=y_init;
  128.     s=xy2s(x,y,x_size);
  129.     printf("失败\n");
  130.     break;
  131.    }
  132.    else if(reward>0){
  133.     //成功
  134.     x=x_init;
  135.     y=y_init;
  136.     s=xy2s(x,y,x_size);
  137.     printf("成功\n");
  138.     suc_sum[i/100]++;
  139.     break;
  140.    }
  141.    else{
  142.     //继续
  143.     s=sd;
  144.    }
  145.   }
  146.   
  147.   //验证
  148.   if (i%100==0){
  149.    for(k=0;k<100;k++){
  150.     //初期设定
  151.     x=x_init;
  152.     y=y_init;
  153.     s=xy2s(x,y,x_size);
  154.     for(j=0;j<num_step;j++){
  155.      a=select_action(s,num_a,Qtable);
  156.      sd = move(a,x,y,x_size);
  157.      reward=maze[x][y];
  158.      if(reward<0){
  159.       //失败
  160.       x=x_init;
  161.       y=y_init;
  162.       s=xy2s(x,y,x_size);
  163.       //printf("失败\n");
  164.       break;
  165.      }
  166.      else if(reward>0){
  167.       //成功
  168.       x=x_init;
  169.       y=y_init;
  170.       s=xy2s(x,y,x_size);
  171.       suc_sum2[i/100]++;
  172.       //printf("成功\n");
  173.       break;
  174.      }
  175.      else{
  176.       
  177.       s=sd;
  178.      }
  179.     }
  180.    }
  181.   }
  182. }

  183. //追加
  184. //方向
  185. for(x=0;x<x_size;x++){
  186.   for(y=0;y<y_size;y++){
  187.    s=xy2s(x,y,x_size);
  188.    Qmax=max_Qval(s,num_a,Qtable);
  189.    if(Qmax==0){
  190.     printf("%3d",maze[x][y]);
  191.    }
  192.    else{
  193.     a=select_action(s,num_a,Qtable);
  194.     if(a==0){
  195.      printf(" →");
  196.     }
  197.     else if(a==1){
  198.      printf(" ↓");
  199.     }
  200.     else if(a==2){
  201.      printf(" ←");
  202.     }
  203.     else{
  204.      printf(" ↑");
  205.     }
  206.    }
  207.   }
  208.   printf("\n");
  209. }
  210. for(i=0;i<num_trial/100;i++){
  211.   printf("%d-%d epsilon_greedy:%d/100, select_action:%d/100\n",i*100,i*100+99,suc_sum[i],suc_sum2[i]);
  212. }
  213. //追加到这里

  214. for(i=0;i<num_s;i++){
  215.   delete[] Qtable[i];
  216. }
  217. delete[] Qtable;
  218. for(i=0;i<x_size;i++){
  219.   delete[] maze[i];
  220. }
  221. delete[] maze;
  222. return 0;
  223. }


  224. int move(int a, int &x, int &y, int x_size){
  225. if( a == 0){
  226.   y = y + 1;
  227. }
  228. else if( a == 1 ){
  229.   x = x + 1;
  230. }
  231. else if( a == 2 ){
  232.         y = y - 1;
  233. }
  234. else{
  235.         x = x - 1;
  236. }
  237. int sd;
  238. sd =  xy2s(x,y,x_size);

  239. return sd;
  240. }
  241. int xy2s(int x, int y, int x_size){
  242. int s;
  243. s = x + y * x_size;
  244. return s;
  245. }
  246. int select_action(int s, int num_a, double** Qtable){
  247. double max;
  248. int i=0;
  249. int* i_max = new int[num_a];
  250. int num_i_max=1;
  251. int a;
  252. i_max[0]=0;
  253. max=Qtable[s][0];
  254. for(i=1;i<num_a;i++){
  255.   if (Qtable[s][i]>max){
  256.    max=Qtable[s][i];
  257.    num_i_max=1;
  258.    i_max[0]=i;
  259.   }
  260.   else if(Qtable[s][i]==max){
  261.    num_i_max++;
  262.    i_max[num_i_max-1]=i;
  263.   }
  264. }

  265.   
  266. a= i_max[rand()%num_i_max];
  267. return a;
  268. }
  269. double max_Qval(int s, int num_a, double** Qtable){
  270. double max;
  271. int i=0;

  272. max=Qtable[s][0];
  273. for(i=1;i<num_a;i++){
  274.   if (Qtable[s][i]>max){
  275.    max=Qtable[s][i];
  276.   }
  277. }
  278. return max;
  279. }
  280. int epsilon_greedy(int epsilon, int s, int num_a, double** Qtable){
  281. int a;
  282. if(epsilon > rand()%100){
  283.   
  284.   a=rand()%num_a;
  285.   //printf("rand选择行动\n");
  286. }
  287. else{
  288.   //选择最大Q值的行动
  289.   a=select_action(s,num_a,Qtable);
  290. }
  291. return a;
  292. }
复制代码

[ 本帖最后由 风花雪月 于 2008-1-18 10:39 编辑 ]

QL2.cpp

5.46 KB, 下载次数: 3

Boltzmann选择

回复
分享到:

使用道具 举报

发表于 2008-1-18 10:40 | 显示全部楼层
这个和算法好像没有他大关系

估计搞清楚epsilon_greedy 和 Boltzmann两种选择的原理改起来应该很容易
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-24 01:55 , Processed in 0.075785 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表