
最近、 ゲームLifeに関する記事を読み、今年の5月にこのオリエンテーションのプロジェクトを書き始めたことを思い出しました。 仕事のルーティンに対する彼への関心はすぐに消えましたが、多くは書かれていました。 そして今、この記事に触発されて、このプロジェクトを埃っぽい棚から取り出し、いくつかの機能を追加しました。これについては後で説明します。
つまり、 私のオプションには次の条件があります。
- 256 * 256セルのフィールドで生命が発達します。
- 3種類のオブジェクトをフィールドに配置できます。 生き物 、 食物 (草と呼びましょう)、および石 (障害物)。
- 生き物は実際には修正されたチューリングマシンであり 、より正確には、ストアメモリを備えたオートマトンのようなものです。 生き物は、「遺伝」コードを実行する「プロセッサ」です。
- 生き物は、適切なコマンドを与えて、特定のアクション(移動、食べ、再現(これまではクローニングによってのみ、突然変異は日々、交差する))を実行することができます。
- 草を踏むと、その生物は踏みにじります。
- 食物を吸収するには、次のセルにいるコマンド「この方向で食べる!」を与える必要があります。
- 生き物には記憶があり、それによってサイクルや条件などを構築できます。 チューリングが完了し (正しくない場合は修正してください!)、メモリの量は無制限です。
- 生き物は心の中で値を加算および減算できます。ビット容量は1バイトに制限されています。
- 遺伝的アルゴリズムを実装する可能性があります(まだ実装されていません)。
簡単な説明
元々は生物がそこで進化するように計画されていたため、プログラムEvo ( git )と呼びました。 しかし、自分で生活行動アルゴリズムを記述し、それをプログラムにロードすることを妨げるものは何もありません。 現時点では( MainWindow :: MainWindow()の )コードを編集するだけで、家畜の読み込みはすぐに実装されます。
EvoはC ++ / Qtで記述されています。 パフォーマンスはLinuxでのみテストされましたが、プログラムはQtライブラリでサポートされているすべてのプラットフォームで動作するはずです。
バイナリを取得するには、次のようにします。
git clone git@github.com:icoz/evo.git cd evo qmake make
そのため、開始すると、いくつかのボタンのあるウィンドウが表示され、フィールドがどのように色で塗りつぶされるかを確認します。

色が何であるかを説明します:
- 空虚は白です。
- 石は赤です。
- もちろん、草は緑です。
- 青で動物を強調しました
最初に、DSNを使用して生物の遺伝コードが生成されます。 だから魔法はありません。 確かに、後で魔法が登場します ! ランダムに生成されたものがクロールを開始し、お互いを食べ、牧草地になります。
いくつかの簡単なルールがあります。
- フィールドで150(デフォルト)ラウンドごとに、100から1100の草の細胞が食べられたり踏みつけられたりするのを補うために投げられ、草の葉ごとに占有されていない細胞が検索されます。
- 500(デフォルト)ラウンドごとに、150のランダムに生成された動物が追加され、これも生き残りを始めます。
- 人口が1500人を超える場合、それらはクリーニングされます。 フィットネス== 0のすべての動物が殺されます。
論理パーティションは次のとおりです。
フィールド(Mapクラス)は、オブジェクトを保存および移動する機能と、一定量の食物を散布する機能を実装します。
ワールド(ワールドクラス)は、生物と外界との相互作用を表します。
動物(Animalクラスのインスタンス)は自動プログラムであり、そのプログラムは「遺伝的」コードです(各記憶には記憶力があり、頭の中で加減する能力があることを思い出します)。 このコードを実行する過程で、本体は他の決定を下します。 世界はこれらの要求を処理します(これはすべて、信号/スロットのシステムを通じて実装されます)。
容認できる行動の場合、生き物はフィットネスパラメータの増加で報われます。 草の吸収については、 フィットネスが1増加し、別の生き物を食べることで+10 、生殖で+50増加します。 フィットネス値が高いほど、体は成功します。 実際、このパラメーターは体の活力を表します。 ちなみに、これらのかわいい生き物の生活を複雑にし、新しいものを思い付くために、新しいルールの導入に関するあなたの提案を待っています。
この不名誉はすべてこのように実装されています:
- フィールド: map.hおよびmap.cppファイル内 。
- world: world.h 、 world.cpp ;
- 動物: animal.h 、 animal.cpp 、 common.h ;
- 何が起こっているかを視覚化するメインウィンドウ: mainwindow.h 、 mainwindow.cpp
プログラムを最適化して、大量のリソースを消費しないようにするための作業が行われたことに注意したいと思います。 しかし、彼女の仕事の詳細を考慮して、彼女はパーセントを重くロードします。 最も遅いのはフレームのレンダリングであるため、デフォルトでは、レンダリングは100ラウンドごとにのみ行われます。
家畜を保存すると、バイナリコードだけでなく、 * .code拡張子のテキストファイルも作成され 、このコードの復号化が行われます。
他に何をしたいですか
ウィッシュリストは次のとおりです。
- 遺伝的アルゴリズムの実装はまだ十分ではないため、最も粘り強い個人を選択して交差させることができます。 実際のところ、2セットのバイトコードをクロスする必要があるため、クロスブリードの実装は私にとって最も難しいようです。 (アルゴリズムのアイデアがある場合-コメントしてください)。
- 使用可能なコマンドのセットを確認することは理にかなっている場合があります。
- 動物の「ビジョン」、つまり 隣接セルのタイプを決定する機能
- 生き物がランダムに生成されないようにジェネレーターを変更できますが、チームの重みを考慮します。
- パフォーマンスを改善するために計算を並列化する方法のオプションを検討してください。
- 「遺伝」コード用のエディタを作成して、生き物を自分で開発するのが便利になるようにします。
近い将来何が行われるか
今後の変更のリストは次のとおりです。
- 伝播されると、突然変異は「遺伝」コードに導入されます。
- [現在の画像を保存]をクリックすると、現在のマップを保存するためのファイル名の入力を求められます。
- 保存された生きた動物をロードすることが可能になります。
- 起動時にフォルダーから複数の動物を一度にロードする可能性(作業名-Autorun-folder )。
最後に
このメモを書き始めたとき、私はこのプログラムをバックグラウンドで使用していました(4番目の切り株にあり、速度の点で最適化はありませんでした)。 その瞬間、私は生き物のフィットネス= 3441に達しました。 これを行うために、210,000人以上が生存し、死亡し、6,500ラウンドを超えました。
面白いことができる本当に面白い動物を手に入れるには、少なくとも10 ^ 6ラウンドが必要です(私の推定では)。 たぶん誰かがより強力なコンピューター、ねじれ? しかし、もちろん、遺伝的アルゴリズムと初期セットのよりインテリジェントなジェネレーターを実装すると、さらに興味深いものになります。 まあ、生きている人々によって書かれた個人によって生成された動物が追加されています。 これは、将来の世代にとって良いスタートを切るでしょう。
コアi5でプログラムを推進した後、私はすぐに群れになりました。 活力はすでに10,390ユニットに達しました!
これらのかわいい生き物を見るのは面白いです。 あなたは彼らに共感し始めます。
最後に、興味深い「人生」の写真をいくつか紹介します。 目に見えるのは、集団の移動ルート、群れの形成です。


最も深刻な結果は36480です(これは10時間の作業と2 * 10 ^ 6ラウンドの後です):

ダウンロード、実行、視聴!
誰も気にしないで、自分でボットを書いて、誰がより強いかを試してみてください!
それだけです ご清聴ありがとうございました!
バグレポートと新機能の提案を歓迎します。
UPD:突然変異はすでに基本レベルで実装されています。
UPD2: バグトラッカー
UPD4: Windows用の新しいバイナリを dtfに感謝