1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

遺伝的アルゴリズム的なものを作ってみたお話

Last updated at Posted at 2019-12-09

はじめに

最近AI/アルゴリズムの講演を聞きました。そこで、遺伝的アルゴリズムに興味を持ったので「作ってみたい!」と思い、作成したので、何かの参考になればと思いご紹介します。

遺伝的アルゴリズムとは~Wikipedia~

実際の挙動

movie.gif

movie1.gif


movie2.gif

これらは毎フレームランダムに動かしているだけですが、とても人工知能ぽくみえます。

実践

ソースコードはこちら
※3D空間上でXZ平面を走っているのを上から撮影しています

car.cs
float rotVelo = Random.Range(-rotateSpeed, rotateSpeed);
transform.eulerAngles = transform.eulerAngles + new Vector3(0, rotVelo, 0);

float posVelo = Random.Range(0, moveSpeed);
transform.position += transform.forward * posVelo;

このObjectを

movie3.gif

20体用意して、

movie4.gif

100mごとに障害物を置きます。

移動データの記録

それから動いた記録を保存するデータを作成します。

data.cs
[Serializable]
public struct MoveData
{
    public float pos;
    public float rot;
    public MoveData(float _pos, float _rot)
    {
        pos = _pos;
        rot = _rot;
    }
}

これのリストを作ってランダムに動いた結果を保存しておきます。
具体的な保存の値はそれぞれ、上記のrotVeloposVeloです。

全員が壁にぶつかったら集計をします。

その際にどのObjectが一番進んだかを確かめて次の世代を生成します。

遺伝子の受け継ぎ

marry.cs

for (int i = 0; i < ,二番優秀移動データリスト.Count; i++)
{
  bool l = Random.Range(0,2) == 0;
  次世代.移動データリスト.Add(l ? 一番優秀.移動データリスト[i] : 二番優秀.移動データリスト[i]);
}

こうすることで二人の親の遺伝子(移動データ)を持った子供が生まれます。
parent1+parent2->child1
parent1+parent3->child2
parent2+parent3->child3
parent2+parent4->child4
parent3+parent4->child5
parent3+parent5->child6

と子供を作っていきます
child7は一番優秀のデータをそのまま受け継ぎます。(最高記録が下がらないように)
chaild8,9,10はランダムに選んだ二人の遺伝子を組み合わせます。

ですがそこで突然変異を起こします。

突然変異

一定の確率で値をおかしくしてほしいので、

totuzennhenni.cs
if(突然変異する)
{
  for (int i = 0; i < 突然変異.移動データリスト.Count; i++)
  {
    突然変異.移動データリスト.Add(l ? 一番優秀.移動データリスト[i] : 二番優秀.移動データリスト[i]);
  
    foreach(var 移動データ in 突然変異.移動データリスト)
    {
      if(Random.Range(0 , 突然変異でどれくらい変わるか) != 0)
      移動データ.pos *= Random.Range(0,2);
      移動データ.rot *= Random.Range(-2,2);
    }
  }
}

こんな感じで突然変異させます。

これらの出来上がったデータをObjectに記録させて、
第2世代が始まります。

第2世代

第2世代は遺伝で受け継いだデータのとおりに動きます。
データがなくなったらランダムに動き始めます。

これらを繰り返して行くとこんな感じになりました。

YouTube AI/Algo DEMO

終わりに

講演とかYoutubeの動画を見ながらこんな感じで作るのかなーって作りきりました。
いいお勉強になって楽しかった。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?