読者です 読者をやめる 読者になる 読者になる

人工知能であそぶ

人工知能をつくってあそぶ.あと個人的な勉強のメモ.

Java高速化のための備忘録

はじめに

 人工知能は全般的に重たい処理が多いため,一つ一つの処理を軽くする努力が必要である.試行錯誤して早くなった処理をメモしておく.タイマーなどの誤差もあり,平均を取ってもばらつきがあったので有効数字はあえて1桁にしてある.

計測環境

 CPU:2.5 GHz Intel Core i5
 メモリ:16GB 1600 MHz DDR3
 OS:OS X El Capitan 10.11.4
 IDEEclipse Neon Release (4.6.0)

以下の // --------------------------------------------- // で括られた区間を変更することで様々な処理の実行時間を計測した.いずれも,1000回の平均をとった.

public static final int TRIAL_NUM = 1000;
	
public static void main(String[] args) {
	double timeSum = 0;
	for (int trial = 0; trial < TRIAL_NUM; trial++) {
		double start = System.nanoTime(); // 計測開始
		// --------------------------------------------- //
		//
		//   計測する処理
		//
		// --------------------------------------------- //
		double end = System.nanoTime();   // 計測終了
		timeSum += end - start;           // 今回の計測時間
	}
	double timeAve = timeSum / (double)TRIAL_NUM; // 今回の計測時間
	System.out.println("Time:" + timeAve / 1000000 + "ms");
}

println

 デバッグで吐き出した文章などをそのままにしているととても遅い.
 0~99までの100個の数値を上書きし代入するとき,printの有無でそれぞれかかる時間を計測した.

  • printlnなし:Time:0.001ms
  • printlnあり:Time:0.5ms

・printlnなし

int a = 0;
for(int i = 0; i < 100; i++){
	a = i;
}

・printlnあり

int a = 0;
for(int i = 0; i < 100; i++){
	a = i;
	System.out.println(i);
}

String型文字列の末尾への追加(加算)

 0~99までの100個の数値をStringに直し,末尾に追加して行った時の時間を,それぞれの追加方法において計測した.StringBufferとStringBuilderは違いがわからなかった(2017/02/05 追記:StringBuilderはスレッドセーフではないので並列化が必要な時はStringBufferを使うようにする必要がある.)ので1000個にして試したところ,StringBuilderが速かった.日本語wikipedia全体(5.5GBくらいのテキストファイル)やツイッターなどを自然言語処理したいときは,これを使わないと詰む.

  • +演算子:Time:0.07ms
  • concat:Time:0.04ms
  • StringBuffer:Time:0.02ms(1000個:0.12ms)
  • StringBuilder:Time:0.02ms(1000個:0.10ms)

・+演算子

String s = "";
for(int i = 0; i < 100; i++){
	s += String.valueOf(i);
}

・concat

String s = "";
for(int i = 0; i < 100; i++){
	s = s.concat(String.valueOf(i));
}

・StringBuffer

String s = "";
StringBuilder buf = new StringBuilder();
for(int i = 0; i < 100; i++){
	buf.append(String.valueOf(i));
}
s = buf.toString();

・StringBuilder

String s = "";
StringBuilder buf = new StringBuilder();
for(int i = 0; i < 100; i++){
	buf.append(String.valueOf(i));
}
s = buf.toString();

あとがき

気がついたら追加していく

参考資料

qiita.com

Eclipseで実行時にソースの変更が反映されない

はじめに

 過去4回くらいやらかして,どこを探しても出てこなかったので備忘録として書いておきます.

通常の対処法

 「プロジェクト」ー「クリーン」でキャッシュを削除します.
その後実行することで新しいソースが反映されます.

それでもうまくいかない場合(コピペが原因かも)

 私の場合はクラスをまるごとコピペした時に起こります.
主にmain関数で,クラスのインスタンスを生成する際にクラスの名前が間違っていませんか?
 
 先ほどやらかした例.

  1. Aaa.javaの名前を変更したい.
  2. Aaa.javaをコピーし,Bbb.javaにした.
  3. Bbb.javaを少し変更し実行.
  4. 動いているようだが,ソースの変更が反映されない(汗)
  5. main関数でnew Bbb()とするところをnew Aaa()としていた.

コピー元をバックアップとして取って置いていたので気がつかずに30分ほど,再起動したりクリーンしたりタスクを終了したりファイルを消去して作ったりなど,格闘していました.同じようなミスをする方がいるかはわかりませんが,私はまたやらかしそうなので一応メモしておきます. 

JavaでQ学習を実装 迷路の最適ルートを学習・探索

やろうと思ったきっかけ

 近年DeepLearningが画像処理や一般物体認識などのコンペティションにおいて優秀な成果を挙げたとの報告が後を絶たない.これらで主に用いられるのは畳み込みニューラルネットワーク(CNN)である.このモデルのように層の深いニューラルネットワークを用いた学習のみを行うものでは,ゲームなどの時事刻々と状況が変化していくような入力に対して対応できない.仮に全時刻において全入力と教師のペアが与えられれば可能ではあると思うが,そのような問題以外には対応できない.しかし,強化学習の枠組みでは,このような状況にも対応できる.楽しそう.よし,やろうということでやった.
 Q学習は同じ研究室の友人が卒論でやっていたのを眺めていた程度なので,一から実装しつつ学ぶことにしてみた.記事としてまとめようと思ったのは,ブログや本ごとに表現や記法が異なるため,自分なりに解釈しわかりやすい方法で残したかったためである.

Q学習(Q-Learning)

Q学習とは

 Q学習は,強化学習の中心的手法であるTD学習(Temporal Difference Learning)の一つである.有限マルコフ決定過程の環境下で定式化される.時事刻々と変化するような状況を学習する際に,それらがすべて終わってから学習するのではなく,1ステップごとに学習を行う.そのため,学習を高速に行うことができる.ここでは,1ステップQ学習を扱う.

f:id:nkdkccmbr:20161007134405p:plain

 ある環境下に置かれたエージェントが,ある状態においてどのような行動をとるべきかという指標を更新していくことにより学習を行う.エージェントは行動を行うと環境から,報酬をもらう.この報酬がたくさんもらえるようになる方向に学習が進んでいく.
 名前の由来は様々な説があったためわからなかった.行動価値関数のQに由来するものであると思うが,なぜこれにQが割り振られるのかがわからなかった.TD学習ではP,r,s,t,Vなどの記号が用いられているため余ったQを使ったのかとか考ていえた.

Q学習の内容

f:id:nkdkccmbr:20161006170319p:plain

 上の図をもとに説明をしていく.環境のとりうる状態集合をS,エージェントのとりうる行動の集合をAとする.状態s∈Sにおいて,エージェントが行動a∈A(s)を行った結果,状態s’∈Sに遷移したとする.このときの行動の価値を行動価値関数Q(s,a)で評価する.この関数は適当に初期化され学習によって更新されていく.また,状態s∈Sにおいて,行動a∈A(s)を行い状態s'∈Sに遷移した際には報酬R(s,a,s')(単純にrと書くのが一般的であるが,s,a,s'に依存して決まるため明示的にこう書いた)が与えられる.これは定数であり自分で定める.時刻を意識して,sをs_t,s'をs_{t+1}と書くことも多いが,ここでは1ステップ以上見ることはしないため,時刻の表記は省略した.
 ここで,Q学習の行動価値関数の更新式を以下に示す.この更新により学習を行う.

{
\displaystyle
\begin{equation}
{\large
Q(s,a) ← (1-α)Q(s,a)+α \left[ R(s,a,s')+γ\max_{a’∈A(s')} Q(s',a') \right]
}
\end{equation}
}

 α(0<α≦1)は学習率で0.1程度,γ(0<γ≦1)は割引率で0.90~0.99程度にすることが多い.また,(1-α)Q(s,a)を展開してαのかっこの中に入れて表記することが多いようだが,学習率に焦点をあてて考えるとこちらの方がわかりやすいと思ったため変形前の表記にした.
 この式の意味を考えていく.まず(1-α)の項は今の行動価値関数の値を表す.(1-α)は0.9程度となる.αの項は学習のために用いられる値が入る.かっこ内の1項目は,報酬であり,報酬が高いほどQ値(行動価値関数の値)が高くなることがわかる.更新をなんども行うことを考えると,学習が進むにつれ報酬が高い経路のQ値はどんどん高くなっていくことがわかる.2項目は,先ほどの図で赤いエッジで結ばれたところに相当し,状態s'∈Sにおいて,Q(s',a')が一番高くなるような行動a'∈A(s')を選択したときのQ値に割引率をかけたものである.このとき,すべてのa∈A(s)とs∈SにおいてQ値は初期化を行っているため,なんらかの値が必ず入っている.割引率は,遷移後の状態s'∈Sから次の行動を行ったときに,一番高くなるようなQ値を部分的に加算するための係数である.1項目で説明したように,報酬が高い経路は学習が進むにつれQ値が高くなっていくため,この2項目を加えることによりQ値が高い方に行きやすくすることを可能としている.
 したがって,この更新を何ども行うことにより報酬がより高くなるような経路を選択することが可能となる.

アルゴリズム

 以下にQ学習全体のアルゴリズムを示す.

  1. すべての行動a∈A(s),状態s∈Sについて,Q(s,a)をランダムに初期化する
  2. 以下を繰り返す
    1. 開始状態をsにセットする
    2. 以下を繰り返す
      1. 状態sにおいて,行動aをなんらかの方策(※)によって決める
      2. 行動aを行い,状態s'を観測し,報酬R(s,a,s')を受け取る
      3. この行動に該当するQ(s,a)を更新式で更新する(S'が終了条件を満たすときはmaxの項は0にする)
      4. s←s'
      5. 終了条件(ゴールなどの目的を達成したなど)を満たしていなければループ,満たしていたら終了
    3. 終了条件(学習回数・コストなど)を満たしていなければループ,満たしていたら終了

 ※ 行動の選択にはε-greedy法がよく用いられる.εの確率でランダムに,(1-ε)の確率でQ値が最大になるような行動を選択する.このような確率的な選択を取り入れることにより,局所解に陥ることを避け学習を効率化する.他にもボルツマン分布を使った選択やルーレット選択などの手法が用いられる.

Javaでの実装

プログラムの説明

 JavaでQ学習を用いて迷路を解くプログラムを作成した.この迷路は10×10のマスで構成されている.マスはそれぞれ壁か道になっており,エージェントは道しか通ることができない.上下左右一番外側のマスは壁とし迷路の外には出られないようにした.また,左上をスタート,右下をゴールとした.下の図は今回用いた迷路を画像化したものである.

f:id:nkdkccmbr:20161008203139p:plain

 次に状態s∈Sを定義する.エージェントの位置はx軸,y軸の座標で表すことができる.左上を原点に右向きにx軸を,下向きにy軸を取った.
 エージェントの行動a∈A(s)は,上下左右への1マスの移動とした.ただし,移動した方向に壁がある場合にはその場で足踏みをし,壁にぶつかったと判定することにした.
 報酬(ペナルティ)は以下の通りである.

  1. ゴール手前の1マスからゴールへ移動した時:100
  2. 壁にぶつかった時:-5
  3. 1ステップ経過:-1

ゴールのみに報酬を与えることによって,Q学習ではランダムに探索,学習していくうちにゴールの方からスタートに向けてQ値が伝搬していくのではないかと考えた.最初はペナルティを全く与えずに学習させたが壁にぶつかることが多かったため,壁にぶつかった際にはマイナスの報酬(ペナルティ)を与え,壁にぶつかることが非効率的であることを学習させた.また,時間経過にもペナルティを与えた.
 その他のパラメータ

  1. ε-greedy法のε:0.30
  2. 学習率α:0.10
  3. 割引率γ:0.90
  4. Q値の初期値:0~30の乱数(整数)

ソースコード(Java)

QLearning.java

package qLearning;

import java.util.ArrayList;
import java.util.Random;

public class QLearning {
	
	// パラメータ
	public static final double EPSILON = 0.30;       // ε-greedy法のε
	public static final double ALPHA = 0.10;         // 学習率α
	public static final double GAMMA = 0.90;         // 割引率γ
	public static final int GOAL_REWARD = 100;       // ゴール時の報酬
	public static final int HIT_WALL_PENALTY = 5;    // 壁にぶつかった時の報酬のペナルティ
	public static final int ONE_STEP_PENALTY = 1;    // 1ステップ経過のペナルティ
	public static final int LEANING_TIMES = 1000000; // 学習回数
	public static final int INIT_Q_MAX = 30;         // Qの初期値の最大値(乱数の最大値)
	
	// 迷路
	// 0 通れない 壁
	// 1 通れる 道
	// スタートは左上 maze[1][1]
	// ゴールは右下  maze[8][8]
	// 配列は[y座標][x座標]なことに注意
	public static final int MAZE[][] = {
			{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
			{0, 1, 0, 1, 1, 1, 1, 1, 1, 0},
			{0, 1, 1, 1, 0, 1, 1, 0, 1, 0},
			{0, 0, 0, 1, 0, 1, 0, 0, 1, 0},
			{0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
			{0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
			{0, 1, 0, 1, 0, 1, 1, 1, 1, 0},
			{0, 1, 0, 0, 0, 1, 0, 0, 1, 0},
			{0, 1, 1, 1, 1, 1, 1, 0, 1, 0},
			{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
	};
	
	public double q[][][];
		
	// エージェントの状態
	private int sPosX;     // x座標
	private int sPosY;     // y座標
	private int sdPosX;    // 観測したx座標
	private int sdPosY;    // 観測したy座標
	
	// 方向 エージェントの行動
	public static final int LEFT  = 0;
	public static final int UP    = 1;
	public static final int RIGHT = 2;
	public static final int DOWN  = 3;
	
	private int stepNum; // 経過ステップ数
	
	private ArrayList<String> route; // 経路保存用配列
	
	// コンストラクタ
	QLearning(){
		// Q値の初期化
		q = new double[10][10][4];
		
		// エージェントをスタートにセット
		sPosX = 1;
		sPosY = 1;
		sdPosX = 1;
		sdPosY = 1;
		
		// 経路保存用配列の確保
		route = new ArrayList<String>();
	}
	
	public static void main(String[] args) {
		
		int minStepNum = Integer.MAX_VALUE; // 最小ステップ数の記録
		
		QLearning learn = new QLearning();
		
		learn.initQ();               // すべてのQ値の初期化
		for (int i = 0; i < LEANING_TIMES; i++) {
			learn.initAgent();       // エージェントの初期化
			learn.route = new ArrayList<String>();
			boolean isGoal = false;
			while (!isGoal) {
				learn.stepNum++;
								
				int a = learn.eGreedy();   // ε-greedy法で行動を選択
				int r = learn.Action(a);   // 行動を行い次の状態を観測し報酬を受け取る
				r -= ONE_STEP_PENALTY;     // ステップ経過のペナルティ
				learn.updateQ(r, a);       // Q値の更新
				learn.updateS();           // 状態の更新 s←s'
				
				// ゴールの判定
				if (learn.sPosX == 8 && learn.sPosY == 8) {
					isGoal = true;
				}
			}
			if (learn.stepNum < minStepNum) {
				minStepNum = learn.stepNum;
			}
			if (learn.stepNum == 22) {
				minStepNum = learn.stepNum;
				
				// すべてのQ値を出力
				learn.printQ();
				for (int j = 0; j < learn.route.size(); j++ ) {
					System.out.println(learn.route.get(j));
				}
				System.out.println("学習回数:" + i + " ゴールまでのステップ数:" + learn.stepNum + " これまでの最小ステップ数:" + minStepNum);
				break;
			}
			System.out.println("学習回数:" + i + " ゴールまでのステップ数:" + learn.stepNum + " これまでの最小ステップ数:" + minStepNum);
		}
		
	}
		
	// Q値の初期化
	public void initQ() {
		// 0~INIT_Q_MAXの乱数で初期化
        Random rand = new Random();
		for (int x = 0; x < 10; x++) {
			for (int y = 0; y < 10; y++) {
				for (int a = 0; a < 4; a++) {
					int randNum = rand.nextInt(INIT_Q_MAX+1);
					q[x][y][a] = randNum;
				}
			}
		}
	}
	
	// エージェントの初期化
	public void initAgent() {
		sPosX = 1;
		sPosY = 1;
		stepNum = 0;
	}
	
	// 行動の選択 ε-greedy法
	public int eGreedy() {
		
		int selectedA = 0;
		
        Random rand = new Random();
        int randNum = rand.nextInt(100+1);
        
        if (randNum <= EPSILON * 100.0) {
        	// εの確率 Q値が最大となるようなaを選択
			for (int a = 0; a < 4; a++) {
				if (q[sPosX][sPosY][selectedA] < q[sPosX][sPosY][a]) {
					selectedA = a;	
				}
			}
        } else {
        	// (1-ε)の確率 ランダムにaを選択
        	selectedA = rand.nextInt(4);
        }
        
        return selectedA;
        
	}
	
	// directionの向きに移動可能であれば移動
	// 報酬を返す
	public int Action(int direction) {
		
		int r = 0;
		
		// 観測後の状態に現在の状態を設定
		// この関数内で観測後のものに書き換える
		sdPosX = sPosX;
		sdPosY = sPosY;
				
		switch (direction) {
			case LEFT:
				// 移動可能か
				if (MAZE[sPosY][sPosX - 1] == 1) {
					sdPosX--;
				} else {
					// 壁にぶつかった時
					r -= HIT_WALL_PENALTY;
				}
				route.add("←" + "[" + String.valueOf(sdPosX) + "][" + String.valueOf(sdPosY) + "] ");
				break;
			case UP:
				// 移動可能か
				if (MAZE[sPosY - 1][sPosX] == 1) {
					sdPosY--;
				} else {
					// 壁にぶつかった時
					r -= HIT_WALL_PENALTY;
				}
				route.add("↑" + "[" + String.valueOf(sdPosX) + "][" + String.valueOf(sdPosY) + "] ");
				break;
			case RIGHT:
				// 移動可能か
				if (MAZE[sPosY][sPosX + 1] == 1) {
					sdPosX++;
				} else {
					// 壁にぶつかった時
					r -= HIT_WALL_PENALTY;
				}
				route.add("→" + "[" + String.valueOf(sdPosX) + "][" + String.valueOf(sdPosY) + "] ");
				break;
			case DOWN:
				// 移動可能か
				if (MAZE[sPosY + 1][sPosX] == 1) {
					sdPosY++;
				} else {
					// 壁にぶつかった時
					r -= HIT_WALL_PENALTY;
				}
				route.add("↓" + "[" + String.valueOf(sdPosX) + "][" + String.valueOf(sdPosY) + "] ");
				break;
		}
		
		// ゴール報酬の設定
		if (sdPosX == 8 && sdPosY == 8) {
			r = GOAL_REWARD;
		}
		
		return r;
	}
	
	// Q値の更新
	public void updateQ(int r, int a) {
		
		// 状態s'で行った時にQ値が最大となるような行動
		int maxA = 0;
		for (int i = 0; i < 4; i++) {
			if (q[sdPosX][sdPosY][maxA] < q[sdPosX][sdPosY][i]) {
				maxA = i;	
			}
		}
		
		// Q値の更新
		q[sPosX][sPosY][a] = (1.0 - ALPHA) * q[sPosX][sPosY][a] + ALPHA * (r + GAMMA * q[sdPosX][sdPosY][maxA]);
		
	}
	
	// 状態の更新
	public void updateS() {
		sPosX = sdPosX;
		sPosY = sdPosY;
	}
	
	// すべてのQ値を出力
	public void printQ() {
		for (int x = 0; x < 10; x++) {
			for (int y = 0; y < 10; y++) {
				for (int a = 0; a < 4; a++) {
					System.out.println("x:" + x + " y:" + y + " a:" + a + " Q:" + q[x][y][a]);
				}
			}
		}
	}
	
}

結果(ゴールまでの経路)

 28,398回学習させた時に,最短の22ステップでゴールした.以下はスタートからゴールまでの経路である.移動方向を矢印,移動後の座標を[x][y]で表した.

1. ↓[1][2]
2. →[2][2]
3. →[3][2]
4. ↓[3][3]
5. ↓[3][4]
6. ←[2][4]
7. ←[1][4]
8. ↓[1][5]
9. ↓[1][6]
10. ↓[1][7]
11. ↓[1][8]
12. →[2][8]
13. →[3][8]
14. →[4][8]
15. →[5][8]
16. ↑[5][7]
17. ↑[5][6]
18. →[6][6]
19. →[7][6]
20. →[8][6]
21. ↓[8][7]
22. ↓[8][8]

 これを手書きで無理やり画像にするとこのようになる.

f:id:nkdkccmbr:20161009003126p:plain

 壁にぶつかることなく,ゴールまでの道を完璧に進んでいることがわかる.この時のQ値は記事の最後に添付した.

考察

 学習率などのパラメータが与える影響は大きく,他の最適化問題同様に経験則的に最適な値に調整する必要があると感じた.
 実装して動かしてみて初めてわかったことだが,エージェントにどのような場面で報酬やペナルティを与えるべきかという選択が学習の効率化に大きく影響している.今回のような単純な問題ではこの設定はさほど難しくはないが,より複雑な問題になった時にはこの選択が学習の効率化への鍵となるだろうと考えられる.普通の機会学習における特徴量の選択に近いものを感じた.

あとがき

 毎回のことながら実装すると理解が深まると感じた.これも毎回だが,綺麗なプログラムが書けるようになりたいと思った.

参考資料


qiita.com
www.sist.ac.jp
Q-Learning
yamaimo.hatenablog.jp
https://www.sat.t.u-tokyo.ac.jp/~mak/20140319-makino.pdf

<論文・書籍>
[1] 竹内 雅英, Q学習における知識の再利用による学習の高速化に関する研究. 修士論文, 三重大学, 2008.
[2] Watkins, C.J.C.H., Learning from Delayed Rewards. PhD thesis, Cambridge University, 1989.
[3] Richard S. Sutton, Andrew G.Barto, 三上 貞芳, 皆川 雅章, 強化学習, 森北出版株式会社, pp.142-161, 2000.

おまけ

なにかの役に立つかもしれないのでこの時のQ値の一覧も載せておく.きちんと学習できていることが確認できる.

x:0 y:0 a:0 Q:10.0
x:0 y:0 a:1 Q:4.0
x:0 y:0 a:2 Q:10.0
x:0 y:0 a:3 Q:26.0
x:0 y:1 a:0 Q:21.0
x:0 y:1 a:1 Q:6.0
x:0 y:1 a:2 Q:12.0
x:0 y:1 a:3 Q:19.0
x:0 y:2 a:0 Q:4.0
x:0 y:2 a:1 Q:30.0
x:0 y:2 a:2 Q:14.0
x:0 y:2 a:3 Q:20.0
x:0 y:3 a:0 Q:20.0
x:0 y:3 a:1 Q:2.0
x:0 y:3 a:2 Q:27.0
x:0 y:3 a:3 Q:1.0
x:0 y:4 a:0 Q:2.0
x:0 y:4 a:1 Q:2.0
x:0 y:4 a:2 Q:18.0
x:0 y:4 a:3 Q:14.0
x:0 y:5 a:0 Q:27.0
x:0 y:5 a:1 Q:6.0
x:0 y:5 a:2 Q:23.0
x:0 y:5 a:3 Q:23.0
x:0 y:6 a:0 Q:11.0
x:0 y:6 a:1 Q:3.0
x:0 y:6 a:2 Q:7.0
x:0 y:6 a:3 Q:16.0
x:0 y:7 a:0 Q:28.0
x:0 y:7 a:1 Q:17.0
x:0 y:7 a:2 Q:20.0
x:0 y:7 a:3 Q:11.0
x:0 y:8 a:0 Q:27.0
x:0 y:8 a:1 Q:18.0
x:0 y:8 a:2 Q:1.0
x:0 y:8 a:3 Q:1.0
x:0 y:9 a:0 Q:0.0
x:0 y:9 a:1 Q:4.0
x:0 y:9 a:2 Q:15.0
x:0 y:9 a:3 Q:11.0
x:1 y:0 a:0 Q:19.0
x:1 y:0 a:1 Q:18.0
x:1 y:0 a:2 Q:26.0
x:1 y:0 a:3 Q:24.0
x:1 y:1 a:0 Q:-1.8730038738925838
x:1 y:1 a:1 Q:-1.8730038738925838
x:1 y:1 a:2 Q:-1.8730038738925838
x:1 y:1 a:3 Q:4.585551251230464
x:1 y:2 a:0 Q:-0.41444874876953786
x:1 y:2 a:1 Q:3.1269961261074144
x:1 y:2 a:2 Q:6.206168056922737
x:1 y:2 a:3 Q:-0.41444874876953786
x:1 y:3 a:0 Q:23.0
x:1 y:3 a:1 Q:17.0
x:1 y:3 a:2 Q:20.0
x:1 y:3 a:3 Q:5.0
x:1 y:4 a:0 Q:12.445287908216502
x:1 y:4 a:1 Q:12.445287908216502
x:1 y:4 a:2 Q:14.700759117394847
x:1 y:4 a:3 Q:20.49476434246279
x:1 y:5 a:0 Q:15.494764342462814
x:1 y:5 a:1 Q:17.445287908216503
x:1 y:5 a:2 Q:15.494764342462814
x:1 y:5 a:3 Q:23.883071491625348
x:1 y:6 a:0 Q:18.883071491625348
x:1 y:6 a:1 Q:20.49476434246279
x:1 y:6 a:2 Q:18.883071491625348
x:1 y:6 a:3 Q:27.647857212917078
x:1 y:7 a:0 Q:22.647857212917078
x:1 y:7 a:1 Q:23.883071491625348
x:1 y:7 a:2 Q:22.647857212917078
x:1 y:7 a:3 Q:31.830952458796766
x:1 y:8 a:0 Q:26.830952458796766
x:1 y:8 a:1 Q:27.647857212917078
x:1 y:8 a:2 Q:36.478836065329766
x:1 y:8 a:3 Q:26.830952458796766
x:1 y:9 a:0 Q:2.0
x:1 y:9 a:1 Q:9.0
x:1 y:9 a:2 Q:10.0
x:1 y:9 a:3 Q:10.0
x:2 y:0 a:0 Q:0.0
x:2 y:0 a:1 Q:12.0
x:2 y:0 a:2 Q:24.0
x:2 y:0 a:3 Q:25.0
x:2 y:1 a:0 Q:2.0
x:2 y:1 a:1 Q:23.0
x:2 y:1 a:2 Q:5.0
x:2 y:1 a:3 Q:19.0
x:2 y:2 a:0 Q:4.585551251230464
x:2 y:2 a:1 Q:1.2061680569227422
x:2 y:2 a:2 Q:8.006853396580825
x:2 y:2 a:3 Q:1.2061680569227422
x:2 y:3 a:0 Q:17.0
x:2 y:3 a:1 Q:18.0
x:2 y:3 a:2 Q:12.0
x:2 y:3 a:3 Q:20.0
x:2 y:4 a:0 Q:17.445287908216503
x:2 y:4 a:1 Q:9.700759117394847
x:2 y:4 a:2 Q:12.230683205655358
x:2 y:4 a:3 Q:9.700759117394847
x:2 y:5 a:0 Q:28.0
x:2 y:5 a:1 Q:18.0
x:2 y:5 a:2 Q:10.0
x:2 y:5 a:3 Q:24.0
x:2 y:6 a:0 Q:0.0
x:2 y:6 a:1 Q:17.0
x:2 y:6 a:2 Q:13.0
x:2 y:6 a:3 Q:13.0
x:2 y:7 a:0 Q:25.0
x:2 y:7 a:1 Q:30.0
x:2 y:7 a:2 Q:9.0
x:2 y:7 a:3 Q:23.0
x:2 y:8 a:0 Q:31.830952458796766
x:2 y:8 a:1 Q:31.478836065329777
x:2 y:8 a:2 Q:41.64315118369975
x:2 y:8 a:3 Q:31.478836065329777
x:2 y:9 a:0 Q:20.0
x:2 y:9 a:1 Q:26.0
x:2 y:9 a:2 Q:27.0
x:2 y:9 a:3 Q:4.0
x:3 y:0 a:0 Q:0.0
x:3 y:0 a:1 Q:9.0
x:3 y:0 a:2 Q:9.0
x:3 y:0 a:3 Q:27.0
x:3 y:1 a:0 Q:1.2061680569227422
x:3 y:1 a:1 Q:1.2061680569227422
x:3 y:1 a:2 Q:4.585551251230464
x:3 y:1 a:3 Q:8.006853396580825
x:3 y:2 a:0 Q:6.206168056922737
x:3 y:2 a:1 Q:6.206168056922737
x:3 y:2 a:2 Q:3.0068533965808255
x:3 y:2 a:3 Q:10.00761488508981
x:3 y:3 a:0 Q:5.007614885089821
x:3 y:3 a:1 Q:8.006853396580825
x:3 y:3 a:2 Q:5.007614885089821
x:3 y:3 a:3 Q:12.230683205655358
x:3 y:4 a:0 Q:14.700759117394847
x:3 y:4 a:1 Q:10.00761488508981
x:3 y:4 a:2 Q:10.00761488508981
x:3 y:4 a:3 Q:10.00761488508981
x:3 y:5 a:0 Q:5.007614885089821
x:3 y:5 a:1 Q:12.230683205655358
x:3 y:5 a:2 Q:5.007614885089821
x:3 y:5 a:3 Q:8.006853396580825
x:3 y:6 a:0 Q:3.0068533965808255
x:3 y:6 a:1 Q:10.00761488508981
x:3 y:6 a:2 Q:3.0068533965808255
x:3 y:6 a:3 Q:3.0068533965808255
x:3 y:7 a:0 Q:30.0
x:3 y:7 a:1 Q:30.0
x:3 y:7 a:2 Q:27.0
x:3 y:7 a:3 Q:15.0
x:3 y:8 a:0 Q:36.478836065329766
x:3 y:8 a:1 Q:36.64315118369975
x:3 y:8 a:2 Q:47.38127909299974
x:3 y:8 a:3 Q:36.64315118369975
x:3 y:9 a:0 Q:13.0
x:3 y:9 a:1 Q:11.0
x:3 y:9 a:2 Q:3.0
x:3 y:9 a:3 Q:2.0
x:4 y:0 a:0 Q:29.0
x:4 y:0 a:1 Q:18.0
x:4 y:0 a:2 Q:14.0
x:4 y:0 a:3 Q:25.0
x:4 y:1 a:0 Q:6.206168056922737
x:4 y:1 a:1 Q:-0.41444874876953786
x:4 y:1 a:2 Q:3.1269961261074144
x:4 y:1 a:3 Q:-0.41444874876953786
x:4 y:2 a:0 Q:10.0
x:4 y:2 a:1 Q:28.0
x:4 y:2 a:2 Q:5.0
x:4 y:2 a:3 Q:5.0
x:4 y:3 a:0 Q:2.0
x:4 y:3 a:1 Q:18.0
x:4 y:3 a:2 Q:27.0
x:4 y:3 a:3 Q:12.0
x:4 y:4 a:0 Q:12.230683205655358
x:4 y:4 a:1 Q:5.007614885089821
x:4 y:4 a:2 Q:8.006853396580825
x:4 y:4 a:3 Q:5.007614885089821
x:4 y:5 a:0 Q:14.0
x:4 y:5 a:1 Q:1.0
x:4 y:5 a:2 Q:7.0
x:4 y:5 a:3 Q:10.0
x:4 y:6 a:0 Q:22.0
x:4 y:6 a:1 Q:7.0
x:4 y:6 a:2 Q:19.0
x:4 y:6 a:3 Q:21.0
x:4 y:7 a:0 Q:21.0
x:4 y:7 a:1 Q:6.0
x:4 y:7 a:2 Q:24.0
x:4 y:7 a:3 Q:28.0
x:4 y:8 a:0 Q:41.64315118369975
x:4 y:8 a:1 Q:42.38127909299974
x:4 y:8 a:2 Q:53.75697676999975
x:4 y:8 a:3 Q:42.38127909299974
x:4 y:9 a:0 Q:14.0
x:4 y:9 a:1 Q:30.0
x:4 y:9 a:2 Q:30.0
x:4 y:9 a:3 Q:0.0
x:5 y:0 a:0 Q:29.0
x:5 y:0 a:1 Q:20.0
x:5 y:0 a:2 Q:2.0
x:5 y:0 a:3 Q:12.0
x:5 y:1 a:0 Q:4.585551251230464
x:5 y:1 a:1 Q:-1.8730038738925838
x:5 y:1 a:2 Q:1.814296513496673
x:5 y:1 a:3 Q:4.585551251230464
x:5 y:2 a:0 Q:-0.41444874876953786
x:5 y:2 a:1 Q:3.1269961261074144
x:5 y:2 a:2 Q:3.1269961261074144
x:5 y:2 a:3 Q:6.206168056922737
x:5 y:3 a:0 Q:1.2061680569227422
x:5 y:3 a:1 Q:4.585551251230464
x:5 y:3 a:2 Q:1.2061680569227422
x:5 y:3 a:3 Q:8.006853396580825
x:5 y:4 a:0 Q:10.00761488508981
x:5 y:4 a:1 Q:6.206168056922737
x:5 y:4 a:2 Q:6.206168056922737
x:5 y:4 a:3 Q:3.0068533965808255
x:5 y:5 a:0 Q:1.0
x:5 y:5 a:1 Q:25.0
x:5 y:5 a:2 Q:26.0
x:5 y:5 a:3 Q:24.0
x:5 y:6 a:0 Q:63.71231699999979
x:5 y:6 a:1 Q:63.71231699999979
x:5 y:6 a:2 Q:77.45812999999981
x:5 y:6 a:3 Q:60.84108529999978
x:5 y:7 a:0 Q:55.84108529999978
x:5 y:7 a:1 Q:68.7123169999998
x:5 y:7 a:2 Q:55.84108529999978
x:5 y:7 a:3 Q:53.75697676999975
x:5 y:8 a:0 Q:47.38127909299974
x:5 y:8 a:1 Q:60.84108529999978
x:5 y:8 a:2 Q:47.38127909299974
x:5 y:8 a:3 Q:48.75697676999975
x:5 y:9 a:0 Q:8.0
x:5 y:9 a:1 Q:25.0
x:5 y:9 a:2 Q:5.0
x:5 y:9 a:3 Q:24.0
x:6 y:0 a:0 Q:6.0
x:6 y:0 a:1 Q:1.0
x:6 y:0 a:2 Q:12.0
x:6 y:0 a:3 Q:1.0
x:6 y:1 a:0 Q:3.1269961261074144
x:6 y:1 a:1 Q:-3.185703624942159
x:6 y:1 a:2 Q:0.6328657284280961
x:6 y:1 a:3 Q:3.126996120593299
x:6 y:2 a:0 Q:4.585551251230464
x:6 y:2 a:1 Q:1.8142875790146948
x:6 y:2 a:2 Q:-1.8730043325270358
x:6 y:2 a:3 Q:-1.8730044308677234
x:6 y:3 a:0 Q:22.0
x:6 y:3 a:1 Q:6.0
x:6 y:3 a:2 Q:8.0
x:6 y:3 a:3 Q:26.0
x:6 y:4 a:0 Q:8.006853396580825
x:6 y:4 a:1 Q:1.2061680569227422
x:6 y:4 a:2 Q:4.585551251230464
x:6 y:4 a:3 Q:1.2061680569227422
x:6 y:5 a:0 Q:7.0
x:6 y:5 a:1 Q:16.0
x:6 y:5 a:2 Q:16.0
x:6 y:5 a:3 Q:12.0
x:6 y:6 a:0 Q:68.7123169999998
x:6 y:6 a:1 Q:72.45812999999981
x:6 y:6 a:2 Q:87.1756999999999
x:6 y:6 a:3 Q:72.45812999999981
x:6 y:7 a:0 Q:8.0
x:6 y:7 a:1 Q:21.0
x:6 y:7 a:2 Q:3.0
x:6 y:7 a:3 Q:4.0
x:6 y:8 a:0 Q:53.75697676999975
x:6 y:8 a:1 Q:42.38127909299974
x:6 y:8 a:2 Q:42.38127909299974
x:6 y:8 a:3 Q:42.38127909299974
x:6 y:9 a:0 Q:2.0
x:6 y:9 a:1 Q:6.0
x:6 y:9 a:2 Q:19.0
x:6 y:9 a:3 Q:25.0
x:7 y:0 a:0 Q:26.0
x:7 y:0 a:1 Q:6.0
x:7 y:0 a:2 Q:16.0
x:7 y:0 a:3 Q:28.0
x:7 y:1 a:0 Q:1.814296453122841
x:7 y:1 a:1 Q:-4.369503036608914
x:7 y:1 a:2 Q:-0.5595256831627055
x:7 y:1 a:3 Q:-4.3708649919721525
x:7 y:2 a:0 Q:16.0
x:7 y:2 a:1 Q:3.0
x:7 y:2 a:2 Q:29.0
x:7 y:2 a:3 Q:17.0
x:7 y:3 a:0 Q:4.0
x:7 y:3 a:1 Q:30.0
x:7 y:3 a:2 Q:3.0
x:7 y:3 a:3 Q:9.0
x:7 y:4 a:0 Q:6.206168056922737
x:7 y:4 a:1 Q:-0.4144487487973729
x:7 y:4 a:2 Q:3.1269961260823087
x:7 y:4 a:3 Q:-0.4144487487710842
x:7 y:5 a:0 Q:29.0
x:7 y:5 a:1 Q:13.0
x:7 y:5 a:2 Q:25.0
x:7 y:5 a:3 Q:12.0
x:7 y:6 a:0 Q:77.45812999999981
x:7 y:6 a:1 Q:82.1756999999999
x:7 y:6 a:2 Q:97.97299999999989
x:7 y:6 a:3 Q:82.1756999999999
x:7 y:7 a:0 Q:2.0
x:7 y:7 a:1 Q:19.0
x:7 y:7 a:2 Q:13.0
x:7 y:7 a:3 Q:24.0
x:7 y:8 a:0 Q:23.0
x:7 y:8 a:1 Q:6.0
x:7 y:8 a:2 Q:14.0
x:7 y:8 a:3 Q:25.0
x:7 y:9 a:0 Q:20.0
x:7 y:9 a:1 Q:16.0
x:7 y:9 a:2 Q:11.0
x:7 y:9 a:3 Q:19.0
x:8 y:0 a:0 Q:11.0
x:8 y:0 a:1 Q:1.0
x:8 y:0 a:2 Q:9.0
x:8 y:0 a:3 Q:27.0
x:8 y:1 a:0 Q:0.6112914541096226
x:8 y:1 a:1 Q:-6.535232014213719
x:8 y:1 a:2 Q:-6.216068781197513
x:8 y:1 a:3 Q:-1.6676380867787295
x:8 y:2 a:0 Q:-7.633292054604024
x:8 y:2 a:1 Q:-2.3157464505004755
x:8 y:2 a:2 Q:-7.128865135591196
x:8 y:2 a:3 Q:1.4480678047797735
x:8 y:3 a:0 Q:-3.4727050769935763
x:8 y:3 a:1 Q:-0.678533780772265
x:8 y:3 a:2 Q:-3.5230304632093996
x:8 y:3 a:3 Q:3.1262682429956725
x:8 y:4 a:0 Q:4.585551251229696
x:8 y:4 a:1 Q:1.8065282299997811
x:8 y:4 a:2 Q:-1.873264462643966
x:8 y:4 a:3 Q:-1.8750304998309832
x:8 y:5 a:0 Q:15.0
x:8 y:5 a:1 Q:25.0
x:8 y:5 a:2 Q:20.0
x:8 y:5 a:3 Q:2.0
x:8 y:6 a:0 Q:87.1756999999999
x:8 y:6 a:1 Q:92.97299999999989
x:8 y:6 a:2 Q:92.97299999999989
x:8 y:6 a:3 Q:109.96999999999996
x:8 y:7 a:0 Q:104.96999999999996
x:8 y:7 a:1 Q:97.97299999999989
x:8 y:7 a:2 Q:104.96999999999996
x:8 y:7 a:3 Q:123.29999999999994
x:8 y:8 a:0 Q:7.0
x:8 y:8 a:1 Q:27.0
x:8 y:8 a:2 Q:22.0
x:8 y:8 a:3 Q:15.0
x:8 y:9 a:0 Q:6.0
x:8 y:9 a:1 Q:11.0
x:8 y:9 a:2 Q:27.0
x:8 y:9 a:3 Q:29.0
x:9 y:0 a:0 Q:12.0
x:9 y:0 a:1 Q:8.0
x:9 y:0 a:2 Q:27.0
x:9 y:0 a:3 Q:21.0
x:9 y:1 a:0 Q:3.0
x:9 y:1 a:1 Q:11.0
x:9 y:1 a:2 Q:3.0
x:9 y:1 a:3 Q:13.0
x:9 y:2 a:0 Q:13.0
x:9 y:2 a:1 Q:21.0
x:9 y:2 a:2 Q:13.0
x:9 y:2 a:3 Q:17.0
x:9 y:3 a:0 Q:4.0
x:9 y:3 a:1 Q:17.0
x:9 y:3 a:2 Q:27.0
x:9 y:3 a:3 Q:16.0
x:9 y:4 a:0 Q:12.0
x:9 y:4 a:1 Q:23.0
x:9 y:4 a:2 Q:23.0
x:9 y:4 a:3 Q:12.0
x:9 y:5 a:0 Q:19.0
x:9 y:5 a:1 Q:30.0
x:9 y:5 a:2 Q:7.0
x:9 y:5 a:3 Q:29.0
x:9 y:6 a:0 Q:16.0
x:9 y:6 a:1 Q:19.0
x:9 y:6 a:2 Q:20.0
x:9 y:6 a:3 Q:4.0
x:9 y:7 a:0 Q:29.0
x:9 y:7 a:1 Q:8.0
x:9 y:7 a:2 Q:6.0
x:9 y:7 a:3 Q:21.0
x:9 y:8 a:0 Q:17.0
x:9 y:8 a:1 Q:25.0
x:9 y:8 a:2 Q:8.0
x:9 y:8 a:3 Q:5.0
x:9 y:9 a:0 Q:7.0
x:9 y:9 a:1 Q:3.0
x:9 y:9 a:2 Q:8.0
x:9 y:9 a:3 Q:22.0

強化学習

強化学習

  • 作者: Richard S.Sutton,Andrew G.Barto,三上貞芳,皆川雅章
  • 出版社/メーカー: 森北出版
  • 発売日: 2000/12/01
  • メディア: 単行本(ソフトカバー)
  • 購入: 5人 クリック: 76回
  • この商品を含むブログ (29件) を見る