Robocodeを䟋ずしお䜿甚した遺䌝的アルゎリズム





この蚘事が曞かれたずき、 「遺䌝的アルゎリズム」ずいうフレヌズのhabrapoiskは気高い空虚を裏切っおいたした。 しかし、䞍十分なレベル*怜閲によっお切り取られた*は出版日を遅らせ、今や、恥ずかしくお退屈な物myいの埌、この蚘事は䞖界に自分自身を瀺す機䌚を埗たした。 この期間䞭に、類䌌のトピックに関する少なくずも3぀の倚くの人が私の目に觊れた蚘事が公開されたした。以䞋の文章を初めお読むこずはおそらくないでしょう。 そのような人々には、GAを科孊的および科孊的に説明するための未経隓の若者の次の詊みから錻をかむのではなく、プログラミングゲヌムRobocodeのGAに基づくボットの䜜成を説明する第2郚の次の展瀺に行くこずを提案したす。 最新のむンテリゞェンスによるず、これはただハブで満たされおいたせん



パヌト1 遺䌝的アルゎリズムの寿呜ず仕事。



遠くから始めたしょう。 察凊する必芁があるタスクのセットがいく぀かありたす。 私たちの目暙は、 Given タスクの初期条件をResponse タヌゲット状態に倉換できるアクションを芋぀けるこずです。



状況が単玔で、そのような問題の解決策がこれらのマットの助けを借りお条件から明確に蚈算できる堎合、ここで、私たちの知恵なしですべおがうたくいき 、 私たちはめちゃくちゃです、私たちはすべお同意したせん 。 たずえば、二次方皋匏を解くずき、答え倀x1、x2は、孊校で教えた匏を適甚するこずにより、初期条件係数a、b、cから埗られたす。 そしお、教科曞に必芁な公匏がないずき、より悲しいケヌスで䜕をすべきか ブレヌンストヌミングを䜿甚しお、問題の1぀を解決しおみおください。 分析的に。 数倀的方法。 関数の必死な列挙の力。 しばらくするず、倢のような孊生の声が聞こえたす。 ええ、ここからカヌテンの埌ろから出おきたす。 したがっお、目暙は、入力デヌタを受信しお​​有効な数字を返す関数プログラムを芋぀けるプログラムを䜜成するこずです。 メタプログラミングの力、戊いぞ







うヌん、どうやっおそのような目暙を達成するのでしょうか 火の呚りの再垰の神に犠牲を払いたす。関数プログラムを芋぀けるプログラムを曞くプログラムを曞きたす...いいえ、これは二床ず機胜したせん。 進化のメカニズム、自然遞択などの珟象に目を向けお、自然から䟋を挙げたしょう。 すべおは人生ず同じです。私たちのプログラムは、より順応した個人のくびきの䞋で生き、亀尟し、出産し、死んで、子孫に最高の資質を䌝えたす。 クレむゞヌに聞こえたすが、よく芋る䟡倀がありたす。



私たちのプログラムの䞖界の神は私たちの仕事です。 プログラムはそれを信じ、それず亀尟し、教䌚のろうそくを敬い、人生の意味を芋぀け、この問題を解決するずいう唯䞀の目的のために生きなければなりたせん。 環境に最も適応した問題の解決に近いがアルファオスになり、生き残り、匷い子孫を䞎えたす。 オンラむンゲヌムに䞀生を費やした敗者は、問題の解決に成功したこずを知りたせんでしたが、子孫を䞎えるチャンスは非垞にわずかです。 遺䌝子プヌルからこれらの吹き出物の寄䞎が取り陀かれ、プログラム瀟䌚党䜓が解決された問題の明るい未来に向かうでしょう。 たあ、䞀般的な甚語では既に明らかですが、今はニュアンスに察凊する必芁がありたす。たず、ペアリングプログラムをどのように想像したすか 次に、第䞀䞖代のプログラムはどこで入手できたすか 第䞉に、個人の適性をどのような基準で刀断し、それが亀雑育皮にどのように圱響するか 第4に、この乱亀がすべお停止した堎合のアルゎリズムの終了条件を決定する䟡倀がありたす。



ペアリングプログラムの技術



私たちの倚くは、プログラムで暎力的な性的行為を䜿甚したいずいう匷い欲求を持っおいるず思いたす。 ここでは、そのような皮間逞脱がわが囜では奚励されおいないこずを事前に譊告するこずを䜙儀なくされおいたす。 カトリック教䌚はすべおを私たちに残しおいたす。結婚埌のプログラムを備えたプログラムです...そしお、その気の毒な男があなたにバヌでカクテルを買ったずしおも、圌らはパヌトナヌを倉えたせん。 いいえ、私は嘘を぀いおいたすが、ハヌレムタむプの䞀倫倚劻制は掻況を呈しおいたす。 はい、そしおただ、以䞋の「父」や「息子」などの蚀葉を䜿甚しおいるにもかかわらず、雌雄同䜓のプログラムがありたす。 たあ、近芪盞姊も...うヌん、私は* facepalm *教䌚に぀いお話しおいたした。 さお、それに぀いおは埌で。



亀配プログラムの問題はそれほど単玔ではありたせん。 関数、文字列、倉数のランダムな亀換は、コンパむラ/むンタヌプリタヌからあなたのアドレスぞの恐ろしい単語の倪い流れに぀ながり、決しお新しいプログラムではありたせん。 ぀たり、プログラムを正しくクロスする方法を芋぀ける必芁がありたす。 賢いおじさんたちが道を芋぀けたした。 そしお、コンパむラの構造を研究した賢い少幎少女も、すでに掚枬しおいたした。 はい、これは構文ツリヌです。



私はすぐに熱意で死にたす。私たちのひげはただそれほど倪くないので、最も単玔なタむプのプログラムを䜿甚したす。 垌望する人は無数の豊富なプログラミングの谷に行くこずができ、ここではすべおが単玔です-プログラムは匏で構成され、匏はいく぀かのアリティ、倉数、定数を持぀単玔な関数で構成されおいたす。 各匏は、プログラムによっお返される倀の1぀をカりントしたす。



䟋二次方皋匏を解こうずするあたり成功しない2぀の匏の個々のプログラムの正方圢

function square(a, b, c){ x1 = min(sin(b)*(a+1), 0); x2 = 3 + exp(log(b*a)); return {x1, x2}; }
      
      





プレれンテヌションを決定したした。今、ストレヌゞを扱う必芁がありたす。 これらのプログラムの呚りには、システムのある郚分から別の郚分䞀般的に蚀えば、私の堎合は䞀般に異なる蚀語で曞かれおいるに転送するなど、ただ倚くのダンスが残っおいるため、個人をツリヌの圢で保存するこずはあたりありたせん䟿利です。 より䟿利な方法理想的には有限のアルファベット䞊の行のセットでプレれンテヌションを行うには、個々のツリヌのプログラムセットがコヌド化/デコヌドの方法を孊習する必芁がありたす。



朚のように芋えるが、そうではないようだ


そのため、ツリヌを文字列ずしお提瀺する必芁がありたす。 ここでは、カルバツリヌの力が圹立ちたす。 最初に、ツリヌに分類される関数、倉数、および定数のセットを決定する必芁がありたす。 倉数ず定数はツリヌの葉に察応し、タヌミナル、関数ず呌ばれたす-ツリヌの残りの内郚ノヌド、非タヌミナルず呌ばれたす。 関数が異なる数の匕数を持぀こずができるずいう事実にも泚意を払う䟡倀がありたす。そのため、このような知識「アリティ」、専門家の口から静かに流れる蚀葉が本圓に必芁です。 結果は、次のような゚ンコヌドテヌブルです。

非端末 タヌミナル
いや 0 1 2 3 4 5 6
アむコン n + * もし 2 a b
アリティ 1 2 2 4 0 0 0
䟡倀 -{a1} {a1} + {a2} {a1} * {a2} {a1}> {a2}の堎合 {a3}{a4} 2 a b




ここで、n、+、*、ifは関数です。 2-定数; aずbは倉数です。 実際の問題では、このようなセットず2次方皋匏を䜿甚した重み付けテヌブルは解けたせん。 たた、れロによる陀算や他の黙瀺録のシナリオを回避するために、すべおの関数は実数のセット党䜓たあ、たたは問題で䜿甚するセットで定矩する必芁があるずいう事実に留意する必芁がありたす。 そしお、あなたは油断せずに座っお、れロから察数をキャッチし、それからどうするかを考えなければなりたせん。 私たちは誇りに思っおいる人ではありたせん。そのような遞択肢を陀いお、簡単な方法で行きたす。



そのため、このようなテヌブルを䜿甚しお、ツリヌから文字列ぞ、たたはその逆に関数を駆動するこずは問題ではありたせん。 たずえば、次のような解読甚の行を受け取りたした。

2 1 2 3 0 4 5 2 1 5 0 6 6 6 4 4 4 1 3 2



衚に埓っお、各芁玠を識別し、アリティも思い出したす。





さお、アリティの助けを借りお、関数の匕数ぞの参照を敎理したす。



リストの最埌の3぀の芁玠は誰も必芁ずせず、それらの倀は関数の結果に圱響を䞎えないずいう事実に泚意しおください。 これは、リストに含たれる芁玠の数、ツリヌノヌドの数がアリティに応じお垞に倉動するずいう事実により発生したした。 そのため、誀ったツリヌで苊しむよりも、留守番電話をかける方が適切です。



最初の芁玠でプルアップするず、匏ツリヌが手に掛かりたす





関数の倀は、ツリヌの再垰的な走査によっお蚈算できたす。これは次のようになりたす。





お父さんの目はこんな感じ


私たちは最も暑い堎所に戻りたす-亀差点ぞ。 亀配プログラムでは、次の条件を蚭定したす。たず、2぀の亀配個䜓が2぀の子孫を䞎えたす぀たり、母集団のサむズは䞀定です。 第二に、亀配の結果ずしお、子孫は䞡方の芪の特性をある皋床所有する必芁がありたす぀たり、リンゎはリンゎの朚から遠く離れお転がっおはいけたせん。 これで、プログラムがどのように衚瀺されるかがわかりたした。これは、ラむンたたはツリヌのコレクションです。 したがっお、文字列たたはツリヌずしお亀差できたす。



朚を越えるこずは、ランダムに遞択された枝の亀換です。 文字列の亀差は、いく぀かの方法で実装できたす。単䞀点組換え区分的接着、点から点ぞの組換え、芁玠ごずの亀換など。分詞を含む長く耇雑な文で蚘述できたすが、図を䞀目で十分に理解できたす。







再結合における接着の堎所がランダムに遞択されるこずは泚目に倀したす。芁玠ごずの亀差の堎合ず同様に、亀換はある皋床の確率で行われたす。 遺䌝の芳点からの亀配は有望に芋えたすが、実装がより困難です。



ねえ、この女の子は私ず䞀緒です



プロセスの最も芪密な郚分を芋぀けたした著者の個人的な生掻がどれほど貧匱であるかをこの蚘事で既に倚く感じおいたす。 今、䞀察の個人間の関係から、私たちは瀟䌚的基盀に移りたす。



個人は䞖代に分けられたす。 新䞖代は、前䞖代の個人の子䟛で構成されおいたす。 珟圚の䞖代の息子ず嚘、䞖代の父芪ず母芪、祖父母、great祖母などがれロ䞖代たで存圚しおいるこずがわかりたす-誇りに思っおいるすべおの人々の祖先。 生たれた埌の新しい䞖代の各個人は問題を解決しようずしたすが、いく぀かの神のフィットネス関数はその行動を評䟡し、若い人の掻動の評䟡に応じお、個人は子孫を再珟する機䌚を獲埗したす。぀たり、属を継続するために遞択された䞖代の最高の代衚者をクラスに入れたす。 私たちの䞖界は過酷で残酷であり、ゞストピアのすべおの芏範たたはあなたが望むものは䜕でもFÃŒhrerの考えによれば、䞍適切な退職した䞡芪は、子孫を産むずいう䜿呜を果たした埌、ガれンバヌゲンで旅行し、子䟛のカップルのために生掻空間を解攟したす。 子どもたちは芪の足跡をたどり、䞖代から䞖代ぞず続きたす。



亀配のクォヌタを発行するたさにフィットネス関数たたはフィットネス関数は、問題を解決する個人の胜力を適切に評䟡し、このフィットネスの数倀衚珟を提䟛する必芁がありたす倀が高いほど、より良いフィットネス。 たずえば、その二次方皋匏の堎合、これは、個々のプログラムによっお蚈算された眮換倀x1、x2に぀いお、方皋匏の巊偎の倀がれロにどれだけ近いかの尺床である可胜性がありたす。



フィットネス関数は、各個人に特定の数を䞎え、その有甚性ずフィットネスを瀺したす。 この倀は、遞択遞択手順に圱響したす。この個人がこの倀を持っおいるほど、亀差するペアさらには耇数を芋぀ける可胜性が高くなりたす。 実際には、䞖代のすべおの個䜓の適合床を蚈算した埌、これらの倀を正芏化し個䜓の適合床の合蚈が1に等しくなるように、キスの堎所ごずにロットが描かれ0から1の乱数、幞運なものを決定したす。 アルファオスは自分自身をいく぀かの堎所に獲埗できたすが、敗者は䜕も獲埗できず、 1994幎のパメラずのがろがろのカレンダヌだけで残りたす。 この遞択方法は「ルヌレット遞択」ず呌ばれ、抂略的には次のようになりたす。





繁殖には他の方法もありたすが、それらはすべお䞀般的なルヌルを順守しおいたす。぀たり、個䜓のフィットネスが倚ければ倚いほど、亀配に参加しなければなりたせん。 䞖代の最高の代衚者が远加の人生の圢で祖囜ぞの奉仕の賞を受け取るずき、プロセスに゚リヌト䞻矩のオプションを含めるこずもできたす圌は同時に子䟛を育おるこずができたすが、圌は倉曎なしで次の䞖代に移りたす。 これにより、非垞に成功した゜リュヌションを倱うこずがなくなり、亀差する過皋で砎壊される可胜性がありたす。



突然倉異に぀いおも蚀及したす。 この操䜜は、いく぀かの小さな確率でランダムに個人のフラグメントを倉曎し、遺䌝子プヌルの倚様化を可胜にしたす。 䟿利なこずは、突然そのような突然倉異が乳糖を分割するのに圹立ちたす もしそうでなければ、もう䞀぀の手は䞍芁です-そしお、あなたの日の終わりたでそれで自分自身を苊しめ、子孫を䞎えるこずはただ少しのチャンスです。



創造ず黙瀺録



圌らは䞖代から䞖代ぞず受け継がれる方法を芋぀けたした。今、問題は「䜕が根本原因になったのですか、それはどのように始たりたしたか あなたの䞖界のこれずは察照的に、そのようなこずを説明するために「ビッグバン」や「7日間」のようなトリックを思い぀く必芁はありたせん。 ここで答えは非垞に明確です-それはすべおランダムに䜜成されたれロ䞖代から始たりたした。 はい、はい、行/ツリヌをランダムに生成したす。 唯䞀の芁件は、個人の正確さず、それがどれだけ欠陥があるかです-誰も気にしたせん、遞択はその仕事をしたす。



私たちの䞖界は、必芁な限り存圚したす。 満足床の基準を蚭定し、十分に急な個䜓が珟れたらプロセスを停止するか、䞖代の個䜓がどれだけ倧きく異なるかを確認したす。 䞖代党䜓が䞀卵性双生児で構成されおいる堎合、それ以䞊のペアリングの興奮は遺䌝子プヌルに新しいものを䞎えないこずは論理的であり、1぀の突然倉異を期埅するのは単玔です。 時間制限を蚭定するこずもできたす。



ねえ ハロシャ脳急䞊昇 結果は䜕ですか



この魅力的な蚀葉遣いで立ち止たっお振り返りたす぀たり、䞊向き。 芁玄するず、遺䌝的アルゎリズムは次のようになりたす。



遺䌝的アルゎリズムの個々の圢匏で問題の解決策を衚珟するこずを孊ぶ-特定のアルファベット䞊の固定長のリスト。 その埌、フィットネス関数を遞択したす。これにより、個人を評䟡し、れロ䞖代をランダムに生成できたす。 ここで、自由な愛のサむクルが始たりたすこれらのデヌタペアに埓っお圢成された䞖代の個人のフィットネスが蚈算され敗者は捚おられ、アルファオスは1ペアに限定されたせん、残りの仲間は、2人の子䟛を産み突然倉異も付加されたす、自分自身に手を眮きたす。 これは、遞択したものが芋぀かるか、倉曎が私たちを喜ばせるのをやめるか、すべおに飜きるたで続きたす。 さお、どうすればシェムカなしで行うこずができたす





パヌト2 Robocodeボットの画像における遺䌝的アルゎリズムの圹割。



最初の郚分が匕きずり蟌たれたものは、私たち党員が疲れたので、繰り返しはしたせん。 䞀郚の実装機胜も省略しおいたす。

Robocodeに぀いおは、 habrahabr.ru / blogs / programmers_games / 59784で確認できたす写真は倱われおいたす。 ぀たり、これはもずもずJava蚀語の機胜を孊習するために䜜成されたプログラミングゲヌムであり、参加者は独自のロボットボットを䜜成し、ロボットボット間の戊いを手配するこずができたす。 各参加者はJavaでコヌドを蚘述したす。Javaは小さな戊車を制埡し、他の戊車ず戊いたす。



私たちは次のタスクに盎面しおいたす遺䌝的アルゎリズムを䜿甚した自動化されたボットタンク制埡システムの開発。 ロボットは自動的に䜜成および倉曎する必芁がありたす。 進化の過皋で、1察1の戊闘で特定の事前に遞択された敵に「適応」したす。



問題の解決策を個人ずしお提瀺する方法



たず、タンクの胜力を決定したす。 ロボットが戊闘䞭に実行できる基本アクションのリストは、銃を回す、䜓を回転させる、撃぀、移動するずいう4぀のポむントに制限されおいたす。 5番目のアクションであるレヌダヌの回転は、考慮から陀倖し、些现なこずに気付きたした-䞀定の回転したがっお、タンクには垞に敵の䜍眮に関する関連情報がありたす。



明らかに、戊闘を成功させるために、これらのアクションはランダムに実行されるべきではなく、戊堎の状況状態、぀たり戊車の䜍眮、速床、゚ネルギヌ、その他のパラメヌタヌに䟝存したす。 したがっお、戊車の制埡プロセスは、戊闘の状態に基づいお䞊蚘のアクションを実行するこずになりたす。 戊堎の状況に基づいお戊車の動䜜アクションを決定する法則は、制埡機胜ず呌ばれ、遺䌝的アルゎリズムの機胜になりたす。



制埡関数は4぀の倀砲匟゚ネルギヌ、砲塔回転角、船䜓回転角、戊車の動きを返す必芁があるため、前の郚分で説明したように、4぀の匏で構成されたす。 4぀の行/朚。



コヌディングテヌブルを䜜成するには、䞀連の基本的な関数、倉数、および定数を決定する必芁がありたす。



機胜

+x、y= x + y

++x、y、z= x + y + z

nx= -x

*x、y= x * y

**x、y= x * y * z

minx、y= x> y yx

sx= 1 /1 + exp-x

ifx、y、z、w= x> y zw



倉数

x、y-察戊車の戊車の盞察座暙。

drは、タンクに「到達する」ために残された距離です。

trは戊車を回すために残された角床です。

wは、戊車からフィヌルドの端たでの距離です。

dhは、敵の戊車の方向ず戊車の倧砲の間の角床です。

GH-戊車の倧砲の回転角。

hは敵の戊車の移動方向です。

dは、戊車ず敵の戊車の間の距離です。

eは敵の戊車の゚ネルギヌです。

Eは戊車の゚ネルギヌです。



りェルず定数0.5、0、1、2、10



フィットネス機胜



フィットネス関数が遞択された方法を説明したしょう。 戊闘「Robocode」の結果は、倚くのニュアンスに基づいお圢成されたす。 これは、勝利の数だけでなく、アクティビティ、サバむバル、察戊盞手のヒットなど、あらゆる皮類のポむントです。 その結果、「Robocode」はパラメヌタヌ「合蚈スコア」でロボットをランク付けしたす。このパラメヌタヌでは、䞊蚘のすべおの埮劙な点が考慮されたす。 個人のフィットネスを蚈算するずきに䜿甚したす。合蚈フィットネスは、䞡方のタンクの合蚈ポむントにおけるタンクのポむントの割合に等しく、0〜100の倀を取りたす。したがっお、フィットネス倀が50を超える堎合、ロボットはしたがっお、ラむバルは圌よりも匷いです。 このようなカりントシステムによれば、最初の堎所は、ほずんどのラりンドで勝った人が垞に占めおいるわけではないこずに泚意しおください。 さお、ここではスクヌタヌに぀いおのフレヌズで肩をすくめたす。クリ゚ヌタヌが基準を定矩し、それに埓っおいたす。



䞀般的に、個人のフィットネスの蚈算には䞀連の戊いが含たれたす ぀たり フィットネスの誀算ずしお、このような䞀芋取るに足りない点は、タンバリンずのそのようなダンスで構成されおいたす。

1私たちのシステムは、個人の゚ンコヌドされた染色䜓をchromosome.datファむルに保存したす。

2個人ごずに、Robocode環境が起動し、デュ゚ルが開催されたす。 圌女の意芋には、戊闘の状態を説明する.battle圢匏のファむルを送信したす。戊車のリスト、戊堎のサむズ、ラりンド数などです。

3戊闘の堎合、Robocodeは戊車をロヌドし、ロボットシェルぱンコヌドされた動䜜でChromome.datファむルを読み取り、それを䞀連のアクションに解釈し、それらに埓っお戊いたす。

4詊合の終わりに、Robocode環境は戊闘の結果をresults.txtファむルに曞き蟌み、䜜業を終了したす。

5システムはこのファむルを遞択し、戊車ず察戊盞手の合蚈スコアを解析しお抜出したす。 単玔な算術により、フィットネスの倀を取埗したす。



圌らのようにね



蚭蚈局を芁玄したす。 私たちのシステムは2぀の郚分プログラムで構成されおいたす。 そのうちの最初は、遺䌝的アルゎリズムに基づいお、個人を収集し、文字列のセットずしお保存し、2番目ロボットコヌドはそれを解釈し匏ツリヌに凊理、タンクを制埡したす再垰的トラバヌサル、぀たり珟圚の状態によっお特定の倉数の匏ツリヌの倀を蚈算したすバトル。 最初のプログラムはSIで蚘述され、2番目のプログラムはJavaで蚘述されおいたす。



遺䌝的アルゎリズムを実装する際、人口の個䜓数は5125ペア+゚リヌト個䜓1人に等しく遞択されたした。 進化の1ステップ人口の倉化には玄12分かかりたす。したがっお、合蚈で数時間、ケヌスが匕きずられたす。



その結果、WallsずCrazyロボットの察戊盞手を䜜成した結果を瀺したす。





最初のケヌスでは、70歳のフィットネスの個人の1人に到達した埌にプロセスを停止したした。2番目のケヌスでは、䞖代の個人の平均フィットネスが50を超えるのに十分でした。



熟考埌、アルコヌルで目をすすぐ



誰かが混血を䌁おるこずからの痙攣で血の涙を泣くこずを恐れおいない堎合特に、髪はロボットコヌドから動き始めたす-私たちはJavaずの盞互憎悪を持っおいたす、このプロゞェクトの゜ヌスを添付したす 。 Robocode 1.7.2.2を䜿甚しお、Linux最埌のubuntで開発およびテストされたした。 ロボットの名前はハルクです犠牲者は突然倉異であるため。 圌はreadmeを䜿甚しお残りを教えおくれたす。



最埌に、科孊的な無知ず駄排萜をおaびしたす。子䟛の頃、ナむトスタンドから萜ちたした。 私は圌らが私を捕たえお船に乗せ、ノォルガに沿っお行かせるこずを垞に恐れおいたす。 芋回す



upd䞊蚘の方法は、最も単玔で最も原始的な方法です。 構築されたロボットが実際のロボコヌドの戊いで真に競争力を持぀ためには、長いファむル操䜜が必芁です基本的な芁玠関数、倉数、定数、確率、亀差の方法、遞択、突然倉異の慎重な遞択...各オプションを評䟡する適切な時間 したがっお、コメントには、ボットを改善するための合理的な提案があり、誰でもそれを行うこずができたす。



All Articles