*

C言語でEV3開発(26)-EV3で機械学習(1)-QLearningをC#に委譲してみた

公開日: : C#, C言語, マインドストーム/EV3, 開発

どもです。
前回の投稿では、Q-LearningをEV3本体に実装してみたら、メモリが足りなくて動かせなかった、という内容を書きました。
今回の投稿では、この問題を解決すべく、Ev3側に実装していたQ-Learnig処理をPC側に委譲、計算させてみました。

1.PCへの委譲内容
PC側へ委譲するQ-Learningは、状態の判定から行動の評価、および評価関数の一式です。
これらの処理に必要な情報をEV3から取得し、一連の処理(状態の判定~次の行動の決定)を行い、その後決定した行動に基づくパラメータの通知をPC側で行うようにします。
すなわち、一連の処理を記載すると、下記のようになります。

1:状態の判定に必要なパラメータ、状態情報を各種センサーから取得。
2:取得したセンサー情報を、PCへ通知する。
3:PCは、取得したセンサー情報からQ-Learningを実施し、次の行動を決定する。
4:PCは、決定した行動をEV3に通知する。

なお、取得するセンサー情報、状態情報は前回と同じく、下記のものを取得します。
・モーターの出力値(出力目標) x2
・超音波センサーの距離値

2.PCとEv3の通信
PCとEv3の通信は、Bluetoothで行います。
なお、この通信処理については、EV3開発サポートツール(3)-Ev3Controllerで紹介したアプリケーション(GitHubで公開済み)で作成した機能を流用します。

3.PC側の実装
PC側のアプリケーションは、C#で実装します。
これは、先に記載したとおり、過去の記事で紹介したツールの機能を流用するためです。
また、C#で実装するQ-Learning処理については、EV3側で実装したコードをほとんど変更せずに流用しています。
ただし、Q-Learningでの報酬の与え方のみ変更しています。
なお、今回は前述のセンサー値/状態情報でQ-Learningがどのように学習、振る舞うかの確認を目的としているため、開発するアプリケーションは、コンソールアプリケーションとしています。

実装は、下記の通りです。
全てのコードは記載できないので、Q-Learningを行うクラスのみを記載します。

3.動かした結果
今回は、都合により位置を固定しています。
すなわち、距離センサーの値が変わらない環境で、検証を行いました。
その実行結果が、下記のグラフです。
Ev3ConsoleDeepLearning

グレーの線が距離センサー値、青とオレンジがモーターの動作値と動作目標値、黄色が動作指示値(学習結果)になります。
動作開始時点では、「0」付近でうろうろしていますが、次第に動作目標値、動作指示値が増加しています。
また、突然センサー距離値が小さくなっている箇所がありますが、そのタイミングでは目標値が小さくなり、それにあわせて指示値も減少しています。
その後、距離が正常(?)に戻れば、またモーター指示値が増加し始めています。
すなわち、前方に障害物があればモーターの動作指示値を下げ、前方に障害物が無ければモーターの動作指示値を上げています。
これらの結果から、「期待する学習が行われている」ということが確認できます。

4.結論
前回、今回と、Ev3での強化学習/Q-Learningの実施例を書いてきました。
Ev3購入時に一緒についてくるセンサーだけでも、強化学習が可能であることを示すことができました。
今後は、センサー情報を増やす、学習方法を増やすことで学習結果がどのように変化するかを見てみたいです。

5.公開しています
今回作成したプログラムの全ては、GitHubにて公開しています。

ではっ!

関連記事

eclipse-juno-logo

C言語でEV3開発(2)

どもです。 今回のエントリーの内容は、前回に引き続き「EV3の開発環境の構築」の追記です。

記事を読む

Qt_logo_2016

QtでRaspberryPi/GUI開発(2):ためしに時計を作ってみた(其の弐)

どもです。 前回のエントリーでは、ラジオボタンのグループ化と、選択されたボタンの特定方法まで記載し

記事を読む

toppers

C言語でEV3開発(28)-EV3の移動距離を計算できるようにしてみた

どもです。 今回は、Ev3の移動距離の算出についてです。 1.算出方法について 移動距離は

記事を読む

OpenCvLogo

OpenCvによる画像サイズ変更

どもです。 最近、カメラの動画をOpenCvで加工する、ということに挑戦し始めました。 しか

記事を読む

eclipse_4.3_kepler

elicpse/CDTでのgdbでのソースを追従したデバッグができない問題

どもです。 今回のエントリーは、Eclipse上でgdbを利用したデバッグ中に発生する問題について

記事を読む

raspberry-pi

RaspberryPi起動時にpigpiodがスタートしないようにする

どもです。 これまでpigpioを使用してRaspberryPiからLEDをチカらせる方法など、い

記事を読む

toppers

C言語でEV3開発(23)-モーターの性能確認

どもです。 今回は、EV3に付属しているモーター(Lモーター/Mモーター)の性能について調べてみた

記事を読む

no image

C言語でEV3開発(4)

どもです。 今回のエントリーは、前回のエントリー内容/EclipseでEV3の実行ファイルをビルド

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(1)-C#のユーザーコントロール開発

どもです。 突然ですが、今回はC#に関するエントリになります。 具体的には、C#/WPFで、独自

記事を読む

raspberry-pi

RaspberryPi3対応のタッチスクリーンを買いました

どもです。 ついに、念願のRaspberryPi3対応のタッチスクリーンを買いました。 今回のエ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

RasPi_Qt
Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。(その後)

どもです。 前回、Linux/RaspberryPiでのQt(Q

RasPi_Qt
Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。

どもです。 RaspberryPiのOS:Raspbianの新し

no image
RaspberryPiのOS:RaspbianをNOOBSでセットアップしてみた

どもです。 今回の内容は、「今更!?」ですがNOOBSでRasp

GitHub
C/C++のスタブを自動生成するツールを公開しました

どもです。 突然ですが、C/C++の単体テストで使用する「スタブ

Arduino_Logo
フォトレジスタを使ってみた-Arduinoで光検出

どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。

→もっと見る

PAGE TOP ↑