21世紀アリ型ロボット

21世紀のゲームのAIって頭いいですよね。
21世紀のAIは目標までに障害物があっても壁に体当たりせず、迂回して目標に辿り着くことができています。
特に21世紀流行しているクラフト系のゲームでは、障害物をクラフトしてAIが選択すべきルートをほぼ無限にすることができます。
ということは、事前にルートをプログラムしているなんてことはありえないような気がします。

では、21世紀のAIはどのような思考ルーチンで行動しているんでしょうか？

探索系のアルゴリズムには詳しくないのですが、適当なアプローチでそれっぽいものを作って21世紀のAIへの理解を深めてみようと思います。

ということで、題材として働きアリ（コロニー外限定）のシミュレーションを作成してみようと思います。
![ant_opening.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920998/ba6fc53a-6a76-4891-384c-3342bdc3de89.gif)

### <font color="red">注意</font>
この記事はそれっぽいアリの挙動をシミュレートするだけなので、何らかの学術的な根拠はありません。

# シミュレーション作成
## アリの作成
まずは、本シミュレーションの要であるアリとコロニーを作成します。
アリの定義は以下のようにします。

```cs:Ant.cs
public class Ant
{
    private Vector3 _position;
    private Quaternion _rotation;

    // 移動速度
    private float _speed;

    // 帰還状態かどうか
    private bool _isBacking = false;
    // コロニーへ帰還するまでの時間
    private float _backTime;
    // コロニーの位置情報
    private Vector3 _colony;

    // 左へ曲がる確率
    private float _curveProbabilityLeft;
    // 右へ曲がる確率
    private float _curveProbabilityRight;
}
```

Unityのスクリプトから雑に変換しましたが、基本は直進して時々移動方向を変更するだけのオブジェクトです。
そんなアリを格納するコロニーの定義は以下のようにします。

```cs:Colony.sc
public class Colony
{
    private Vector3 _position;

    // アリの最大保有数
    private int _maxAntCount;
    // 排出間隔（秒）
    private float _spawnInterval;

    // アリの排出数
    private int _antCount;
}
```

こちらも単純な構造で、アリを排出して再格納するだけのオブジェクトです。

アリには驚くべきことに帰巣本能がある[^1]らしいので、ここまで実装すると、以下の画像のようになります。
[^1]: https://www.fumakilla.co.jp/kids/mushi/hakase/index.php?ans=658
![ant_swarm.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920998/7acfa6f5-4f61-326b-2f1e-680b2c15e08b.gif)


## 道標フェロモン
アリがフェロモンを使って活動しているということは周知のことかと思いますが、こと探索においては**道標フェロモン**なるものを使用して探索を行っているそうです。
というのも、アリはエサを見つけて帰巣する際にその道中にフェロモンを出すことで、他のアリにエサまでの道筋を伝えているということらしいです。
というわけで、このシミュレーションでもフェロモンの概念を導入したいと思います。

フェロモンの定義は以下のようにします。

```cs:Pheromone.cs
public class Pheromone
{
    private _position;

    // フェロモンの影響範囲
    private _radius;
    // フェロモンの影響力
    private _power;
}
```

フェロモンはシンプルに座標と影響範囲、影響力を持っています。
実際のフェロモンは、時間とともに霧散するそうなので、影響範囲は時間とともに増加、影響度は逆に減少させます。

実装するとこんな感じになりました。
![ant_pheromone.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920998/69471bcc-b52f-162f-34e4-1bd43383d544.gif)
左上の白いブロックが砂糖で、これに触れたアリからフェロモン（青い球）が発生します。

フェロモンを出すことができたので、次は道標フェロモンにアリを引き寄せてみます。
ルールとしては、フェロモンの影響範囲にいるアリがいる場合は、そのアリをフェロモンの中心に向かって行進させます。
また複数のフェロモンの影響下にある場合は、より弱い影響力のフェロモンの中心へ向かうものとします。

ここまでくると、なかなか見ごたえが出てきます。
![ant_pheromone_load.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920998/87e7d42c-8e81-5a4c-16e7-29294c966edf.gif)
第一陣がエサを見つけるまでは時間が掛かるものの、見つけてからは第二陣、第三陣・・・と続々とエサへの道を形成することができています。

## 障害物の作成
いよいよ本題の障害物を置いてみます。
![ant_pheromone_wall.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920998/25860bb1-d63d-dd77-83e8-1baf15cd7ac6.gif)
アリは障害物に当たると、後進の後に方向転換を行い再度行進を繰り返します。

結果としてコロニーから砂糖までの道を築くことはできているのですが、障害物の回避能力が低すぎて、コロニーに着く頃には砂糖側のフェロモンが霧散してしまっています。

さらに、コロニーから壁向こうの探索能力が低すぎるのも問題です。
砂糖を見つけるまでは省略しましたが、探索には乱数を使用しているので、砂糖を見つけるまでに平気で1分以上かかってしまいます。

# まとめ
というわけで、なんとも中途半端な結果になってしまいましたが、私はここで力尽きてしまいました。

しかし、より効率的な障害物の回避方法や、他のアリと同じ場所を通らないような工夫次第では21世紀のAIに届きうるポテンシャルはあるような気がしました。
(というか、道標フェロモンは本当にえさを見つけた帰り道だけ出すんだろうか？という疑問も芽生えます。)

ともあれ私はここまでですが、これ以上の発展は未来の技術者に託し22世紀に向け頑張ってほしいと思います。