「作って動かすALife」で人工生命を学ぶ その04 サブサンプション・アーキテクチャ

2025-07-05 22:15:44

英語コースが終わって、ようやく時間が取れたので、人工生命の続き。

今回は第5章「身体性を獲得する」
サブサンプション・アーキテクチャという仕組みを使って、
ロボット掃除機の動きはどう実現されているかということを学ぶ章。

このサブサンプション・アーキテクチャというのはかなり印象を受けたな。
簡単な仕組みの層をいくつも構成して、状況に応じて層を切り替えるというのは、
搭載された頭一箇所で何でも処理しないといけないというロボットへの思い込みを取り払ってくれた。

なるほど、確かに人間の反射行動も、頭で一々考えているのではなく、
そういう状況になった際に、身体が勝手に動くという感じなので、実感としても合っている。

これがロドニー・ブルックスがこの理論を発表するまで誰も思いついていなかったというのも面白い。

さて、実際にやってみたが、
まず、この章に必要なライブラリは下記。

$ pip install numpy
$ pip install vispy
$ pip install PyQt5
$ pip install pyglet
$ pip install pymunk

なお、2025年07月時点では、上記のようにインストールすると下記になった。

$ pip list
Package     Version
----------- -------
cffi        1.17.1
freetype-py 2.5.1
hsluv       5.0.4
kiwisolver  1.4.8
numpy       2.3.1
packaging   25.0
pip         25.1.1
pycparser   2.22
pyglet      2.1.6
pymunk      7.1.0
PyQt5       5.15.11
PyQt5-Qt5   5.15.17
PyQt5_sip   12.17.0
vispy       0.15.2

結構書籍の執筆時点とはライブラリ(特にpymunkやpyglet)が変わっており、
それを使う
alifebook_lib/simulators/vehicle_simulator.py
の中身も、実際に起きたエラーとライブラリのdocを眺めつつ修正しないといけなかった。
だけど、まあ、そこまで深刻なものはなかったかな。

ソースは下記。
ryotakato/alife_oreilly_src

で、書籍の通りに実装し、Explore層まで作って試した後、
下記が不満だったので修正した。

  • フレームレートを変更できるようにして、何度も実行する際にすぐ確認できるようにした。
  • ゴミに触れて掃除する時間が長かったので、もっと短く。
  • ゴミを掃除した後、ゴミは消えるように。(元ソースは再度別の場所に生成していた)
  • ゴミを全部掃除した後、Finishの文字を出し、終了するように。(ウチの子どもが終わったらゲームクリアみたいにしてほしいって言ったので。)
  • 角に行った際、抜け出せなくて嵌まってしまうので、何秒かその状態が続いたときはバックして抜け出せるように。

最後の実装は、今回のテーマであるサブサンプション・アーキテクチャに則り、
Avoid層とChaosWander層の間に、Back層というのを用意し、
そこでavoid状態がある程度続いたら左右の車輪にバックするように指示するという仕組みにした。
左右の車輪を同じスピードでバックすると、
ChaosWander層に戻った瞬間に目の前に進んで、再度角に嵌まってしまうということになったので、
バックする車輪のスピードを変えることで、曲がりながらバックして容易に抜け出せるようにしている。

実際のロボット掃除機も結構こういう動きするよね。

というわけで、実装したものをGIF動画で。
層の変化はロボット掃除機自体の色で示されていて、
赤: Avoid層、黄: Back層、緑: ChaosWander層、青: Explore層
って感じ。
Back層は動画の後半の方に一回だけ登場。

learning_oreilly_alife_04_01

何なら、

  • 灰色の障害物とゴミが、位置が被って生成されてしまう問題。
  • アプリ内でフレームレートや障害物の数を変更する機能。
  • ロボット掃除機が能動的にゴミを探さない問題。
    なども直したかったけど、一旦いいかな。

特に最後は、結局今はただのランダムウォークなので、ゴミに触れたときしか掃除しないとい問題点に起因する。
なので、なかなか最後まで残ったゴミに触れることがなく、掃除するのにかなり時間がかかる。(部屋のサイズを広げると余計)
実際のロボット掃除機は部屋の地図とか作るんだろうね。
そこまではやれないけど、
センサーを追加して、近くにあったらゴミの方へ近づくようにしてもいいかも。

それか、遺伝的アルゴリズムなどを積んで、より良く掃除した遺伝子を残すようにするか。
でも、それだったら障害物を避けるなども自分で学んでほしいから、今回のサブサンプション・アーキテクチャとはちょっと違うかな。

次は6章。

今さらだけど、この書籍、やたら実際に書面に書いてあるソースの抜けや漏れが多いよね。
下記のソースを参考にしないと、そのままやっても動かないところ多数。
GitHub - alifelab/alife_book_src: 「作って動かすALife - 実装を通した人工生命モデル理論入門」サンプルコード




Comments

There are currently no comments on this article, be the first to add one below

Add a Comment

Note that I may remove comments for any reason, so try to be civil. If you are looking for a response to your comment, either leave your email address or check back on this page periodically.