こんにちは､ このチュートリアルにようこそ｡
前のチュートリアルでは､ マップを初期化しましたが､ 次はエキサイティングなことをしましょう｡
コアを作り､ それをクラスで行うのです｡
もちろん､ このクラスは多くのプロパティを持つものを作成するのに非常に実用的であることはおわかりいただけると思います｡
そこで､ 環境を記述する上で重要な変数をいくつか用意しました｡
例えば､ X軸と車の進行方向の軸との角度を表す「角度」があります｡
次に回転ですが､ これはその最後の回転で､ 0度､ 20度､ -20度のいずれかを記憶しています｡
そして､ 速度､ 速度ベクトルのX座標､ 速度ベクトルのY座標があり､
さらに､ 座標速度Xと速度Yのベクトルがある｡
そして､ センサーと信号がありますが､ これがとても重要なのです｡
今回作るクルマには､ センサー1､ センサー2､ センサー3というように､ 3つのセンサーが搭載されています｡
センサー1は､ 車の前に香りがあるかどうかを検知します｡
そして､ センサー2は､ 車の左側に香りがあるかどうかを検知するセンサーです｡
そして､ センサー3は､ 車の右側に香りがあるかどうかを検知するセンサーです｡
そして､ この3つのセンサーから､ それぞれのセンサーが受信した信号､ つまりシグナルを得るのです｡
つまり､ 信号1はセンサー1が受信した信号ということになります｡
信号2はセンサー2が受信した信号で､ 信号3はセンサー3が受信した信号です｡
それで､ どのような効果があるのでしょうか？
シグナル1は､ センサー1周辺の送信密度である｡
信号2はセンサー2周辺の香りの密度､ 信号3はセンサー3周辺の砂の密度です｡
そして､ この砂の密度はどのように計算するのでしょうか？
まあ､ それはとても簡単なことです｡
それぞれのセンサーの周囲に大きな四角をいくつか取ります｡
これは､ 実際には200×200の正方形です｡
そして､ それぞれのマス目について､ 20×20＝400となるマス目の総数で､
マス目に含まれる1の数を割ります｡
そして､ 砂の密度は､ 砂に対応するものが得られるのです｡
これを各センサーごとに行うと､ 各センサーの周りの砂の密度が分かります｡
それがシグナルです｡
わかりました｡
これで砂の検出はすべて完了し､ あとは移動機能ですね｡
そしてもちろん､ コアを左に直進させたり右に行かせたりするのは､ ムーブ機能です｡
では､ さっそく見ていきましょう｡
ここでは､ コアの位置の更新を､ 最後の位置（ここを通過した自分）と速度ベクトルで行っています｡
つまり､ 速度ベクトルのおかげで､ 位置は速度ベクトルの方向に更新されることになる｡
次に､ 回転を取得します｡ これは､ このコードのさらに下にあります｡
回転は回転アクションに等しいここで我々は､ アクションを選択し､ 回転を取得します｡
そして､ この自転は回転に等しいわけです｡
この回転で､ 左や右に行くコアをどう回転させればいいのかがわかります｡
そして､ X軸とコアの方向の軸の間の角度であることを思い出しながら､ 角度を更新します｡
コアが回転すると､ 当然センサーも回転しますから､ rotate関数を使ってセンサーを回転させ､
そこに新しい位置を追加する必要があるのです｡
そして､ なぜこのベクトルが30ゼロになるのか｡
まあ､ それは単純に30がコアとセンサーの距離だからなんですけどね｡
コアとコアが検出するものとの距離のことですね｡
そして､ センサーが更新されると､ 今度は信号が更新されるわけです｡
そして､ ここでは､ 私が説明したとおりの方法で､ 信号を計算します｡
センサーのX座標を取得し､ マイナス10からプラス10までのすべてのセルを取得します｡
次に､ Y座標についても同様に､ マイナス10からプラス10までのすべてのセルを取り出します｡
そこで､ センサーを囲む20×20画素の正方形を求め､ この正方形の中ですべての1の値を合計するのです｡
つまり､ 基本的には､ セルには0か1のどちらかが含まれているので､ すべてのセルを合計します｡
そして､ 20×20の2乗には20×20＝400個のセルがあるので｡
さて､ これを400で割ると､ 正方形の中に一度だけ入る密度が求まる｡
こうして､ センサーの周りの細胞の密度を示す信号が得られるのです｡
そして､ 2つ目のセンサーと3つ目のセンサーにも同じようにして､ 2つ目の信号と3つ目の信号を得ることができました｡
なるほど｡
つまり､ 感覚を察知することですね｡
それから､ ここの3行のコードがとても重要です｡
これも､ クルマがマップの端に到達したときに与えたい､ 悪い報酬のひとつです｡
私たちは､ クルマが壁に突進するのを防ぎたいので､ 壁に近づきすぎたときにペナルティを課したいと思っています｡
それゆえ､ ここではそのようなことをするのです｡
最初のセンサーが長さマイナス10より大きければ､ ここが長いからここより大きいということです｡
だから､ もっと長く､ マイナス10がここにある｡
だから､ もしセンサー1×が長いより大きければ､ マイナス10はここにあるすべてのポイントを懸念し､
車がマップの右端に近づいている場合､ または自己センサー1×が10より低い場合である｡
それがここなんですね｡
車がマップの左端に近づいてきたり､ センサーYが大きめマイナス10より大きくなったら､
マップの上端です｡
また､ あるいは自己センサーyが10より小さい場合は､ そこがマップの下辺となる｡
そして､ センサー1がこの4つのエッジのいずれかに到達していれば､ センサーの信号を入れることになるわけです｡
信号1は､ センサー1の信号です｡
1になるように設定します｡
それはどういうことなのか？
それは､ 香りの密度を高めるようなフルセンドということです｡
最悪の事態を招いてしまったようなものです｡
車が止まってしまうという感覚はすごくありますね｡
だから信号が1つになり､ したがって車はひどく悪い報酬を得ることになる｡
わかりました｡
そして､ センサー2とセンサー3からの信号2､ 信号3についても同じようにしました｡
わかりました｡
そして､ ゲームクラスを作成します｡
というわけで､ ここまでは車しか作っていないので､ 基本的にはゲームを作るためのクラスです｡
そして今度は､ もちろんマップも作らなければならないし､ ゲーム自体も作らなければならないので､ ゲームをするわけではありません｡
ゲームをするのは､ 私たちのAIです｡
そして､ 実際に障害物を避けながら､ 空港から繁華街へ､ あるいはその逆へと移動するゲームです｡
このゲームクラスでは､ 車のようなオブジェクトをいくつか作成し､ 次に最も重要な更新関数を定義する必要があります｡
というのも､ この更新機能で､ 目標達成のために車が行うべき行動をその都度選択することになるからです｡
そして､ この行動こそが､ 私たちの人工知能の核となるニューラルネットワークの出力となるのです｡
そして､ このアクションは車の脳から返されます｡ これは､ AIファイルで作ることになる現在のクラスのオブジェクトであることを思い出してください｡
このオブジェクトは update と呼ばれるメソッドを持っており､ 最後の報酬と最後のシグナルを入力として受け取ります｡
だから､ 最後の報酬はもちろん､ クルマが得た最後の報酬である｡
そして最後の信号は､ もちろん3つのセンサーのうち最後の信号です｡
センサー1からの信号1､ センサー2からの信号2､ センサー3からの信号3｡
しかし､ それ以外に2つの入力を追加しています｡ それは､ ゴールに対する車の向きです｡
そのため､ 例えば車がゴールに向かっている場合､ 向きは0に等しくなる｡
少し右に寄ると､ 45度に近い向きになります｡
また､ 少し左に行くと､ 向きは-45度に近くなります｡
つまり､ これが入力状態の4番目の入力です｡
そして､ 最後の入力は､ マイナス方向です｡
つまり､ 通常､ ニューラルネットワークの入力は独立である｡
線形性はありませんが､ ニューラルネットワークが重みで修正するだけなので､ これを追加してもあまり意味がありません｡
それでも､ このマイナス方向を加えることで､ まあ､ 車の訓練で探索を安定させることができることに気がつきました｡
AIがいつも同じ方向に探索しないように､ こうしているわけです｡
このマイナスの向きをつけることで､ 右にも左にも探索できるようにしています｡
そして､ この3つの信号､ プラス方向とマイナス方向が､ エンコードされたベクトルの5つの入力となり､
ネットワークに入ることになるのです｡
これがネットワークに入る入力ベクトルです｡
そして､ それがネットワークに入った後､ まあ､ ネットワークがアウトプットを返すわけですが､ これがその都度再生するアクションになるわけです｡
そして､ この更新関数が返す出力には､ ネットワークそのものと､ ネットワークの出力が含まれる｡
そのため､ 入力状態である最後の信号と､ 少ない報酬を入力しなければなりません｡
わかりました｡
そして､ 区の平均スコアを更新し､ 回転を更新し､ 移動関数を使って､ 選択された行動に従って車を回転させます｡
ゴールまでの車の距離を更新し､ センサーの位置を更新していくのです｡
1球､ 2球､ 3球とも､ 地図上のセンサーを表す球に相当します｡
それはすぐにわかると思います｡
というのも､ この部分は､ クルマが砂の上に乗ってしまった場合にペナルティを課す場所だからです｡
そこで､ その速度を落とすのです｡
このように､ 速度が6になるのが普通なんですね｡
そして､ それがどこかの砂の上に行けば､ 1つになる｡
だから､ 1つに減速されるのです｡
砂地に入ると､ 車が減速するのがわかると思います｡
だから遅くなるし､ しかも悪い報酬を得ることになる｡
マイナス1点の報酬を得る｡
そしてそれは､ 実は最悪の報酬なのです｡
最高のご褒美は1つ｡
最悪の報酬はマイナス1､ 報酬はマイナス1～プラス1の間です｡
そうでなければ､ 砂の上でなければ､ いつもの速度､ 6速のままです｡
そして､ さらに何かを追加する｡
もしそれがゴールに近づいているのなら､ 少しプラスの報酬を得ることができます｡
そして､ ゴールから遠ざかると､ まあ､ マイナス0という少しマイナスの報酬が発生するわけです｡ 2.
そして､ 最後に報酬に関わる条件です｡
それは､ 先ほどお話したように､ コアがエッジのひとつに近づきすぎている場合です｡
フルサンドの話をしたのを覚えていますか？
まあ､ コアがマップの左端に近づきすぎている場合は､ 報酬がマイナス1されるんですけどね｡
マップの右端に近づきすぎると､ 2マイナス1の報酬が発生します｡
また､ マップの下端に近づきすぎると､ 報酬がマイナス1されます｡
そして､ マップの左上に近づきすぎると､ 報酬がマイナス1されます｡
だから､ それはひどい仕打ちだ｡
そうすれば､ 他のことに急がないことを､ いかに早く学習するかがわかるでしょう｡
わかりました｡
そして､ ゴールに到達したときに更新するものです｡
つまり､ 車が最初のゴールである空港に到着すると､ そこは地図の左上で､ 一方ゴールは地図の右下､
つまりダウンタウンに変わるわけですが､ ここではまさにそれをやっているわけです｡
ゴールのX座標とY座標を更新し､ 車からゴールまでの距離を更新しています｡
わかりました｡
そうすると､ あまり重要ではなくなりますね｡
これは､ 洞窟に関連する道路や障害物を地図上に描けるようにするためのペイントツールを追加するためのクラスです｡
よかったら見てみてください｡
このコードのコミコミ版を提供し､ さらに深くSky Vでやるならどうすればいいのか､ リファレンスを提供します｡
でも､ 人工知能からさらに進んでいるので､ その詳細は割愛します｡
そして､ この最後のコードセクションも同じように､ car app クラスを使用しています｡
それは､ APIのボタン､ クリア､ セーブ､ ロードを追加するだけです｡
だから､ ここではそうしているのです｡
キャンバス保存をクリアする｡
そしてそれは､ 実はとても重要なことなのです｡
ロード機能とは､ 車の頭脳をロードするために地図上に追加した別のツールで､
車のメモリ､ つまり地図上でのナビゲーション方法をロードするためのものです｡
そして最後に､ 全体を動かす最後のコードセクション､ つまりマップとAIそのものを動かすコードです｡
そして､ 実は今､ それを実行しようとしているのです｡
このコードで作るものをすべて見てみましょう｡
だから今はAIは実装されていない｡
そのため､ コードは非常にランダムな動きをすることになります｡
実際に昆虫のように見えるでしょう｡
しかし､ 心配しないでください､ 私たちはそれを解決します｡
実際のクルマと同じように動くように訓練するだけでなく､ 道路に沿ったり､ 障害物を避けたりするナビゲーションを訓練します｡
では､ こうしてみましょう｡
全部選択して実行する｡
そして､ こちらが地図で､ こちらが車です｡
わかりました｡
だから､ ここに小さく見える昆虫のようなものが私たちの車なんです｡
だから､ さっきも言ったように､ 行動はまったくランダムなんです｡
そのため､ 車は各時刻に左へ直進するか右へ直進するかを行動でランダムに選択します｡
だからナンセンスな動きをするわけで､ それが昆虫のように見えるわけです｡
だから､ それはもちろん修正します｡
そしてもちろん､ AIが起動しているので､ まあ､ ここの空港であるゴーや､
地図の右下にあるダウンタウンには行きません｡
そして､ このAIをこのコアやこの昆虫に実装するように､ Iを作ることですべてを解決します｡
ここに3つのボール､ 黄色いボール､ 赤いボール､ 白いボールがあるのがわかりますね｡
これが私たちの3つのセンサーです｡
そのため､ 周囲に何らかの香りがあれば､ それを感知することになります｡
そして､ 香りといえば......そう､ 投げましょう｡
そのためには､ ここを左クリックすればいいんです｡
左クリックしたまま送信を描いたり｡
だから､ 今は砂を足していますが､ もっと足せばいいんです｡
つまり､ 砂を追加するたびに､ ご覧のように砂の配列に1個ずつ追加されていくわけです｡
これが砂の配列で､ これが原点のゼロゼロ座標です｡
そして､ ここにはたくさんのものがあります｡
そして､ ご覧のように､ まあ､ いい感じです｡
車はそのまま砂の上に乗ってしまい､ スピードが落ちてしまった｡
ですから､ ご覧の通り､ 砂の上に乗っているため､ 本当にスピードが落ちています｡
そこで､ いくつかの道路を描き､ 空港からダウンタウンまでの道路を描き､ 車が道路にとどまり､
障害物を避けるように訓練します｡
わかりました｡
そして､ ご覧の通り､ 砂を取り除くクリアボタンがあります｡
車の脳を保存するための保存ボタンがあります｡
そして実は､ 目を救う､ モデルを救う､ 実はクルマの脳を救う､ お話したスコアカーブがあるのです｡
そして､ コードから離れたり､ コンピュータの電源を切ったりして､ また戻りたいときには､
ロードボタンでモデルをロードする､ つまり脳をロードすることで､ 車の訓練された目を得ることができます｡
わかりました｡
だから今は､ 早くIを作り始めたいんです｡
これは楽しみですね｡
ニューラルネットワークを作り､ 車が思い通りに動かなくなったらすぐに罰を与える｡
では､ 次のチュートリアルからやってみましょう｡
そしてそれまで､ お楽しみに｡
I.