遺伝的アルゴリズムは、機能を最適化する方法です。 しかし、私たちの場合、私は単にその動作の原理、つまり進化の独特なモデリングに興味がありました。 まあ、自分を進化させるために。
生物(青と青緑色の細胞)、食物(緑)、毒(赤)がある抽象的な分野があります。

クリーチャーには64個の遺伝子しかありませんが、最初の10個しか導入できません。
各遺伝子は、コマンドを実行するときに処理でき、8で割った残りを与え、ボットが元の範囲に収まる特定のコマンドを実行するときに使用されます。
頭の8つの位置を作成するとき、コマンドの実行時にその位置が考慮されます。
コマンド[0、7]-歩行の方向。
コマンド[8、15]-回転方向。
チーム[16、23]-検査の方向、彼が毒/食物を見たら、彼は食べる。
チーム[24、31]-彼が毒を見つけた場合、安全な検査-彼はそれを食べ物に加工して食べます;彼が食べ物を見たら、彼は食べます。
コマンド[32、39]-安全な歩行の方向(壁または他のクリーチャーが前方にある場合、方向を変更します)。
コマンドの実行は、最大反復回数-10のループで行われます。
ウォーキングチームは最終です。 クリーチャーが8つのコマンドを実行した場合、図8がコマンド実行の反復子に追加され、1ずつ増加します。 これは、より大きなランダム性のために作成されます。
すべてが原始的
フィールドはプリミティブで構成され、実際には、タイプのいずれかのタイプを持つ基本クラスのオブジェクトのマトリックスです。 プリミティブは、CreationCクラスが継承する基本クラスです。
enum Type { Void, Food, Poison, Wall, Crt };
オブジェクトの実装:
class Prim { protected: Type _type; int _x; // int _y; int _healthPointChange; // / Color _color; // public: Type GetType(); void SetType(Type); int GetX(); int GetY(); void SetX(int); void SetY(int); Prim(); Prim(Type); ~Prim(); int getHPC(); void setHPC(int); Color& getColor(); void setColor(float, float, float); };
生き物の実現:
class CreationC : public Prim { enum direction { lU, up, uR, right, rD, dowm, dL, left }; // AreaCLA* _world; // , direction _head; // short int _hp; vector<UNI> _commandList; // UNI _itForCommand; // Prim*** _area; // boost::signal <void()> _eatingFood;// boost::signal <void()> _eatingPoison;// //....................................... void _Step(UNI); // bool _See(UNI); // void _Roll(UNI); // void _AddSlots();// void _Eat(UNI); // bool _isNextCellClose(UNI); // public: void Mutation();//, bool IsAlive();// void Execute();//, short int GetHP(); CreationC(vector<UNI>& gens, AreaCLA*, int x, int y); CreationC(); vector<UNI>& GetCommandList(); ~CreationC(); };
クリーチャーの数はフィールドのサイズに依存します。最初は、N個のボットがあり、そのうちN / 8個が生き残るとしましょう。 多様性のためにN / 32を変異させます(変異体-ターコイズ)。
class AreaCLA { Prim*** _map; int _heigh; // int _width;// UNI _countOfFood; // UNI _countOfPoison;// UNI _FPCount;// CreationC** _crtns; // int _crtnsCount; // int _maxCrtnsCount; int _minCrtnsCount; void _cicle(); // void _refresh(); // - void _Reborn(); // void _delCrt(int, int, int); // public: AreaCLA() ~AreaCLA(); void SetFood(COORD coord); void SetPoison(COORD coord); void SetWall(COORD coord); void SetVoid(COORD coord); void Start(); // void minFood(); // - void minPoison();// - }; void AreaCLA::_cicle() { for (int i = 0; i < _crtnsCount; i++) { if (!_crtns[i]) continue; _crtns[i]->Execute(); // if (!_crtns[i]->IsAlive()) // delCrt(i, _crtns[i]->GetX(), _crtns[i]->GetY()); // <- if (_crtnsCount == this->_minCrtnsCount)// . return; if (_countOfCtrnsChenged) { i
おわりに
睡眠と学習の合間に、このコードを書くのに約20時間かかりました。 疲れ果てて、進化をシミュレートする簡潔なプログラムがあり、それは私のデスクトップで常に誇示されています。私の動物が到達した限界は興味深いものです。
誰が気にしますか-githubへのリンクを添付します。 最新バージョン:Evolution 1.0。