« Resizable Video | Main | 企業が好む表現対策 Part1<占い>::Circuit Maker(JP) »

Genetic Algorythm Part3(JP)

前回までの2回に渡り、ムービークリップで作られた虫に遺伝的アルゴリズムを載せて、新しく生成される虫が徐々に世代を経るにつれて環境に適応していく様子をシミュレートした。この遺伝的アルゴリズムを単純に虫ではなく生態系に適応させたい。まず今回は前提となる生態系を作成する。作成する生態系にはテントウムシ、カマキリ、餌、巣4つのオブジェクトがある。テントウムシとカマキリは自己の中に様々な状態を持たせてあり、この状態を様々な条件で遷移することで振る舞いを変えることができる。


緑:テントウムシ、茶:カマキリ


虫はカマキリとテントウムシの基本機能を持つ。HPの制御と状態遷移を管理するメソッドを持ち、action()メソッドにより行動を実行する。

import ai.*;
interface ai.IBug{
//状態管理
	function getState():State;
	function setState(state:State):Void;
//タイムライン
	function setMotion(num:Number):Void;
//HP管理
	function recover(hp:Number):Void;
	function detract(hp:Number):Void;
//現在の状態の行動の実行
	function action(world:IWorld):Void;
	function getHp():Number;
	function getId():Number;
//歩き回る
	function move():Void;
}
テントウムシ
テントウムシはこの生態系の中心となるオブジェクトである。基本的に繁殖して個体数を増やすのが目的で、個体が持つ生命力である変数HPを維持しながら行動をする。この生態的のアルゴリズムでは有効に食料を探す仕組みを載せていないので長期間生きることはない。テントウムシは一定以下にHPが低下すると死亡する。カマキリという天敵があることでHPの維持はさらに困難になる。この生態系ではカマキリがテントウムシの生命力に直接影響させることはないが、移動中にカマキリを発見した場合、巣への避難行動に切り替わる。実際は天敵を発見するアルゴリズムをファジー化した方がより行動に幅が出る。例えばテントウムシのHPの量やカマキリとの距離や巣の距離などを判断して脅威度数や健康度数を割り出し、巣へ移動するべきか、単純に方向を変えるかといった判断をすることである。
import ai.*;
interface ai.ILadybug extends IBug{
	function getSpawnState():State;
	function getLoverState():State;
	function getForageState():State;
	function getDeadState():State;
	function getGoHomeState():State;
//オブジェクトを探す
	function findFood():Boolean;
	function findLover():ILadybug;
	function canSeePredator():Boolean;
//巣に着いたか
	function isInNest():Boolean;
//各行動
	function goHome():Void;
	function spawn():Void;
	function dead():Void;
//子供を産んだか
	function setChild():Void;
	function getChild():Boolean;
}

カマキリ
カマキリはテントウムシの行動を左右させる天敵の役目を持つ。ただし、テントウムシの生命力を減らすなどの直接影響は与えない。通常は索敵状態となりテントウムシを探し、見つけると即座に追跡を始める。カマキリも生命力を持ち一定値になるとすべての行動を停止して休憩を始め、一定量までHPを回復する行動へ遷移する。

import ai.*;
interface ai.IRearhorse extends IBug{
	function getScoutState():State;
	function getChaseState():State;
	function getBreakState():State;
//オブジェクトを探す
	function findPrey():ILadybug;
//追跡行動
	function chase(t:GraphicObject):Void;	
}
以下で生態系のプレビューがみれる。
ソースグラフィックもダウンロード可能なので色々試してもらいたい。ここでは各オブジェクト間の計算にベクトルを使っているので数学クラスライブラリも別に用意してある。

カマキリをドラッグすると自由な位置に移動できる。

Post a comment