スクラッチを使って、障害物を避けてリンゴまでの経路を学習するプチAIを作成しましたので紹介します。
実際の動きを見てからのほうが理解しやすいと思います。
以下のスクラッチプロジェクト(スマホ・タブレットだと見れません)、
もしくは、私の作った解説動画で確認することができます。
この記事では、解説動画で説明しきれなかった部分についても書いていこうと思います。
アルゴリズム
今回のプログラムを実現するアルゴリズムを説明していきます。(動画のほうがわかりやすいかも。)
前提:ネコは一回の行動で、「右に行く」か「上に行く」かのどちらかの動きをする。
アルゴリズム:最初はランダムに1回行動する。 行動をすると、以下のいずれかの結果が得られます。
- リンゴにも障害物にもぶつからない。
- 障害物に衝突。
- リンゴまで到達。
この3通りの結果に応じてネコの動きを決定します。
1.リンゴにも障害物にもぶつからない。
行動を追加して、初期位置から再びスタート。(行動の追加が繰り返されることで、行動回数が増えて移動距離が増える。
2. 障害物に衝突。
障害物に衝突したときの行動パターンをランダムに変更して、初期位置から再びスタート。例えば、5回目にぶつかった場合は5回目の行動パターンを変更する。(これにより、障害物にぶつからない経路を学習していきます。)
3.リンゴまで到達
成功としてプログラムを終了します。
プログラムの中身を解説
これが、今回作成したソースコードです。
中身の説明の前に、このプログラムで重要となるリストについて説明します。
リストとその役割
リストとは、1番目~N番目までの箱の中に、それぞれ数字が入っています。
今回はこのリストでネコの動きを管理します。
例えば、ネコを右⇒上⇒右と3回行動させた場合は、以下のようなリストを作ります。
リストの1番目:右
リストの2番目:上
リストの3番目:右
ここで、リストの中に「右」や「上」など言葉を入れるのは後々都合が悪いので、数字に置き換えます。右を意味する数字として「1」、上を意味する数字として「2」を入れます。
つまり、先ほどのリストは次のようになります。
1番目: 1
2番目: 2
3番目: 1
このリストでネコの動きが決まるので、リンゴまで到達する行動をさせるリストを自動的に作成するのがこのプログラムです。
初期化部分
では、プログラムの中身を見ていきます。
まず、初期設定部分です。
最初のリストの長さを「変数:N」に格納します。今回は1としていますが、大きくするとネコの初期行動回数が増えます。
次に、リストの長さ分「1番目をリストから削除する」を繰り返すことで、リストの中身を空っぽにします。(プログラムを連続で実行することで、リストに数字がたまってしまうことを防ぐ。)
そして、「1か2をリストに追加する」N回繰り返すことで、初回の行動をランダムで決定します。
STARTを送って、経路の学習部分に移ります。
経路の学習部分
まず図の赤枠部分から説明します。
ここで、リストの中身に応じた行動をネコにさせていきます。
例えば、リストの中身が「1、2、1」の場合は、Nが3なのでループを3回繰り返します。ループの最期で「変数:i」を1ずつ増やしているので、ループを繰り返すごとに、「i」が1、2、3と増えてゆきます。
そして、ここがネコを動かす部分です。リストの中身が「1」ならx座標を30動かすことでネコが右に動きます。リストの中身が「2」なら、y座標を30動かすことでネコが上に動きます。
ループを繰り返すと、先ほど説明したように「i番目」の部分が「1番目」「2番目」「3番目」と変化していくので、リストの中身を順番に見ていくことができます。
障害物にもリンゴにも触れない場合、そのままN回のループを抜けるので、次の赤枠の処理を行います。
ここで、ランダムで1か2をリストに追加して、最初に戻ります。この処理によって、ネコの行動回数がどんどん増えてゆきます。
障害物にぶつかったら
ネコの行動回数が増えてくると、障害物に当たることがあります。
赤枠の部分で、ぶつかったとき何回目の行動であったかを記録します。5回目で障害物に当たった場合は、「変数:失敗箇所」に5が入ります。
そして、青枠の部分でぶつかったときの行動パターンを変更します。
(例えば、5回目に障害物にぶつかった場合、5番目のリストを変更する。)
これを繰り返すことで、障害物にぶつからない経路を学習していくことができます。
リンゴにぶつかったら
最期にリンゴにぶつかった場合は、終了部分に移動します。
移動したら、「やったー」といって終了しましょう。
終わりに
解説は以上とします。文字だけでわかりづらい場合は、動画も見ていただくと理解が進むかもしれません。なにか、疑問があれば気軽にコメントしてください。
以上です、最後までお読みいただきありがとうございます。