Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@nmss208

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

はじめに

最近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の動画を見ながらこんな感じで作るのかなーって作りきりました。
いいお勉強になって楽しかった。

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What is going on with this article?