質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

7123閲覧

一個前の動作に戻す処理の方法

mikamikan

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/12/01 10:18

###前提・実現したいこと
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/ツール等のバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

同一の構造体(agent)を2つ作って、初期あるいは成功時のデータを保持。
戻す必要があれば、書き戻す・・・じゃだめですか?

投稿2015/12/01 11:33

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikamikan

2015/12/03 19:06

構造体を増やす方法は思いつきませんでした! ありがとうございます!
cateye

2015/12/03 20:42

「ひとつ前の状態を保持する」と言うのはいろんな場面で使います。 覚えておいて損はないですよd^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問