*

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にて公開しています。

ではっ!

関連記事

raspberry-pi

RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B」を購入しました。 今回のエ

記事を読む

toppers

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

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

記事を読む

no image

Windows-QtCreatorでのデバッグ

どもです。 更新の間隔が空いてしまいました。 久しぶりの更新です。 最近、Qtを触り始めま

記事を読む

no image

Windows/EclipseでRaspberryPiのクロス環境を構築してみた

どもです。 今回は、Windows/EclipseでRaspberry Piのクロス環境を構築した

記事を読む

MindStormControl_SprachScreen

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

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

記事を読む

MindStormControl_SprachScreen

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

どもです。 前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての

記事を読む

toppers

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

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

記事を読む

Qt_logo_2016

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

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

記事を読む

no image

C言語でEV3開発(13)-opOUTPUT_STEP_SPEEDコマンド

どもです。 今回のエントリーは、モーターを動かすコマンドである 「opOUTPUT_STEP_S

記事を読む

python

VisualStudioCommunityでのPython開発環境構築

どもです。 最近、VisualStudioでのPython開発を始めました。 その際の環境構築に

記事を読む

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="">

no image
QtでRaspberryPi/GUI開発(8):pigpioを使用したチャタリング対策の問題の対策

どもです。 だいぶ、間が空いてしまいました。 久しぶりの更新です。

raspberry-pi
QtでRaspberryPi/GUI開発(7):pigpioを使用したチャタリング対策の問題

どもです。 前回のエントリーで、pigpioを使用したチャタリング対

RasPi_Qt
QtでRaspberryPi/GUI開発(6):pigpioを使用したチャタリング対策

どもです。 前回のエントリーで、pigpioを使用したボタンを使用し

RasPi_Qt
QtでRaspberryPi/GUI開発(5):pigpioを使ってみた

どもです。 RaspberryPiを購入して、LEDも手に入れたので

RasPi_Qt
QtでRaspberryPi/GUI開発(4):イベントハンドラの設定

どもです。 前回のエントリーで、「タッチスクリーンを買った」と書きま

→もっと見る

PAGE TOP ↑