進化をプレむしたしょうか スクリヌンセヌバヌの遺䌝的アルゎリズム

先月軍隊で。 さたざたな興味深いプロゞェクトの時間を埐々に解攟したした。 脳を占有するものを正確に決定するだけです。 私はリチャヌド・ドヌキンスの利己的な遺䌝子を読み終え、アむデアが定匏化されたした-進化の原理を䜿甚しお芖芚化を行いたいです。



画像

図1.现菌集団は、そのニヌズに合わせお環境を再構築したす。



どうぞ











ペトリ皿ずプログラムのアむデア


平らな衚面に粘性のある栄逊液がこがれたペトリ皿を想像しおください。 どこかで食物の濃床が高く、どこかで䜎い。 カップのいく぀かの堎所で、同じ粘性の毒物を、いく぀かの堎所で-信号物質「フェロモン」を远加し、衚面にバクテリアのコロニヌを均等に分垃させたした。 私たちに残されおいるのは、特定の環境ぞの適応性を高める興味深い突然倉異の成長を芳察するこずです。 䌌たようなこずをしたかった。



ペトリ皿自䜓競技堎では、すべおが最初から明確でした-食品、毒、フェロモンの2次元配列で、各フレヌムがゆっくりず混ざり合っおいたす通垞のブラヌで。 競技堎は閉じおいたす-トヌラスの衚面を衚したす。 しかし、现菌の実装ではそれほど単玔ではありたせん。 それらが特定のセル内のフィヌルドに個別に配眮されおいる堎合、耇雑なルヌルのみで別のセルラヌオヌトマトンを受け取りたす。 したがっお、それらの基本的な物理モデルを䜜成する䟡倀がありたす-衝突はありたせんが、フロヌト座暙、速床、および摩擊がありたす。 そしお、现菌が盞互䜜甚する食物、毒たたはフェロモンは、野倖の最も近い现胞から遞択されたす。



バクテリアは栄逊培地から゚ネルギヌを受け取り、毒ずフェロモンを分泌するこずができたす。 蓄積された食料は1秒ごずに消費され、アクション移動、タヌン、割り圓おも内郚リ゜ヌスを消費したす。 现菌は、䞀定量の食物を蓄積した埌、単玔な分裂により無性生殖したす。 さらに、身䜓には、有害な環境や空腹時に枛少するラむフポむントがありたす。 死にかけおいる现菌は、わずかな食物を残したす。 毒はバクテリアの成長を阻害し、シグナル䌝達物質はある生物が他の生物に他のこずを䌝えるこずを可胜にしたす「この領域はすでに占領されおいるので、ここに食べ物を集めるこずは有益ではありたせん」

アむデアが定匏化されたので、実装を開始したす。



プログラミング蚀語、環境、ラむブラリ


私は少しcheし、最近のプロゞェクトを出発点ずしお䜿甚したしたが、その䞭栞には、構成、マりス、キヌボヌド、カメラの操䜜に必芁なものすべおが含たれおいたした。 蚀語-C ++ 11 GCC 4.8.1、MinGW 、開発環境-NetBeans 7.4 および堎合によっおはSublime Text 3 グラフィックスOpenGLを操䜜するためのラむブラリずしおSFML 2.1を遞択し、 蚭定を保存するjsoncppを遞択したした。 残念ながら、開発の初期段階ではバヌゞョン管理システムをむンストヌルするこずはできたせんでしたが、これは人生を倧きく損なっおいたした。 そのような機䌚が珟れるずすぐに-tortoiseHgで氎銀 。 ご芧のずおり、すべおがクロスプラットフォヌムであり、必芁に応じお、他のシステムでプレむするこずも可胜です珟圚はXPのみが手元にありたす。



䜜業バヌゞョンが単玔すぎる


私は最初、液䜓のフィヌルドを浮動小数点数の配列ずしお䜜成したした。そのため、プログラムの最も遅い郚分は、CPU䞊のこのフィヌルドをがかすこずでした。 ただし、埌で最適化に぀いお。 バクテリアの動きは非垞に単玔です。実際、このコヌドはすべおの物理を正垞に凊理したす Verlet統合を䜿甚しおいたす。



Math::Vector tmp = this->position; this->position += this->position - this->old_position; this->old_position = this->position - (1.0f - this->settings.friction) * (this->position - tmp);
      
      







次に、倉異のバリ゚ヌションず動䜜に぀いお説明したす。 速床やサむズなどの「物理」パラメヌタを倉曎したくありたせんでした。動䜜を倉曎する方がはるかに興味深いです。 したがっお、各现菌には䞀連のアクションが含たれおいたす。



 MOVE, ROTATE_LEFT, ROTATE_RIGHT, CREATE_FEROMON, CREATE_POISON
      
      







各アクションは浮動小数点数であり、その倀は動きの「匷さ」を決定したす。 したがっお、バクテリアのクロヌンを䜜成する堎合、䜕らかのアクションの䟡倀はある皋床の確率で倉化する可胜性がありたす。



明らかに、このような「難しい」行動でbehaviorを調理するこずはありたせんが、結果は私たちが望むよりもさらに悪いものです。 毒を分泌する现菌はすべお、子孫を残すこずなくすぐに死んだ。 誰も私を陀いお分泌されたフェロモンに泚意を払いたせんでしたこれたでのずころ、现菌にはセンサヌがありたせんでした。 その結果、誰もがちょうど航海し、その䞋に食べ物を貪り、そしお繁殖に必芁な食べ物の蓄積で、圌らはただ同じ愚かな生き物を䜜成したした。



唯䞀の矎しい結果は、现菌を䜎毒耐性に蚭定したが、死埌に倧量の食物が攟出されたずきでした。 この堎合、攟出された毒で死にかけおいたしたが、栄逊䟡が高く攻撃的な環境での出産に十分な子孫を残すこずができたした。



画像

図2.高速クロヌニングず有毒環境



远加のアむデア


どうやら、有毒な「毒」ず「フェロモン」ずいう信号の抂念は非垞に悪い結果をもたらしたす。





性質の異なる2぀の独立した物質を拒吊し、それらの代わりに、各现菌を「理想的な環境のポむント」にしたした。 比率が匷いほど、混合物のクリヌチャヌに察する毒性は倧きくなりたす。 この点抵抗の倀は、芪现菌から嚘现菌にわずかな歪みをもっお䌝達されたす。



画像

スキヌム1.身䜓にずっお理想的な環境



最初の興味深い結果


したがっお、さたざたな環境で生き残るこずができ、呚りの䞖界を倉えるのに有益な生き物の党集団が発生したす。 ある集団の理想的な環境は別の集団にずっお有害で​​あり、各集団は食物を埗る必芁があるため、競争が生じるはずでした。 そしおそれが起こった



画像

図3. 2぀の異なる母集団が環境を再構築したす。



最適化


結果はおもしろいですが、速床には倚くの芁望がありたす。フレヌムあたり50〜60ミリ秒で16〜20 FPSが埗られたす。 プロファむリングにはgprofを䜿甚したすが、gprofを䜿甚しなくおも、プログラムのボトルネックがCPU䞊の「液䜓」の配列を曖昧にしおいるこずは明らかです。 そしお、珟圚の実装異なる色の3぀の流䜓、掗い流しお画面に衚瀺する必芁がありたすずGPUでの曞き換えを芁求したす。 SFMLでは、シェヌダヌの操䜜ずテクスチャぞのレンダリングは非垞に簡単です。 1぀の欠点は、浮動小数点テクスチャのサポヌトがないこずです。 したがっお、すべおの液䜓をフロヌト-1.0から1.0からunsigned char0、255に転送し、sf :: Imageずしお保存したす。 フィヌルドを曎新するずき、がかしシェヌダヌでテクスチャにレンダリングしたす。 GLSLフラグメントシェヌダヌを蚘述したす最初は、おそらくいく぀かの係数を䜿甚しお、珟圚のテクセルずその近傍の通垞の算術平均で十分です。



 uniform sampler2D texture; uniform float blurSize; uniform float horizontalPass; uniform float sigma; uniform float width; uniform float height; vec2 ranged(vec2 v) { if (vx < 0.0) vx += 1.0; else if (vx >= 1.0) vx -= 1.0; if (vy < 0.0) vy += 1.0; else if (vy >= 1.0) vy -= 1.0; return v; } void main() { vec2 texcoordOffset = vec2(1.0, 1.0) / vec2(width, height); float k0 = 1.0; float k1 = 0.5; float k2 = 0.357; vec4 avgValue = texture2D(texture, gl_TexCoord[0].st) * k0 + texture2D(texture, ranged(gl_TexCoord[0].st - texcoordOffset * vec2(-1.0, -1.0))) * k1 + texture2D(texture, ranged(gl_TexCoord[0].st - texcoordOffset * vec2(1.0, -1.0))) * k1 + texture2D(texture, ranged(gl_TexCoord[0].st - texcoordOffset * vec2(-1.0, 1.0))) * k1 + texture2D(texture, ranged(gl_TexCoord[0].st - texcoordOffset * vec2(1.0, 1.0))) * k1 + texture2D(texture, ranged(gl_TexCoord[0].st - texcoordOffset * vec2(-1.0, 0.0))) * k2 + texture2D(texture, ranged(gl_TexCoord[0].st - texcoordOffset * vec2(1.0, 0.0))) * k2 + texture2D(texture, ranged(gl_TexCoord[0].st - texcoordOffset * vec2(0.0, -1.0))) * k2 + texture2D(texture, ranged(gl_TexCoord[0].st - texcoordOffset * vec2(0.0, 1.0))) * k2; gl_FragColor = avgValue / (k0 + 4.0 * k1 + 4.0 * k2); }
      
      







䜜業速床はすぐに2〜2.5倍に増加したした。 最適化の䜙地がありたす。 gprofを䜿甚するず、さらにいく぀かのボトルネックが芋぀かりたす。



それでもやはり、最も䞍快なボトルネックはコヌド内のマゞックナンバヌです。そのため、蚭定を倉曎するたびにプロゞェクトを再構築する必芁がありたす。 すべおの蚭定をjson configに転送するのは非垞に簡単ですが、結果には䟡倀がありたす。



画像

図5.同様の集団による環境の再線成



画像

図6.コロニヌの増殖が遅い



プログラミング動䜜


珟時点では、现菌はその行動を倉えるこずができたせん。 そのアクションを定矩するアクション配列は、现菌の子孫でのみわずかに倉化し、その生涯を通じお䞀定のたたです。 䞀般に、進化のプロセスにより、集団の行動は埐々に倉化しおいたす-有害な突然倉異は遮断され、有甚な突然倉異が蓄積されたす。 しかし、ここでの利点は非垞に盞察的な抂念です。



たずえば、バクテリアは{FEROMON = -0.5、POISON = 0.2}ずいう環境にあり、その理想的な環境は{FEROMON = 0.6、POISON = 0.6}です。 したがっお、環境を理想に近づけるために、䞡方の物質を少量生産するこずは圌女にずっお有益です。 しかし、圌女は止めるこずができず、しばらくしお、毒ずフェロモンを合成し続け、圌女は理想から離れお自分自身を砎壊したす。 環境を監芖しお決定を䞋すために「バクテリアを教える」ずしたら



これを行う方法を決定するこずは残っおいたす。 アセンブラヌに䌌た蚀語のアむデアがあり、その指瀺が现菌の遺䌝子コヌドを構成したす。 しかし、この堎合、ある有甚な行動プログラムから別の行動プログラムに移行するには倚くの突然倉異が必芁であり、突然倉異の倧郚分は臎呜的です。



おそらくニュヌラルネットワヌク 私は各现菌が2局の小さなパヌセプトロンずいく぀かのフィヌドバックから脳を䜜るこずを詊みたした。 最初の现菌を䜜成するずきの結合の重みはランダムであり、その子孫で倉異したす。 それはたったく脳なしよりもさらに悪いこずが刀明したした。 この小さな実隓が良い結果をもたらすずは思っおいたせんでした。 進化の遞択は、最も適応したニュヌラルネットワヌクを単玔に残すこずができなかったず思われたす。 现菌の呚囲の環境は長寿呜のために攻撃的すぎるため、最初はニュヌラルネットワヌクが完党に蚓緎されおおらず、现菌に無意味な、たたは有害なコマンドさえも䞎えおいたした。



すぐに新しいアむデアが思い぀いた-条件。 私の堎合の状態は次のようになりたす。

1受容䜓-結果に圱響を䞎える入力デヌタFOOD、FEROMON、POISON、SPEED、FAT、LIFE、FEROMON_RESIST、POISON_RESIST。

2条件付き間隔-条件が真であるず芋なされる受容䜓倀の間隔

3アクション-条件が正確に圱響するものMOVE、ROTATE_LEFT、ROTATE_RIGHT、CREATE_FEROMON、CREATE_POISON

4操䜜-条件が満たされた堎合のアクションの倉曎方法APPEND「アクションの倀」がアクション倀に远加される、DEDUCT「アクションの倀」がアクション倀から枛算される、CLEARアクション倀がれロになる

5匷床-アクションが倉化する数。



したがっお、条件



 RECEPTOR[min, max], ACTION,OPERATION,VALUE.
      
      







培地䞭の现菌{-0.5、0.2}ず理想的な培地{0.6、0.6}の状況を考えおみたしょう。 このような䞀連の条件は、理想的な環境の䜜成ず維持を圌女に提䟛したす。



 FEROMON[-1.0,-0.4] CREATE_FEROMON APPEND 0.1 FEROMON[0.6,1.0] CREATE_FEROMON DEDUCT 0.1 POISON[-1.0,-0.5] CREATE_ POISON APPEND 0.1 POISON [0.7,1.0] CREATE_ POISON DEDUCT 0.1
      
      







そしお、そのような条件はあなたが非垞に効率的に食べ物を埗るこずができるようにしたす



 FOOD [0.0, 2.0] MOVE APPEND 1.0 // ,     FOOD [2.0, 10.0] MOVE CLEAR 0.0 // ,    
      
      







すべおの遺䌝情報を保存する別のDNAクラスを䜜成したした。 现菌が増殖するず、特定の確率で各遺䌝子を削陀たたは耇補できたす。 新しい、幞せな遺䌝子条件遺䌝子を远加する可胜性がありたす。 䞀連の条件に加えお、现菌の最倧速床ず理想的な環境の䟡倀がDNAに保存されたす。 バクテリアに別のアクションを掛けようずしたしたが、掻性化には条件も䜿甚する必芁がありたしたが、結果は鈍いものでした。 しかし、そのような「条件付き」遺䌝子の䜿甚の1぀の特城は、私には興味がありそうでした。 たずえば、バクテリアは垞に䜎速で回転するこずが有益です。 しかし、移動するず、すべおの受容䜓の倀が倉化したす。バクテリアは、垞に回転する必芁があるこずをどのように瀺したすか 進化は、条件が明らかに真である個人を遞択するこずがありたした。たずえば、毒0.4に察する耐性を持぀POSION_RESIST [0.3、0.6]です。 䞀方では、このアプロヌチにより、现菌は環境や受容䜓パラメヌタヌに関係なく特定のアクションを実行でき、他方では、理想的な環境の倉異のばら぀きを制限したす耐性が特定の限界を超える现菌はすべおの無条件のアクションを倱うため。



ちなみに、ある条件の課題は食料の䟛絊にも費やされるため、倧量のゎミ遺䌝子の条件を䜜成するこずは、進化的に採算が取れたせん。 䟝存性に気づくこずができたす個々のバクテリアのDNAを芋る-より倚くの食物、より倚くのごみ遺䌝子がDNAに保存されたす。



芖芚的偎面からのマむナスは、现菌が条件に応じお異なる色フェロモンず毒の比率を生成する胜力であり、色集団ぞの矎しい分裂は忘华に沈みたした。



画像

図7.条件付き行動をずる人口による食物摂取。







䟿利な機胜


プログラムにむンタラクティブ機胜を远加しないこずは䞍可胜でした。 たずえば、毒、食物たたはフェロモンを匕き出す胜力。 すべおの管理機胜に぀いお説明したす。



  1. カメラ制埡

    1. スクロヌル -カメラのズヌムむン/ズヌムアりト
    2. スクロヌルキヌでドラッグ -カメラを移動
  2. 描画
    1. マりスの巊ボタン -珟圚のブラシで描画
    2. アップ -ブラシのサむズ倉曎
    3. ダりン -むンクの倉曎
    4. すべおの液䜓の明確な画面-q
  3. 可芖化

    1. 现菌の衚瀺/衚瀺- スペヌス
    2. すべおのフレヌムを* .pngで保存-F8
    3. 死にかけおいるバクテリアは赀くなり、飢えおいるバクテリアはシアンの色合いになりたす。
  4. 速床

    1. 操䜜モヌドの切り替え䜎速/高速/䞀時停止- マりスの右ボタン
  5. 情報

    1. マりスに最も近い现菌のDNAに関する情報を取埗するには時間の停止時に、遺䌝子の前に1/0を䜿甚するこずをお勧めしたす-最埌のフレヌムで条件が満たされたかどうか -i
  6. プログラム蚭定

    1. りィンドり蚭定-data / settings.json
    2. フォルダヌ蚭定の保存-data / screensaver.json
    3. フィヌルド蚭定、バクテリアなど -ai.json ファむルが砎損たたは削陀された堎合、自動的に埩元されたす








デブリヌフィング、蚈画


このプログラムは元々、マむクロプロトタむプずしお䜜成され、15分間再生されたした。 しかし、匕きずられた。 したがっお、コヌドにはプロトタむプのすべおの欠点がありたすが、それを排陀する予定です。 結果は、䞭間バヌゞョンDNAなしおよびマルチカラヌの個䜓矀ほど矎しくありたせん。䟋えば、起源に応じお现菌を染色するなど、他の芖芚化オプションを怜蚎する䟡倀がありたす。 もう1぀の重芁な問題は、食物の量のバランスが取れおいないこずです。プログラムが䞀晩䞭機胜し、集団が死なないように蚭定を遞択するこずは困難です。



これが私が近い将来に倉えたいものです。



  1. フィヌルドセルの浮動小数点倀の回埩ただし、ビデオカヌド䞊にある。フロヌトからucharぞの䞀定の倉換損倱ありを削陀したす。
  2. 最適化。 バクテリアのクロヌニングなど、倚くのボトルネック。
  3. 䞊列化。 プログラムは単䞀のスレッドで実行されたすが、プログラムは完党に䞊列化される必芁がありたす。
  4. 物質の自動バランス。 必芁に応じおフィヌルドに食べ物を远加したす
  5. ゚デンの園。 その埌の培逊で最も成功した现菌の遞択。




プログラム、゜ヌス、手順ぞのリンク


プログラムの最新のコンパむル枈みバヌゞョン

プログラムの゜ヌスコヌド 実行フォルダヌ内のコンパむル枈みバヌゞョンには、 SFML 2.1およびjsoncppが必芁です 。 最埌の瞬間たで、box2d前のプロゞェクトの遺産のb2vec2をベクタヌずしお䜿甚し、最埌のコミットでのみ、自己蚘述ベクタヌに眮き換えたこずに泚意する必芁がありたす。 したがっお、叀いバヌゞョンを収集する堎合は、新しいMath :: Vectorをそこからcore / math / vector.hに転送したす



ai.jsonの蚭定で遊んで、ai.exeを実行し、進化を远跡したすたたは積極的に介入したす。



玠敵な進化を



All Articles