C言語でEV3開発(25)
Q_Learningを実装してみた…が!?

2021年2月6日

どもです。
最初に宣言します。
今回の内容は、「失敗しました」という内容です。

最近、流行になっている深層学習/強化学習のお勉強を始めました。
で。
やっぱりお勉強したら、実践したくなるのが人間の性です。
(ただし、エンジニアに限る…かも?)
その結果のお話です。

1.やってみようとした内容

EV3本体での強化学習/Q-Learningを実装、実施してみようとしました。
入力としては、

  • モーターの出力値(出力目標) x2
  • 超音波センサーの距離値

を選択しました。
これらのセンサー入力値を元に、自動で衝突回避を学習するようなシステムの実装を行ってみました。

2.やってみた結果
上記内容を実装、実機で動作させようとしたのですが、アプリケーションをロードすると
「Failed to load application」
と、液晶に表示されてしまいました。
次に、「EV3RT Console」でのログ内容を確認すると、

elf32_load(): Unsupported segment type 1879048193.
elf32_load(): Data buffer size (1048576 bytes) is too small. 32945796 bytes is needed.
Failed tp load application. ercd: -33

と表示されていました。
このログの末尾の「edcd: -33」の数値を調べて見ると、「t_stddef.h」において

#define E_NOMEM		(-33)		/* メモリ不足 */

と定義されています。
…えー…、単にメモリ不足ということ?
作ったアプリが使用するメモリを確保できない、ということ?
…だそうです。

3.原因は?

ざっくり調べてみました。
今回作成したアプリケーションでは、Q-Learningの値を保持するために、大量のメモリを必要としています。
具体的なメモリ量は、「32936220バイト」つまり「約32MB」になります。
そのため、この領域がメモリを圧迫していることが分かります。

以上、Q値を格納するための領域が、「Fail」の原因であることが判明しました。

4.対策は

…さて、どうしよう。
対策の検討と実装は、次回に。

ではっ!

2018/02/05 追記

うまくいかなかった例ですが、一応GitHubにソースコードを上げてみました。
EV3上で動作しないので、PC上で動作するバイナリファイルを作成、一緒にコミットしています。
なお、cygwin上でビルド、動作するようになっています。