###前提・実現したいこと
Q学習を用いて最適な経路を求めるプログラムを作成しています。
0<x<250、0<y<250内を0-25のエリアに分割し、スタートからゴールまでの経路をQ学習を用いて求めています。
エリアの外に出たとき、また障害物に当たった時に一個前の動作に戻して試行を繰り返したいと考えています。
###発生している問題・エラーメッセージ
0<x<250、0<y<250の外に出たとき、また障害物に当たった時に一個前の動作に戻して試行を繰り返したいのですが方法に悩んでいます。
何かいい方法があれば教えていただきたいです!
よろしくお願いします。
###ソースコード
C
1#define _CRT_SECURE_NO_WARNINGS 2#include <stdio.h> 3#include <stdlib.h> 4#include <time.h> 5#define _USE_MATH_DEFINES 6#include <math.h> 7 8typedef struct car { 9 double x; //現在位置x 10 double y; //現在位置y 11 double dx; //次の位置x 12 double dy; //次の位置y 13 double max_x; //xの最大値 14 double max_y; //yの最大値 15 int s; 16 int sd; 17 int L = 50; 18}agent; 19 20int move(car *agent, int a, int sd); 21int select_action(car *agent, int num_a, double** Qtable); 22double max_Qval(car *agent, int num_a, double** Qtable); 23int epsilon_greedy(car *agent, int epsilon, int num_a, double** Qtable); 24int xy2s(car *agent, int a); 25 26int main() { 27 FILE *file; 28 file = fopen("car.csv", "w"); 29 car agent; 30 31 int num_step; //ステップ数 32 int num_trial; //試行回数 33 int i, j; 34 int a; 35 double alpha, gamma; 36 37 int reward; //報酬 38 39 int num_a; //行動 40 int num_s; //状態 41 double **Qtable; 42 double Qmax; 43 int epsilon; 44 45 //パラメータの設定 46 alpha = 0.5; 47 gamma = 0.9; 48 epsilon = 10; 49 50 num_step = 500; 51 num_trial = 1000; 52 53 num_a = 4; 54 55 //エリアの数 56 num_s = 25; 57 int sepa = 5; 58 59 //乱数の初期化 60 srand((unsigned)time(NULL)); 61 62 //Q-table 63 Qtable = new double*[num_s]; 64 for (i = 0; i < num_s; i++) { 65 Qtable[i] = new double[num_a]; 66 } 67 68 //Q-tableの初期化 69 for (i = 0; i < num_s; i++) { 70 for (j = 0; j < num_a; j++) { 71 Qtable[i][j] = 0; 72 } 73 } 74 75 //agentの初期設定 76 agent.x = 0.0; 77 agent.y = 0.0; 78 agent.max_x = 250.0; 79 agent.max_y = 250.0; 80 agent.s = (int)agent.x / agent.L + (int)agent.y / agent.L * sepa; 81 82 //学習開始 83 for (i = 0; i < num_trial; i++) { 84 fprintf(file, "i=%d\n", i); 85 for (j = 0; j < num_step; j++) { 86 fprintf(file, "j=%d\n", j); 87 88 a = epsilon_greedy(&agent, epsilon, num_a, Qtable); 89 agent.s = (int)agent.x / agent.L + (int)agent.y / agent.L * 2; 90 91 agent.sd = move(&agent, a, agent.s); 92 printf("%f,%f\n", agent.x, agent.y); 93 94 //ここで障害物の設定 95 //障害物があるagent.sに入るとrewardに-10が入る 96 //Goalに入るとrewardに+10が入り試行を終了 97 //その他はreward=0なのでそのまま続行 98 99 if (agent.sd == 20) { 100 reward = 10; 101 } 102 else if (agent.sd == 10 || agent.sd == 11 || agent.sd == 12) { 103 reward = -10; 104 } 105 else { 106 reward = 0; 107 } 108 109 Qmax = max_Qval(&agent, num_a, Qtable); 110 Qtable[agent.s][a] = (1 - alpha)*Qtable[agent.s][a] + alpha * ((double)reward + gamma*Qmax);//?? 111 112 fprintf(file, "%f,%f,%d,%d,%d\n", agent.x, agent.y, a, agent.sd, agent.s); 113 printf("%f,%f,%d,%d,%d,%d\n", agent.x, agent.y, agent.s,agent.sd,a,reward); 114 115 if (reward < 0) { 116 //失敗 117 //ここで一つ前の処理に戻せないか? 118 break; 119 } 120 else if (reward < 0) { 121 //成功 122 agent.x = 25.0; 123 agent.y = 25.0; 124 agent.s = (int)agent.x / agent.L + (int)agent.y / agent.L * sepa; 125 break; 126 } 127 else { 128 //続行 129 agent.s = agent.sd; 130 } 131 } 132 } 133 fclose(file); 134 return 0; 135} 136 137int move(car *agent, int a, int sd) { 138 139 switch (a) { 140 case 0://↑ 141 agent->dy = agent->y + 6.5; 142 agent->y = agent->dy; 143 break; 144 case 1://→ 145 agent->dx = agent->x + 6.5; 146 agent->x = agent->dx; 147 break; 148 case 2://↓ 149 agent->dy = agent->y - 6.5; 150 agent->y = agent->dy; 151 break; 152 default://← 153 agent->dx = agent->x - 6.5; 154 agent->x = agent->dx; 155 break; 156 } 157 //sdはアクションが起こった後のagent.sを表す 158 agent->sd = (int)agent->x / agent->L + (int)agent->y / agent->L * 5; 159 return sd; 160} 161 162 163int select_action(car *agent, int num_a, double**Qtable) { 164 double max; 165 int i = 0; 166 int* i_max = new int[num_a];//? 167 int num_i_max = 1;//? 168 int a; 169 i_max[0] = 0;//? 170 max = Qtable[agent->s][0];//? 171 172 for (i = 0; i < num_a; i++) { 173 if (Qtable[agent->s][i] > max) { 174 num_i_max = 1; 175 i_max[0] = i; 176 } 177 else if (Qtable[agent->s][i] == max) { 178 num_i_max++; 179 i_max[num_i_max - 1] = i; 180 } 181 } 182 183 a = i_max[rand() % num_i_max]; 184 return a; 185} 186 187double max_Qval(car *agent, int num_a, double** Qtable) { 188 double max; 189 int i = 0; 190 191 max = Qtable[agent->s][0];//? 192 for (i = 0; i < num_a; i++) {//1? 193 if (Qtable[agent->s][i] > max) { 194 max = Qtable[agent->s][i]; 195 } 196 } 197 return max; 198} 199 200int epsilon_greedy(car *agent, int epsilon, int num_a, double** Qtable) { 201 int a; 202 if (epsilon > rand() % 100) { 203 a = rand() % num_a; 204 } 205 else { 206 a = select_action(agent, num_a, Qtable); 207 } 208 return a; 209}
###補足情報(言語/FW/ツール等のバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/03 19:06
2015/12/03 20:42