遺伝的アルゴリズム (GA)および 遺伝的プログラミング (GP)は興味深い研究分野です。
GA/GPを使用して解決した特定の問題と、独自のロールを作成しなかった場合に使用したライブラリ/フレームワークについて知りたいのですが。
質問:
私は直接の経験を探しているので、それがない限り答えないでください。
ない宿題。
プロのプログラマーとしての最初の仕事(1995年)は、S&P500先物の遺伝アルゴリズムに基づく自動取引システムを書くことでした。アプリケーションはVisual Basic 3 [!]で書かれていましたが、VB3にはクラスすらなかったので、当時私が何をしたのかわかりません。
アプリケーションは、ランダムに生成された固定長文字列の集団(「遺伝子」部分)から始まりました。各集団は、S&P500先物の分単位の価格データの特定の形状と特定の注文に対応していました(買いまたは売り)、ストップロスおよびストッププロフィットの金額。各文字列(または「遺伝子」)の利益パフォーマンスは、3年間の履歴データを実行して評価されました。指定された「形状」が履歴データと一致するたびに、対応する買い注文または売り注文を想定し、取引の結果を評価しました。各遺伝子は一定の金額で始まったため、壊れて遺伝子プールから完全に削除される可能性があるという警告を追加しました。
母集団を評価するたびに、生存者はランダムに(2つの親からのビットを混合するだけで)交配され、親として選択された遺伝子が生成する利益に比例する可能性があります。私はまた、点突然変異の可能性を少しスパイスに追加しました。この数百世代後、私は5000人を平均して約10000ドルに変えることができる遺伝子の集団になりました(もちろん履歴データで)。
残念ながら、このシステムをライブで使用する機会はありませんでした。上司は、従来の方法で取引して3か月もたたないうちに100,000ドル近くを失い、プロジェクトを続行する意欲を失いました。振り返ってみると、システムが大きな利益を生んだと思います-私が必ずしも正しいことをしているからではなく、私が作り出した遺伝子の集団がたまたま約5だけ(売り注文ではなく)買い注文に偏っているからです: 1の比率。そして、20/20後知恵で知っているように、市場は1995年以降少し上昇しました。
この小さな世界に住んでいる小さな生き物を作りました。彼らは、世界からいくつかの入力を受け取るニューラルネットワーク脳を持ち、出力は他のアクション間の動きのベクトルでした。彼らの脳は「遺伝子」でした。
プログラムは、ランダムな脳を持つ生き物のランダムな集団から始まりました。入力ニューロンと出力ニューロンは静的でしたが、間にあったものはそうではありませんでした。
環境には食物と危険が含まれていました。食べ物はエネルギーを増やし、十分なエネルギーがあれば、交尾できます。危険はエネルギーを削減し、エネルギーが0の場合、それらは死亡しました。
最終的に、クリーチャーは世界中を動き回り、食べ物を見つけて危険を回避するように進化しました。
その後、少し実験をすることにしました。クリーチャーの脳に「口」と呼ばれる出力ニューロンと「耳」と呼ばれる入力ニューロンを与えました。最初からやり直して、スペースを最大化するために進化し、それぞれのクリーチャーがそれぞれの部分に留まることに驚いた(食べ物はランダムに置かれた)。彼らはお互いに協力することを学び、お互いに邪魔されないようにしました。常に例外がありました。
それから私は何か面白いことを試みました。私は死んだ生き物が食べ物になります。何が起こったのか推測してみてください! 2種類のクリーチャーが進化しました。群れのように攻撃するクリーチャーと、回避力の高いクリーチャーです。
ここでの教訓は何ですか?コミュニケーションは協力を意味します。他の人を傷つけることで何かを得ることを意味する要素を導入するとすぐに、協力は破壊されます。
これが自由市場と資本主義のシステムにどのように反映されるのだろうか。つまり、企業が競争を傷つけ、それで逃げることができれば、彼らは競争を傷つけるために彼らの力ですべてを行うことは明らかです。
編集:
フレームワークを使用せずにC++で作成しました。自分のニューラルネットとGAコードを書きました。エリック、もっともらしいと言ってくれてありがとう。人々は通常、GA(制限は明らかですが)の力を、それで遊ぶまで信じません。 GAは単純ですが、単純ではありません。
疑いのある人にとっては、ニューラルネットが複数の層を持っている場合、あらゆる機能をシミュレートできることが証明されています。 GAは、ローカルおよび潜在的にグローバルな最小値を見つけるソリューション空間をナビゲートする非常に簡単な方法です。 GAをニューラルネットと組み合わせると、一般的な問題の近似解を見つける関数を見つける非常に良い方法があります。ニューラルネットを使用しているため、GAを使用している関数への一部の入力ではなく、一部の入力に対して関数を最適化しています
サバイバルの例のデモコードを次に示します。 http://www.mempko.com/darcs/neural/demos/eaters/ ビルド手順:
darcs clone --lazy http://www.mempko.com/darcs/neural/
cd neural
cmake .
make
cd demos/eaters
./eaters
私は結婚披露宴で座席の割り当てを最適化するためにGAを使用しました。 10テーブル以上の80名のゲスト。評価機能は、人々に日付を付け、人々に何か共通点を持たせ、極端な反対の見解を持つ人々を別々のテーブルに置くことに基づいていました。
私はそれを数回実行しました。毎回、私は9つの良いテーブルと、すべての奇妙なボールが入ったテーブルを手に入れました。最後に、妻が座席の割り当てを行いました。
私の巡回セールスマンオプティマイザーは、染色体と旅程の新しいマッピングを使用したため、無効なツアーを生成するリスクなしに染色体を繁殖および突然変異させることは簡単でした。
更新:何人かの人々がどのように尋ねたか...
アルファベット順など、任意ではあるが一貫した順序でゲスト(または都市)の配列から始めます。これを参照ソリューションと呼びます。ゲストのインデックスを座席番号と考えてください。
この順序を染色体に直接エンコードする代わりに、参照ソリューションを新しいソリューションに変換するための命令をエンコードします。具体的には、染色体を交換する配列内のインデックスのリストとして扱います。染色体をデコードするには、参照ソリューションから始めて、染色体によって示されるすべてのスワップを適用します。配列内の2つのエントリを交換すると、常に有効なソリューションが得られます。すべてのゲスト(または都市)が1回だけ表示されます。
したがって、染色体はランダムに生成され、変異され、他の染色体と交配される可能性があり、常に有効なソリューションを生成します。
2004年1月、私はフィリップスニューディスプレイテクノロジーズから連絡を受けました。フィリップスニューディスプレイテクノロジーズは、Amazon Kindleなどが米国で市場に出る数年前に、日本で初めて発売された初めての商用電子インクであるSony Librieの電子機器を開発しましたヨーロッパ。
フィリップスのエンジニアには大きな問題がありました。製品が市場に出回る数ヶ月前に、ページを変更するときに画面上でゴーストが発生していました。問題は、静電界を生成していた200個のドライバーでした。これらの各ドライバには、0〜1000 mVまたはこのような値に適切に設定する必要がある特定の電圧がありました。しかし、それらの1つを変更すると、すべてが変更されます。
そのため、各ドライバーの電圧を個別に最適化することは問題外でした。値の可能な組み合わせの数は数十億であり、特別なカメラが単一の組み合わせを評価するのに約1分かかりました。エンジニアは多くの標準的な最適化手法を試しましたが、何も近づきませんでした。
私が以前にオープンソースコミュニティに遺伝的プログラミングライブラリをリリースしていたため、ヘッドエンジニアから連絡がありました。彼は、GP/GAが役立つかどうか、そして私が関与できるかどうか尋ねました。私はそれを行い、約1か月間一緒に作業して、合成データについてGAライブラリを作成および調整し、彼はそれをシステムに統合しました。それから、ある週末、彼らはそれを本物で実行させました。
次の月曜日、私は彼と彼らのハードウェア設計者から、GAが見つけた驚くべき結果を誰も信じられないという熱烈なメールを受け取りました。これでした。その年の後半、製品は市場に出ました。
私はそれに対して1セントは支払われませんでしたが、私は「自慢する」権利を得ました。彼らは最初からすでに予算を超過していると言ったので、私はそれに取り組む前に取引が何であるかを知っていました。そして、それはGAのアプリケーションにとって素晴らしい物語です。 :)
遺伝的アルゴリズム(およびいくつかの関連技術)を使用して、金農家がMMOの支払いに盗まれたクレジットカードを使用しないようにするリスク管理システムの最適な設定を決定しました。システムは、「既知の」値(詐欺の有無)を伴う数千のトランザクションを取り込み、誤検知が多すぎることなく不正なトランザクションを適切に識別するための設定の最適な組み合わせを把握します。
トランザクションの数十(ブール)の特性に関するデータがあり、それぞれに値が与えられ、合計されました。合計がしきい値よりも高かった場合、トランザクションは詐欺でした。 GAは、多数のランダムな値のセットを作成し、既知のデータのコーパスに対してそれらを評価し、最高のスコアを付けたものを選択します(不正検出と誤検知の数の制限の両方で)。各世代から最高の少数を交配して、新世代の候補者を生み出します。一定の世代数の後、最高のスコア値セットが勝者と見なされました。
テストする既知のデータのコーパスを作成することが、システムのアキレス腱です。チャージバックを待っている場合、詐欺師に対応しようとすると数か月遅れていたため、誰かが大量のトランザクションを手動で確認して、あまり長く待たずにデータのコーパスを構築する必要がありました。
これにより、流入した詐欺の大部分を特定することができましたが、最も詐欺の起こりやすいアイテムで1%を下回ることはできませんでした(着信トランザクションの90%が詐欺である可能性があるため、非常にうまくいっています)。
これはすべてPerlを使用して行いました。かなり古いlinuxボックスでソフトウェアを1回実行すると、実行に1〜2時間かかります(WANリンクを介してデータをロードするには20分、残りの時間はクランチに費やされます)。特定の世代のサイズは、使用可能なRAMによって制限されていました。パラメーターにわずかな変更を加えて繰り返し実行し、特に良好な結果セットを探しました。
全体として、数十の不正インジケーターの相対的な値を手動で調整しようとすることで生じるいくつかの失言を回避し、手作業で作成するよりも優れたソリューションを一貫して考案しました。私の知る限り、それはまだ使用中です(私が書いてから約3年後)。
巡回セールスマンや Roger AlsingのMona Lisaプログラム のバリエーションなど、よくある問題のいくつかと同様に、 進化した数独ソルバー (誰か他の人のアイデアを再実装するだけでなく、私の側でもう少し独創的な考えをしました)。数独を解くためのより信頼性の高いアルゴリズムがありますが、進化的アプローチはかなりうまく機能します。
ここ数日、Redditで この記事 を見た後、ポーカーの「コールドデッキ」を見つけるための進化プログラムで遊んでいます。現時点では十分ではありませんが、改善できると思います。
独自のフレームワーク を進化アルゴリズムに使用しています。
サッカーのチップ。 GAシステムを構築して、AFL(Aussie Rules Football)での試合の週ごとの結果を予測しました。
数年前、私は標準的な仕事用のサッカープールに飽き飽きしました。誰もがただオンラインになり、マスコミの評論家からピックを取りました。だから、私は、放送ジャーナリズム専攻の大勢を打ち負かすのはそれほど難しいことではないと考えましたよね?最初に考えたのは、 Massey Ratings から結果を取得し、シーズンの終わりに名声と栄光を獲得した後の戦略を明らかにすることでした。ただし、MasseyがAFLを追跡しないことを発見したことはありません。私の皮肉屋は、各AFLゲームの結果が基本的にランダムなチャンスになったからだと考えていますが、最近のルール変更に関する私の苦情は別のフォーラムに属します。
システムは基本的に、攻撃の強さ、防御の強さ、ホームフィールドのアドバンテージ、週ごとの改善(またはその欠如)、およびこれらのそれぞれの変化の速度を考慮しました。これにより、季節ごとに各チームの多項式のセットが作成されました。特定の日付の各試合の勝者とスコアを計算できます。目標は、過去のすべてのゲームの結果に最も密接に一致する係数のセットを見つけ、そのセットを使用して今後数週間のゲームを予測することでした。
実際には、システムは過去のゲーム結果の90%以上を正確に予測するソリューションを見つけます。その後、次の週(つまり、トレーニングセットに含まれない週)のゲームの約60〜80%を選択できます。
結果:パックの真上です。主要な賞金も、ベガスに勝つために使用できるシステムもありません。でも楽しかったです。
フレームワークを使用せずに、すべてをゼロから構築しました。
1992年に貨物業界向けに開発した3Dレーザー表面プロファイルシステム用に自家製GAを開発しました。このシステムは3次元三角測量に依存し、カスタムレーザーラインスキャナー、512x512カメラ(カスタムキャプチャhw)。カメラとレーザーの間の距離が正確になることは決してなく、カメラの焦点は、予想される256,256の位置では見つかりませんでした!
標準のジオメトリとシミュレーテッドアニーリングスタイルの方程式の解法を使用して、キャリブレーションパラメーターを試してみるのは悪夢でした。
遺伝的アルゴリズムは夕方に完成され、私はそれをテストするためのキャリブレーションキューブを作成しました。私はキューブの寸法を高精度で知っていたため、私のGAは、生産のばらつきを克服するために、各スキャニングユニットのカスタム三角測量パラメーターのセットを進化させることができました。
トリックはうまくいきました。控えめに言っても驚いた!約10世代以内に、「仮想」キューブ(生のスキャンから生成され、キャリブレーションパラメーターから再作成された)は実際にはキューブのように見えました!約50世代後、必要なキャリブレーションがありました。
あなたの家をペイントすることを計画しているとき、しばしば正確な色の組み合わせを得るのは難しいです。多くの場合、あなたはいくつかの色を念頭に置いていますが、それは色の1つではありません、ベンダーはあなたに示しています。
昨日、GA研究者である私の教授がドイツの実話について言及しました(申し訳ありませんが、私はそれ以上の参考文献はありません。この男(彼をcolor guyと呼びましょう)は、人々が正確なカラーコードを見つけるのを助けるために戸口から行っていました( で) _ rgb _ )これは、顧客が考えていたものに最も近いクローゼットになります。彼のやり方は次のとおりです。
color guyは、GAを使用したソフトウェアプログラムを運ぶために使用されていました。彼は、4つの異なる色から始めました。それぞれの色は、コード化された染色体(デコードされた値はRGB値)としてコード化されていました。消費者は4色のうち1色を選択します(これは、自分が考えている色に最も近い色です)。次に、プログラムは最大fitnessをそのindividualに割り当てて、次に進みます次のgenerationmutation/crossoverを使用します。上記の手順は、消費者が正確な色を見つけるまで繰り返され、color guyを使用してRGBの組み合わせを伝えます!
色に最大限の適応度を割り当てることにより、消費者が念頭に置いているものに近くなり、color guyのプログラムは色に収束する機会を増やし、消費者は正確に念頭に置いています。とても楽しかった!
これで-1が得られました。さらに-1を計画している場合は、pls。そうする理由を解明してください!
私の学部のCompSci学位の一部として、Jikesの研究用仮想マシンに最適なjvmフラグを見つける問題が割り当てられました。これは、コンソールに時間を返すDicappoベンチマークスイートを使用して評価されました。結果に影響を与えるハードウェアジッタを補正するために実行するのに数日かかりましたが、これらのフラグを切り替えてベンチマークスイートのランタイムを改善する分散型ジェネティックアルゴリズムを作成しました。唯一の問題は、コンパイラ理論について適切に学習しなかったことです(これは割り当ての目的でした)。
既存のデフォルトフラグを使用して初期集団をシードすることもできましたが、興味深いのは、アルゴリズムがO3最適化レベルと非常に類似した構成を検出したことです(実際には多くのテストで高速でした)。
編集:また、割り当てのためにPythonで独自の遺伝的アルゴリズムフレームワークを作成し、popenコマンドを使用してさまざまなベンチマークを実行しましたが、評価された割り当てではない場合はpyEvolveを調べました。
数週間前、私は、遺伝的アルゴリズムを使用してグラフのレイアウトの問題を解決する solution on SO を提案しました。これは、制約付き最適化問題の例です。
また、機械学習の分野では、GAベースの分類ルールフレームワークをc/c ++でゼロから実装しました。
有名な バックプロパゲーションアルゴリズム を使用するのではなく、 人工ニューラルネットワーク (ANN)をトレーニングするためのサンプルプロジェクトでもGAを使用しました。
さらに、大学院での研究の一環として、EMベースの Baum-Welch への追加アプローチとして、トレーニング Hidden Markov Models でGAを使用しました_アルゴリズム(再びc/c ++で)。
まず、Jonathan Kozaによる「Genetic Programming」( Amazonで )は、遺伝的および進化的アルゴリズム/プログラミング技術に関する本であり、多くの例があります。私はそれをチェックすることを強くお勧めします。
私自身の遺伝的アルゴリズムの使用に関しては、(自作の)遺伝的アルゴリズムを使用して、オブジェクトの収集/破壊シナリオ用のスウォームアルゴリズムを進化させました(実際の目的は地雷原をクリアすることでした)。ここに 論文 へのリンクがあります。私がしたことの中で最も興味深い部分は、多段階のフィットネス関数でした。これは、単純なフィットネス関数では集団のメンバーを十分に区別するための遺伝的アルゴリズムに十分な情報を提供しなかったために必要でした。
私は、既存のプログラムのバグを自動的に修正するための進化計算(EC)の使用を調査しているチームの一員です。実際のソフトウェアプロジェクトの多くの実際のバグを正常に修復しました( このプロジェクトのホームページ を参照)。
このEC修復手法には2つの用途があります。
最初の(プロジェクトページで利用可能なコードと再現情報)は、既存のCプログラムから解析された抽象構文ツリーを進化させ、独自のカスタムECエンジンを使用してOcamlに実装されます。
2番目の(コードとプロジェクトページで利用可能な再現情報)、プロジェクトへの個人的な貢献により、x86アセンブリまたはプログラムからコンパイルされたJavaバイトコードが進化します多くのプログラミング言語で書かれています。このアプリケーションはClojureで実装されており、独自のカスタムビルドECエンジンも使用しています。
Evolutionary Computationの優れた点の1つは、この手法がシンプルであるため、独自のカスタム実装を簡単に作成できることです。遺伝的プログラミングに関する無料の入門テキストについては、遺伝的プログラミングのフィールドガイドを参照してください。
数年前、gaを使用してasr(自動音声認識)文法を最適化し、認識率を向上させました。かなり単純な選択肢のリストから始めました(gaは各スロットの可能な用語の組み合わせをテストしていました)。さらにオープンで複雑な文法に取り組みました。適合性は、一種の音声距離関数の下で用語/シーケンス間の分離を測定することによって決定されました。また、文法の弱く均等なバリエーションを作成して、よりコンパクトな表現にコンパイルされたものを見つけることを試みました(最終的には、直接アルゴリズムを使用し、アプリケーションで使用できる「言語」のサイズを大幅に増やしました) 。
最近では、さまざまなアルゴリズムから生成されたソリューションの品質をテストするためのデフォルトの仮説としてそれらを使用しました。これには、主に分類とさまざまな種類のフィッティングの問題が含まれます(つまり、データセットに対してレビューアが行った一連の選択を説明する「ルール」を作成します)。
同僚と私は、会社が必要とするさまざまな基準を使用して、貨物をトラックに積み込むためのソリューションに取り組んでいます。彼が積極的な枝刈りでBranch And Boundを使用している間、私は遺伝的アルゴリズムのソリューションに取り組んでいます。私たちはまだこのソリューションを実装するプロセスにありますが、これまでのところ、良い結果が得られています。
多くの問題を解決するために、「GALAB」という名前の完全なGAフレームワークを作成しました。
かつてGAを使用して、メモリアドレスのハッシュ関数を最適化しました。アドレスは4Kまたは8Kのページサイズであったため、アドレスのビットパターンである程度の予測可能性を示しました(最下位ビットはすべてゼロ、中間ビットは定期的に増加するなど)。元のハッシュ関数は「チャンキー」でした。 3つごとのハッシュバケット。改良されたアルゴリズムは、ほぼ完璧な分布を示しました。
音楽の再生中に周波数スペクトルから有用なパターンを抽出するための簡単なGAを作成しました。出力は、winampプラグインでグラフィカルエフェクトを駆動するために使用されました。
スペクトルのさまざまな部分とさまざまなBPM制限に合わせて調整されたいくつかのGAがあるため、同じパターンに収束する傾向はありませんでした。各母集団の上位4つの出力は、レンダリングエンジンに送信されました。
おもしろい副作用は、人口全体の平均的なフィットネスが音楽の変化の良い指標であるということでしたが、一般にそれを理解するのに4〜5秒かかりました。
宿題が重要かどうかわかりません...
私の研究中、私たちは巡回セールスマンの問題を解決するために独自のプログラムを展開しました。
アイデアは、いくつかの基準(問題、パフォーマンスなどのマッピングの難しさ)で比較を行うことでした。また、 シミュレーテッドアニーリング などの他の手法も使用しました。
それはかなりうまくいきましたが、「複製」フェーズを正しく行う方法を理解するのに時間がかかりました。手元の問題を遺伝的プログラミングに適したものにモデリングすることは、最も難しい部分として本当に衝撃を受けました...
ニューラルネットワークなどにも手を出したので、興味深いコースでした。
「生産」コードでこの種のプログラミングを使用した人がいるかどうかを知りたい。
職場では、次の問題がありました。M個のタスクとN個のDSPがある場合、タスクをDSPに割り当てる最良の方法は何ですか? 「最高」は「最も負荷の高いDSPの負荷を最小化する」と定義されました。さまざまなタイプのタスクがあり、さまざまなタスクタイプには割り当てられた場所に応じてさまざまなパフォーマンスの影響があったため、ジョブからDSPへの割り当てのセットを「DNA文字列」としてエンコードし、遺伝的アルゴリズムを使用して「育種」しました私ができる最高の割り当て文字列。
それはかなりうまく機能しました(可能なすべての組み合わせを評価する以前の方法よりもはるかに優れていました...些細でない問題サイズで、完了するには何年もかかっていました!)、唯一の問題は伝える方法がないということでした最適なソリューションに到達したかどうか。現在の「ベストエフォート」が十分であるかどうかを判断するか、それをより長く実行させて、より良い結果が得られるかどうかを確認することができます。
Codechef.com(ちなみに素晴らしいサイト、毎月のプログラミングコンテスト)で、解決できない数独(できる限り間違った列/行などをできるだけ避けて近づいてください)を解決することになっているコンテストがありました。
私がすることは、最初に完璧な数独を生成し、次に与えられたフィールドをオーバーライドすることでした。このかなり良い根拠から、遺伝的プログラミングを使用してソリューションを改善しました。
この場合、数独が300x300であり、検索に時間がかかりすぎたため、決定論的なアプローチを考えることができませんでした。
単純な遺伝的アルゴリズムを使用して、バイナリ文字列として表される波の信号対雑音比を最適化しました。数百万世代にわたって特定の方法でビットを反転させることにより、その波のより高い信号対雑音比をもたらす変換を生成することができました。アルゴリズムは「シミュレーテッドアニーリング」でもかまいませんが、この場合は使用されませんでした。本質的に、遺伝的アルゴリズムはシンプルであり、これは私が見たユースケースと同じくらい簡単だったので、世代の作成と選択にフレームワークを使用しませんでした-ランダムシードと信号対ノイズ比のみ手元に機能します。
食物源と地雷のランダム化されたグリッド地形のセットを介したロボットナビゲーションのマルチスレッドスイングベースのシミュレーションを開発し、ロボットの染色体の最適な遺伝子の生存とロボットの行動の最適化を探索する遺伝的アルゴリズムベースの戦略を開発しました。これは、各反復サイクルのチャートとマッピングを使用して行われました。
それ以来、私はさらに多くのゲーム動作を開発しました。私が最近自分で作成したアプリケーションの例は、開始と目標の状態、および1つまたは複数の接続ポイント、遅延、キャンセル、建設工事、ラッシュアワーを考慮に入れて、英国のルート検索で巡回セールスマンの問題を解決するための遺伝的アルゴリズムでした。公共ストライキ、最速ルートと最安ルートの検討。次に、特定の日に取るルートのバランスの取れた推奨事項を提供します。
一般に、私の戦略は、遺伝子のPOJOベースの表現を使用することです。その後、選択、突然変異、クロスオーバー戦略、および基準点に特定のインターフェイス実装を適用します。すると、私のフィットネス関数は、ヒューリスティックな尺度として適用する必要がある戦略と基準に基づいて、基本的に非常に複雑になります。
また、体系的な突然変異サイクルを使用してコード内の自動テストに遺伝的アルゴリズムを適用することを検討しました。アルゴリズムはロジックを理解し、コード修正の推奨事項を含むバグレポートを確認しようとします。基本的に、コードを最適化し、改善のための推奨事項を提供する方法と、新しいプログラムコードの検出を自動化する方法です。また、他のアプリケーションの中でも特に音楽制作に遺伝的アルゴリズムを適用しようとしました。
一般的に、私はほとんどのメタヒューリスティック/グローバル最適化戦略のような進化戦略を見つけます。最初は学習に時間がかかりますが、ソリューションが目標状態に近づくにつれて、またフィットネス関数とヒューリスティックがうまく調整されて生成されるようになると拾い始めますサーチスペース内での収束。
学校でのセミナーでは、音楽モードに基づいて音楽を生成するアプリケーションを開発します。プログラムはJavaでビルドされ、出力は曲を含むMIDIファイルでした。 GAの明確なアプローチを使用して、音楽を生成します。このプログラムは、新しい曲を探すのに役立つと思います。
学部では、NERO(ニューラルネットワークと遺伝的アルゴリズムの組み合わせ)を使用して、ゲーム内ロボットにインテリジェントな決定を下すよう指導しました。とてもクールでした。
2007-9年に、データ行列パターンを読み取るためのソフトウェアをいくつか開発しました。多くの場合、これらのパターンは読みにくく、すべての種類の反射特性、化学的にエッチングされたあいまいなマーキングなど、傷のある表面に刻まれています。 GAを使用してビジョンアルゴリズムのさまざまなパラメーターを微調整し、既知のプロパティを持つ300枚の画像のデータベースで最良の結果を出しました。パラメーターは、ダウンサンプリング解像度、RANSACパラメーター、浸食と膨張の量、ローパスフィルタリング半径などです。数日間にわたって最適化を実行すると、最適化フェーズ中に見えなかった画像のテストセットでの単純な値よりも約20%優れた結果が得られました。
このシステムは完全にゼロから作成されており、他のライブラリは使用していません。信頼できる結果が得られるならば、私はそのようなものを使うことに反対しませんが、ライセンスの互換性とコードの移植性の問題に注意する必要があります。
私はかつて、遺伝子プログラミングのみに基づいて、囲gameのゲーム用のコンピュータープレーヤーを作成しようとしました。各プログラムは、一連の動きの評価関数として扱われます。制作されたプログラムは、3x4のかなり小さなボードでも、あまり良くありませんでした。
Perlを使用し、すべてを自分でコーディングしました。今日は違うやり方をします。
The Blind Watchmaker を読んだ後、Dawkinsは、時間とともに進化する生物のモデルを作成するために開発したPascalプログラムに興味がありました。 Swarm を使用して自分で書くことに興味がありました。私は彼が行った派手な生き物のグラフィックスをすべて作成しませんでしたが、私の「染色体」は生物の生存能力に影響する特性を制御しました。彼らはシンプルな世界に住んでいて、お互いや彼らの環境に打ち勝つことができました。
生物は偶然に生きたり死んだりしましたが、地元の環境にどれだけ効果的に適応したか、栄養素をどれだけうまく摂取したか、どのようにうまく繁殖したかに基づいています。それは楽しかったが、私がオタクであることを妻に証明した。
私は青春にGAを試しました。私はPythonで次のように動作するシミュレータを作成しました。
遺伝子は、ニューラルネットワークの重みをエンコードしました。
ニューラルネットワークの入力は、タッチを検出する「アンテナ」でした。値が大きいほど非常に近く、0は触れないことを意味します。
出力は2つの「ホイール」に対してでした。両方の車輪が前進した場合、男は前進しました。車輪が反対方向にあった場合、男は向きを変えた。出力の強さがホイールの回転速度を決定しました。
単純な迷路が生成されました。それは本当に簡単でした-バカでさえ。画面の下部に開始点があり、上部にゴールがあり、間に4つの壁がありました。各壁にはランダムにスペースが取られていたため、常にパスがありました。
最初はランダムな人(バグだと思っていました)を始めました。 1人の男が目標に到達するか、時間制限に達するとすぐに、フィットネスが計算されました。その時のゴールまでの距離に反比例していました。
それから私はそれらをペアにし、「繁殖」させて次世代を創造しました。繁殖するように選択される確率は、その適応度に比例しました。時々、これは、非常に高い相対的適応度を持っていれば、自分自身と繰り返し交配されることを意味しました。
私は彼らが「左の壁を抱き締める」行動を起こすと思ったが、彼らは常にあまり最適ではない何かに従うように見えた。すべての実験で、バグはスパイラルパターンに収束しました。彼らは右の壁に触れるまで外側にらせん状になります。彼らはそれに従い、ギャップに到達すると、(ギャップから離れて)スパイラルダウンして周りを回ります。彼らは270度左に曲がり、通常は隙間に入ります。これは、壁の大部分を通過し、多くの場合目標に到達します。
私が追加した機能の1つは、色ベクトルを遺伝子に挿入して、個人間の関連性を追跡することでした。数世代後、それらはすべて同じ色になっていたので、より良い育種戦略が必要だとわかりました。
私は彼らにもっと良い戦略を立てさせようとしました。私はニューラルネットを複雑にしました-メモリとすべてを追加しました。助けにはなりませんでした。私はいつも同じ戦略を見ました。
私は、100世代後にしか組換えられない別々の遺伝子プールを持つなど、さまざまなことを試しました。しかし、何も彼らをより良い戦略に押しやることはありません。多分それは不可能だった。
別の興味深いことは、時間の経過に伴うフィットネスのグラフ化です。最大のフィットネスが上昇する前に低下するなど、明確なパターンがありました。進化の本がその可能性について語るのを見たことがありません。
少し前のことですが、ハッブル宇宙望遠鏡(HST)画像から宇宙線の痕跡を取り除くために、実際に画像処理カーネルにあったものを進化させるためにGAを転がしました。標準的なアプローチは、ハッブルで複数の露出を取り、すべての画像で同じものだけを保持することです。 HST時間は非常に貴重であるため、私は天文学者であり、最近進化計算会議に出席したので、GAを使用して単一の露出をクリーンアップすることを考えました。
個人は、入力として3x3ピクセルの領域を取り、いくつかの計算を実行し、中心ピクセルを変更するかどうか、およびどのように変更するかについて決定を下したツリーの形でした。フィットネスは、出力を従来の方法(つまり、露出を重ねる)でクリーンアップされた画像と比較することで判断されました。
それは実際には一種の働きをしましたが、元のアプローチを先に進めることを保証するのに十分ではありませんでした。論文で時間の制約を受けていなかった場合、アルゴリズムで利用できる遺伝的部分のビンを拡張した可能性があります。大幅に改善できたと確信しています。
使用するライブラリ:天文画像データ処理とI/OのIRAFとcfitsioを正しく思い出せば。
私の学部論文では、遺伝的プログラミングを使用して、空中捜索と救助に使用される協調的探索戦略を開発しました。 NetLogo(StarLogoベース)と呼ばれるオープンソースエージェントモデリングプラットフォームを世界モデルとして使用しました。 NetLogoはJavaで記述されているため、Java APIを提供します。したがって、GPフレームワークはJavaに基づいている必要があります-私が使用したものはJGAPと呼ばれますJavaの別のオープンソースGPフレームワークは、ECJと呼ばれることを知っています。
シミュレーションの実行は非常に遅かった(これはNetLogoモデルによるものだと思う)ので、私の機能/端末セットは非常に制限され、検索スペースが制限されていました。それにもかかわらず、いくつかの良い解決策を思いつきました。衝動を感じたら、私の論文の第3章でそれについて読むことができます http://www.cse.unsw.edu.au/~ekjo014/z3157867_Thesis.pdf
私は数週間前にこのちょっとした楽しみを作りました。 GAを使用して面白いインターネット画像を生成します。ちょっと馬鹿げているが、笑いにはいい。
http://www.twitterandom.info/GAFunny/
これに関するいくつかの洞察。いくつかのmysqlテーブルです。 1つは画像のリストとそのスコア(フィットネス)で、もう1つはサブ画像とページ上の位置です。
サブイメージには、いくつかの詳細を含めることができますが、すべて実装されているわけではありません:+サイズ、スキュー、回転、+ロケーション、+ image_url。
画像がどれほど面白いかについて人々が投票すると、多かれ少なかれ次の世代に生き残る可能性が高くなります。それが生き残った場合、わずかな変異を伴う5〜10匹の子孫が生まれます。クロスオーバーはまだありません。
進化的計算大学院クラス:TopCoder Marathon Match 49:MegaPartyのソリューションを開発しました。私の小さなグループは、異なるドメイン表現をテストし、異なる表現がgaの正しい答えを見つける能力にどのように影響するかをテストしていました。この問題のために独自のコードを展開しました。
神経進化および生成と発達のシステム、大学院クラス:コンピュータープレーヤーの最小-最大ツリーで使用されるオセロゲームボードエバリュエーターを開発しました。プレーヤーは、ゲームの1深さを評価するように設定され、非常に重要なコーナーを考慮した貪欲なコンピュータープレーヤーと対戦するように訓練されました。トレーニングプレーヤーの深さは3または4でした(応答するには構成ファイルを確認する必要があり、それらは別のコンピューター上にあります)。この実験の目標は、ノベルティ検索とゲームボード評価ドメインの従来のフィットネスベースの検索を比較することでした。結果は、残念ながら比較的決定的ではありませんでした。ノベルティ検索とフィットネスベースの検索方法の両方が解決策になりましたが(ノベルティ検索はOthelloドメインで使用できることを示しています)、非表示のノードなしでこのドメインの解決策を持つことができました。どうやら、線形ソリューションが利用可能な場合、十分な能力のあるトレーナーを作成しなかったようです(そして、すぐにソリューションを使用できるようになりました)。今回のFitnessベースの検索の実装は、ノベルティ検索の実装よりも迅速にソリューションを生み出したと思います。 (これは常にそうとは限りません)。いずれにせよ、ニューラルネットワークコードにANJI「Another NEAT Java Implementation」を使用し、さまざまな変更を加えました。自分で書いたオセロゲーム。