遺伝的アルゴリズム(GA) と遺伝的プログラミング(GP) は興味深い研究分野です。
GA/GP を使用して解決した具体的な問題と、独自のライブラリ/フレームワークを作成しなかった場合に使用したライブラリ/フレームワークについて知りたいです。
質問:
- GA/GP を使用してどのような問題を解決しましたか?
- どのライブラリ/フレームワークを使用しましたか?
私は直接の経験を探しているので、そうでない限り答えないでください.
遺伝的アルゴリズム(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 をニューラル ネットワークと組み合わせると、一般的な問題の近似解を見つける関数を見つける非常に優れた方法が得られます。ニューラルネットを使用しているため、他の入力が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
2004 年 1 月、私は Philips New Display Technologies から連絡を受けました。同社は史上初の商用電子インクである Sony Librie の電子機器を作成していました。Sony Librie は、Amazon Kindle や他の製品が米国で市場に出る何年も前に、日本でのみリリースされました。ヨーロッパ。
フィリップスのエンジニアは大きな問題を抱えていました。製品が市場に出る数か月前に、ページを切り替えると画面にまだゴーストが発生していました。問題は、静電場を作り出していた 200 のドライバーでした。これらのドライバーのそれぞれには、0 から 1000 mV までの適切な値に設定する必要がある特定の電圧がありました。しかし、そのうちの 1 つを変更すると、すべてが変更されます。
したがって、各ドライバーの電圧を個別に最適化することは問題外でした。値の可能な組み合わせの数は数十億で、特殊なカメラが 1 つの組み合わせを評価するのに約 1 分かかりました。エンジニアは多くの標準的な最適化手法を試しましたが、それに近づくものはありませんでした。
ヘッド エンジニアから連絡があったのは、私が以前に遺伝的プログラミング ライブラリをオープンソース コミュニティにリリースしたことがあったからです。彼は、GP/GA が役立つかどうか、私が関与できるかどうかを尋ねました。私はそうしました。約 1 か月間、私は合成データに関する GA ライブラリの作成と調整を行い、彼はそれをシステムに統合しました。それから、ある週末、彼らはそれを本物で稼働させました。
次の月曜日、私は彼とそのハードウェア設計者から、GA が発見した驚くべき結果を誰も信じられないという熱烈なメールを受け取りました。これでした。その年の後半に、製品が市場に出ました。
私はそれに対して1セントも支払われませんでしたが、「自慢する」権利はありました. 最初からすでに予算をオーバーしているとのことでしたので、取り掛かる前から内容はわかっていました。そして、それは GA のアプリケーションにとって素晴らしい話です。:)
結婚披露宴での座席割り当てを最適化するために GA を使用しました。10テーブルに80名様。評価関数は、日付を保持し、共通点を持つ人々をまとめ、極端に反対の意見を持つ人々を別のテーブルに配置することに基づいていました。
私はそれを数回実行しました。毎回、私は 9 つの良いテーブルを手に入れました。結局、妻が座席指定をしました。
私の巡回セールスマン オプティマイザーは、染色体から旅程への斬新なマッピングを使用しました。これにより、無効なツアーを生成するリスクなしに、染色体の交配と突然変異を簡単に行うことができました。
更新:数人が方法を尋ねたので...
アルファベット順など、任意だが一貫した順序でゲスト (または都市) の配列から始めます。これを参照ソリューションと呼びます。ゲストのインデックスを座席番号と考えてください。
この順序付けを染色体に直接エンコードしようとする代わりに、参照ソリューションを新しいソリューションに変換するための指示をエンコードします。具体的には、交換する配列内のインデックスのリストとして染色体を扱います。染色体を解読するには、参照ソリューションから始めて、染色体によって示されるすべてのスワップを適用します。配列内の 2 つのエントリを交換すると、常に有効な解決策が得られます。すべてのゲスト (または都市) が 1 回だけ表示されます。
したがって、染色体はランダムに生成、突然変異、および他の染色体と交配することができ、常に有効な解を生成します。
私は遺伝的アルゴリズム (およびいくつかの関連技術) を使用して、ゴールド ファーマーが盗まれたクレジット カードを MMO の支払いに使用しないようにするリスク管理システムの最適な設定を決定しました。システムは、「既知の」値 (詐欺かどうかに関係なく) を持つ数千のトランザクションを受け取り、多くの誤検知を発生させずに不正なトランザクションを適切に識別するための最適な設定の組み合わせを見つけ出します。
トランザクションの数十の (ブール値) 特性に関するデータがあり、それぞれに値が与えられ、合計されました。合計がしきい値よりも高かった場合、その取引は不正でした。GA は、多数のランダムな値のセットを作成し、それらを既知のデータのコーパスに対して評価し、(不正検出と誤検知の数の制限の両方で) 最高のスコアを付けたものを選択し、次に最高の少数を交配します。世代ごとに新しい世代の候補者を生み出します。一定数の世代の後、最高得点の値のセットが勝者と見なされました。
テスト対象の既知のデータのコーパスを作成することは、システムのアキレス腱でした。チャージバックを待っていた場合、詐欺師に対応しようとして数か月遅れていたため、大量のトランザクションを手動で確認して、それほど長く待たずにデータのコーパスを構築する必要がありました.
これにより、入ってきた詐欺の大部分を特定することができましたが、最も詐欺が発生しやすいアイテムで 1% を下回ることはできませんでした (着信トランザクションの 90% が詐欺である可能性があることを考えると、それはかなりうまくいっています)。
これはすべてperlを使用して行いました。かなり古い Linux ボックスでソフトウェアを 1 回実行すると、実行に 1 ~ 2 時間かかります (WAN リンク経由でデータをロードするのに 20 分、残りの時間は処理に費やされます)。特定の世代のサイズは、使用可能な RAM によって制限されていました。パラメータを少し変更して何度も実行し、特に優れた結果セットを探しました。
全体として、何十もの不正指標の相対値を手動で微調整しようとする際に発生したいくつかの失敗を回避し、手動で作成できるよりも優れたソリューションを一貫して思いつきました。私の知る限り、それはまだ使用されています(私が書いてから約3年後)。
サッカーのチップ。私は、AFL(Aussie Rules Football)での試合の週ごとの結果を予測するGAシステムを構築しました。
数年前、私は標準的な仕事用のサッカープールに飽きてしまいました。誰もがオンラインに接続して、マスコミの専門家から選んだものを選んでいました。だから、放送ジャーナリズムの専攻を打ち負かすのはそれほど難しいことではないと思いましたよね?私の最初の考えは、マッセイレーティングの結果を取得し、シーズンの終わりに名声と栄光を勝ち取った後の私の戦略を明らかにすることでした。しかし、私が発見したことがない理由で、マッセイはAFLを追跡していません。私の皮肉なことに、それは各AFLゲームの結果が基本的にランダムなチャンスになっているためだと信じていますが、最近のルール変更に関する私の不満は別のフォーラムに属しています。
システムは基本的に、攻撃力、防御力、ホームフィールドアドバンテージ、週ごとの改善(またはその欠如)、およびこれらのそれぞれの変化の速度を考慮しました。これにより、シーズン中の各チームの一連の多項式が作成されました。特定の日付の各試合の勝者とスコアを計算できます。目標は、過去のすべてのゲームの結果に最も近い係数のセットを見つけ、そのセットを使用して次の週のゲームを予測することでした。
実際には、システムは過去のゲーム結果の90%以上を正確に予測するソリューションを見つけます。次に、次の週(つまり、トレーニングセットに含まれていない週)のゲームの約60〜80%を正常に選択します。
結果:パックの真ん中のすぐ上。大きな賞金も、ベガスを倒すために使用できるシステムもありません。でも楽しかったです。
フレームワークを使用せずに、すべてをゼロから構築しました。
巡回セールスマンや、 Roger Alsing の Mona Lisa プログラムのバリエーションなど、いくつかの一般的な問題と同様に、進化型数独ソルバーも作成しました(これには、単に再実装するのではなく、もう少し独創的な考えが必要でした)。誰かのアイデアです)。数独を解くためのより信頼性の高いアルゴリズムがありますが、進化的アプローチはかなりうまく機能します。
ここ数日、私はReddit でこの記事を見た後、ポーカーの「コールド デッキ」を見つけるための進化的プログラムをいじっていました。現時点では十分ではありませんが、改善できると思います。
進化的アルゴリズムに使用する独自のフレームワークがあります。
私は、1992年に会社が貨物業界向けに開発した3Dレーザー表面プロファイルシステム用の自作GAを開発しました。このシステムは、3次元三角測量に依存し、カスタムレーザーラインスキャナー、512x512カメラ(カスタムキャプチャhw付き)を使用しました。カメラとレーザーの間の距離が正確になることは決してなく、カメラの焦点は、期待した256,256の位置に見つかりませんでした。
標準のジオメトリとシミュレーテッドアニーリングスタイルの方程式の解法を使用してキャリブレーションパラメータを試してみるのは悪夢でした。
遺伝的アルゴリズムは夕方に作成され、テスト用のキャリブレーションキューブを作成しました。私は立方体の寸法を高精度で知っていたので、私のGAは、生産のばらつきを克服するために、各スキャンユニットのカスタム三角測量パラメーターのセットを進化させることができるという考えでした。
トリックは御馳走を働いた。控えめに言っても私はびっくりしました!約10世代以内に、私の「仮想」キューブ(rawスキャンから生成され、キャリブレーションパラメーターから再作成された)は実際にはキューブのように見えました。約50世代後、必要なキャリブレーションが行われました。
家の塗装を計画しているときに、正確な色の組み合わせを見つけるのは難しいことがよくあります。多くの場合、いくつかの色を念頭に置いていますが、それは色の 1 つではなく、ベンダーが示しています。
昨日、GA 研究者である私の教授がドイツでの実話について言及しました (申し訳ありませんが、これ以上の参照はありません。はい、誰かが要求すれば見つけることができます)。この男(彼をカラーガイと呼びましょう)は、顧客が考えていたもののクローゼットとなる正確なカラーコード( RGB )を人々が見つけるのを助けるためにドアからドアまで行きました。彼がそれを行う方法は次のとおりです。
カラー ガイは、GA を使用するソフトウェア プログラムを持ち歩いていました。彼は 4 つの異なる色から始めていました。それぞれがコード化された染色体 (デコードされた値は RGB 値になります) としてコード化されています。消費者は 4 つの色から 1 つを選びます (自分が考えている色に最も近い色)。次に、プログラムはその個人に最大の適応度を割り当て、突然変異/交叉を使用して次の世代に移動します。上記の手順は、消費者が正確な色を見つけるまで繰り返され、カラー ガイは RGB の組み合わせを伝えていました。
カラーガイのプログラムは、消費者が念頭に置いている色に近い色に最大の適合度を割り当てることで、消費者が正確に念頭に置いている色に収束する可能性を高めています。私はそれがかなり楽しいと思いました!
これで -1 を獲得しました。さらに -1 を計画している場合は、よろしくお願いします。その理由を解明せよ!
数週間前、私はグラフレイアウトの問題を解決するために遺伝的アルゴリズムを使用したSOの解決策を提案しました。これは、制約付き最適化問題の例です。
また、機械学習の分野では、GAベースの分類ルールフレームワークをc /c++で最初から実装しました。また、有名なバックプロパゲーションアルゴリズムを使用するのではなく、人工ニューラルネットワーク(ANN)
をトレーニングするためのサンプルプロジェクトでGAを使用しました。
さらに、大学院の研究の一環として、EMベースのバウムウェルチアルゴリズム(再びc / c ++)への追加のアプローチとして隠れマルコフモデルのトレーニングにGAを使用しました。
CompSci の学士課程の一環として、Jikes 研究用仮想マシンに最適な jvm フラグを見つける問題が割り当てられました。これは、時間をコンソールに返す Dicappo ベンチマーク スイートを使用して評価されました。これらのフラグを切り替えてベンチマーク スイートのランタイムを改善する分散型の遺伝的アルゴリズムを作成しましたが、結果に影響を与えるハードウェア ジッタを補正するために実行に数日かかりました。唯一の問題は、コンパイラの理論 (課題の意図) について正しく学習していなかったことです。
既存のデフォルト フラグを使用して初期集団をシードすることもできましたが、興味深いのは、アルゴリズムが O3 最適化レベルと非常によく似た構成を検出したことです (ただし、実際には多くのテストでより高速でした)。
編集:また、割り当てのためにPythonで独自の遺伝的アルゴリズムフレームワークを作成し、popenコマンドを使用してさまざまなベンチマークを実行しましたが、評価された割り当てでない場合はpyEvolveを見ていました。
まず、ジョナサン・コザ(アマゾン)による「遺伝的プログラミング」は、多くの例を含む、遺伝的および進化的アルゴリズム/プログラミング技術に関する本です。ぜひチェックしてみてください。
私自身の遺伝的アルゴリズムの使用に関しては、(自家栽培の)遺伝的アルゴリズムを使用して、オブジェクトの収集/破壊シナリオのスウォームアルゴリズムを進化させました(実用的な目的は地雷原をクリアすることであった可能性があります)。これが論文へのリンクです。私がしたことの最も興味深い部分は、多段階の適応度関数でした。これは、単純な適応度関数では、集団のメンバーを十分に区別するための遺伝的アルゴリズムに十分な情報が提供されなかったため、必要でした。
私は、既存のプログラムのバグを自動的に修正するための進化的計算(EC)の使用を調査しているチームの一員です。実世界のソフトウェアプロジェクトの多くの実際のバグを正常に修復しました(このプロジェクトのホームページを参照してください)。
このEC修復技術には2つの用途があります。
最初の(プロジェクトページから入手できるコードと複製情報)は、既存のCプログラムから解析された抽象構文木を進化させ、独自のカスタムECエンジンを使用してOcamlに実装されます。
2番目(プロジェクトページから入手できるコードと複製情報)は、プロジェクトへの私の個人的な貢献であり、多くのプログラミング言語で記述されたプログラムからコンパイルされたx86アセンブリまたはJavaバイトコードを進化させます。このアプリケーションはClojureに実装されており、独自のカスタムビルドECエンジンも使用しています。
進化的計算の優れた点の1つは、テクニックが単純なため、それほど困難を伴わずに独自のカスタム実装を作成できることです。遺伝的プログラミングに関する無料で入手できる優れた入門テキストについては、遺伝的プログラミングのフィールドガイドを参照してください。
同僚と私は、会社が必要とするさまざまな基準を使用して貨物をトラックに積み込むためのソリューションに取り組んでいます。私は遺伝的アルゴリズムのソリューションに取り組んでいますが、彼は積極的な枝刈りを伴うブランチ アンド バウンドを使用しています。私たちはまだこのソリューションを実装する過程にありますが、これまでのところ良い結果を得ています.
数年前、私は ga を使用して asr (自動音声認識) 文法を最適化し、認識率を向上させました。私はかなり単純な選択肢のリストから始め (ga は各スロットで可能な用語の組み合わせをテストしていました)、よりオープンで複雑な文法へと進んでいきました。適合性は、一種の音声距離関数の下で用語/シーケンス間の分離を測定することによって決定されました。私はまた、よりコンパクトな表現にコンパイルされたものを見つけるために、文法上で弱く等価なバリエーションを作成することを実験しました (最終的に直接アルゴリズムを使用し、アプリケーションで使用できる「言語」のサイズを大幅に増加させました)。 .
最近では、さまざまなアルゴリズムから生成されたソリューションの品質をテストするためのデフォルトの仮説としてそれらを使用しています。これには、主に分類とさまざまな種類のフィッティングの問題が含まれます (つまり、レビュアーがデータセットに対して行った一連の選択を説明する「ルール」を作成します)。
私はかつてGAを使用してメモリアドレスのハッシュ関数を最適化しました。アドレスは4Kまたは8Kのページサイズであったため、アドレスのビットパターンである程度の予測可能性を示しました(最下位ビットはすべてゼロ、中間ビットは定期的にインクリメントするなど)。元のハッシュ関数は「チャンキー」でした。ヒットをクラスター化する傾向がありました。 3つおきのハッシュバケット。改善されたアルゴリズムは、ほぼ完全な分布を持っていました。
再生中の音楽の周波数スペクトルから有用なパターンを抽出するための単純な GA を作成しました。出力は、winamp プラグインでグラフィック効果を駆動するために使用されました。
スペクトルのさまざまな部分とさまざまな BPM 制限に合わせていくつかの GA を調整したため、同じパターンに収束する傾向はありませんでした。各母集団の上位 4 つの出力がレンダリング エンジンに送信されました。
興味深い副次的な効果は、母集団全体の平均フィットネスが音楽の変化の良い指標であるということでしたが、それを理解するのに通常 4 ~ 5 秒かかりました。
多くの問題を解決するために、「GALAB」という名前の完全な GA フレームワークを作成しました。
私の論文の一部として、私は多目的最適化アルゴリズムmPOEMS(進化した改善ステップを伴う多目的プロトタイプ最適化)の汎用Javaフレームワークを作成しました。これは、進化的概念を使用したGAです。これは、すべての問題に依存しない部分が問題に依存する部分から分離されているという点で一般的であり、問題に依存する部分を追加するだけでフレームワークを使用するためのインターフェースが提供されます。したがって、アルゴリズムを使用したい人はゼロから始める必要はなく、それは仕事を大いに促進します。
ここでコードを見つけることができます。
このアルゴリズムで見つけることができるソリューションは、最先端のアルゴリズムSPEA-2およびNSGAを使用した科学的研究で比較されており、メトリックに応じて、アルゴリズムのパフォーマンスが同等またはそれ以上であることが証明されています。パフォーマンスを測定するために、特にあなたが探している最適化問題に応じて。
ここで見つけることができます。
また、私の論文とプルーフオブワークの一部として、ポートフォリオ管理で見つかったプロジェクト選択の問題にこのフレームワークを適用しました。それは、会社に最大の価値を付加する、会社のほとんどの戦略をサポートする、またはその他の任意の目標をサポートするプロジェクトを選択することです。たとえば、特定のカテゴリからの特定の数のプロジェクトの選択、またはプロジェクトの相乗効果の最大化、...
このフレームワークをプロジェクト選択の問題に適用する私の論文: http ://www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf
その後、私はフォーチュン500の1つでポートフォリオ管理部門に勤務し、プロジェクト選択の問題/ポートフォリオの最適化にもGAを適用する商用ソフトウェアを使用しました。
その他のリソース:
フレームワークのドキュメント:http: //thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf
mPOEMSプレゼンテーションペーパー: http ://portal.acm.org/citation.cfm?id = 1792634.1792653
実際、少しの熱意で、誰もが汎用フレームワークのコードを任意の多目的最適化問題に簡単に適応させることができました。
単純な遺伝的アルゴリズムを使用して、バイナリ文字列として表される波の信号対雑音比を最適化しました。数百万世代にわたって特定の方法でビットを反転することにより、その波の信号対雑音比が高くなる変換を生成することができました。アルゴリズムは「シミュレーテッド アニーリング」でも可能でしたが、この場合は使用されませんでした。本質的に、遺伝的アルゴリズムは単純であり、これは私が見たユースケースとほぼ同じくらい単純だったので、世代の作成と選択にフレームワークを使用しませんでした - ランダムシードと信号対雑音比のみ手元にある機能。
宿題が重要かどうかはわかりません...
在学中、私たちは巡回セールスマン問題を解決する独自のプログラムを開発しました。
アイデアは、いくつかの基準 (問題のマッピングの難しさ、パフォーマンスなど) で比較することであり、シミュレーテッド アニーリングなどの他の手法も使用しました。
それはかなりうまくいきましたが、「再現」段階を正しく行う方法を理解するのにしばらく時間がかかりました.目前の問題を遺伝的プログラミングに適したものにモデル化することは、私にとって最も難しい部分でした.
ニューラルネットワークなどにも手を出したので面白かったです。
「プロダクション」コードでこの種のプログラミングを使用した人がいるかどうかを知りたいです。
学校のゼミでは、音楽モードに基づいて音楽を生成するアプリケーションを開発しています。プログラムはJavaでビルドされ、出力は曲を含むMIDIファイルでした。GAの明確なアプローチを使用して音楽を生成します。このプログラムは、新しい作曲を探求するのに役立つと思います。
学部では、NERO (ニューラル ネットワークと遺伝的アルゴリズムの組み合わせ) を使用して、ゲーム内のロボットにインテリジェントな決定を行うように教えました。かっこよかったです。
職場で、次の問題がありました。M 個のタスクと N 個の DSP が与えられた場合、DSP にタスクを割り当てる最良の方法は何ですか? 「最良」は「最も負荷の高い DSP の負荷を最小化する」と定義されました。さまざまな種類のタスクがあり、さまざまな種類のタスクが割り当てられた場所に応じてパフォーマンスにさまざまな影響を与えたため、ジョブから DSP への割り当てのセットを「DNA 文字列」としてエンコードし、遺伝的アルゴリズムを使用して「繁殖」させました。私ができる最高の割り当て文字列。
それはかなりうまく機能しました(すべての可能な組み合わせを評価するという以前の方法よりもはるかに優れていました...重要な問題のサイズでは、完了するのに何年もかかったでしょう!)、唯一の問題は、それを伝える方法がないことでした.最適解に到達したかどうか。現在の「ベスト エフォート」で十分かどうかを判断するか、それよりも長く実行して改善できるかどうかを確認することしかできませんでした。
食料源と鉱山のランダム化されたグリッド地形のセットを通るロボット ナビゲーションのマルチスレッド スイング ベースのシミュレーションを開発し、ロボットの動作の最適化とロボットの染色体に最も適した遺伝子の生存を調査する遺伝的アルゴリズム ベースの戦略を開発しました。これは、各反復サイクルのチャートとマッピングを使用して行われました。
それ以来、私はさらに多くのゲーム行動を開発しました. 私が最近自分用に作成したアプリケーションの例は、英国での経路検索における巡回セールスマンの問題を解決するための遺伝的アルゴリズムで、開始とゴールの状態、および 1 つまたは複数の接続ポイント、遅延、キャンセル、建設工事、ラッシュアワー、パブリック ストライキ、最速ルートと最安ルートの検討。次に、特定の日に取るルートのバランスのとれた推奨事項を提供します。
一般的に、私の戦略は、遺伝子の POJO ベースの表現を使用してから、選択、突然変異、クロスオーバー戦略、および基準点に特定のインターフェイス実装を適用することです。私のフィットネス関数は基本的に、ヒューリスティック測定として適用する必要がある戦略と基準に基づいて非常に複雑になります。
また、遺伝的アルゴリズムをコード内の自動テストに適用することも検討しました。アルゴリズムがロジックを理解し、コード修正の推奨事項を含むバグ レポートを確認しようとする体系的な突然変異サイクルを使用します。基本的に、コードを最適化し、改善のための推奨事項を提供する方法と、新しいプログラム コードの検出を自動化する方法です。また、遺伝的アルゴリズムを他のアプリケーションの中でも特に音楽制作に適用しようとしました。
一般に、ほとんどのメタヒューリスティック/グローバル最適化戦略のような進化戦略を見つけます。最初は学習が遅いですが、ソリューションが目標状態に近づくにつれて、フィットネス関数とヒューリスティックがうまく調整されている限り、習得し始めます。検索スペース内での収束。
There was an competition on codechef.com (great site by the way, monthly programming competitions) where one was supposed to solve an unsolveable sudoku (one should come as close as possible with as few wrong collumns/rows/etc as possible).
What I would do, was to first generate a perfect sudoku and then override the fields, that have been given. From this pretty good basis on I used genetic programming to improve my solution.
I couldn't think of a deterministic approach in this case, because the sudoku was 300x300 and search would've taken too long.
私は若い頃にGAを試しました。私はPythonで次のように動作するシミュレーターを作成しました。
遺伝子はニューラルネットワークの重みをエンコードしました。
ニューラルネットワークの入力は、タッチを検出する「アンテナ」でした。高い値は非常に近いことを意味し、0は触れないことを意味します。
出力は2つの「ホイール」でした。両方の車輪が前進した場合、男は前進しました。車輪が反対方向にある場合、男は向きを変えました。出力の強さがホイールの回転速度を決定しました。
単純な迷路が生成されました。それは本当に単純でした-愚かでさえ。画面の下部にスタートがあり、上部にゴールがあり、その間に4つの壁がありました。それぞれの壁にはランダムにスペースが取られていたので、常に小道がありました。
私は最初にランダムな男(私は彼らをバグだと思っていました)を始めました。1人の男が目標に到達するか、制限時間に達するとすぐに、フィットネスが計算されました。その時のゴールまでの距離に反比例していました。
次に、それらをペアにして「繁殖」させ、次世代を生み出しました。繁殖のために選ばれる確率は、その適応度に比例していました。これは、相対的な適応度が非常に高い場合に、繰り返し繁殖することを意味する場合がありました。
彼らは「左壁を抱き締める」行動をとると思いましたが、彼らは常に最適ではない何かに従っているようでした。すべての実験で、バグはらせん状のパターンに収束しました。彼らは右側の壁に触れるまで外側に向かってらせん状になりました。彼らはそれに従い、ギャップに到達すると、(ギャップから離れて)スパイラルダウンして周りを回ります。彼らは左に270度回転し、通常はギャップに入ります。これは彼らを壁の大部分を通り抜けさせ、そしてしばしばゴールに到達させるでしょう。
私が追加した機能の1つは、個人間の関連性を追跡するために遺伝子にカラーベクトルを挿入することでした。数世代後、それらはすべて同じ色になり、より良い繁殖戦略が必要だと私に教えてくれます。
私は彼らにもっと良い戦略を開発させようとしました。私はニューラルネットを複雑にしました-メモリとすべてを追加しました。それは役に立たなかった。私はいつも同じ戦略を見ました。
100世代後にのみ組換えられる別々の遺伝子プールを持つなど、さまざまなことを試みました。しかし、何も彼らをより良い戦略に追いやることはありません。多分それは不可能でした。
もう1つの興味深い点は、時間の経過に伴うフィットネスのグラフ化です。最大フィットネスが上がる前に下がるなど、明確なパターンがありました。私は進化論の本がその可能性について話しているのを見たことがありません。
2007 年から 2009 年にかけて、データマトリックス パターンを読み取るためのソフトウェアをいくつか開発しました。多くの場合、これらのパターンは読み取りが困難であり、あらゆる種類の反射特性、ぼやけた化学的にエッチングされたマーキングなどを備えた傷のある表面にくぼんでいます。GA を使用してビジョン アルゴリズムのさまざまなパラメーターを微調整し、既知のプロパティを持つ 300 枚の画像のデータベースで最良の結果を得ました。パラメータは、解像度のダウンサンプリング、RANSAC パラメータ、浸食と拡張の量、ローパス フィルタリング半径、およびその他のいくつかです。最適化を数日間実行すると、最適化フェーズ中に表示されなかった画像のテスト セットで単純な値よりも約 20% 優れた結果が得られました。
このシステムは完全にゼロから作成されたもので、他のライブラリは使用していません。信頼できる結果が得られるのであれば、そのようなものを使用することに反対はしませんが、ライセンスの互換性とコードの移植性の問題に注意する必要があります。
少し前のことですが、ハッブル宇宙望遠鏡 (HST) の画像から宇宙線の痕跡を除去するために、事実上の画像処理カーネルを進化させるために GA をロールバックしました。標準的なアプローチは、ハッブルで複数の露出を取り、すべての画像で同じものだけを保持することです. HST 時間は非常に価値があるので、私は天文学愛好家であり、最近進化計算に関する会議に出席したので、GA を使用して単一露出をクリーンアップすることを考えました。
個体は、入力として 3x3 ピクセル領域を取り、いくつかの計算を実行し、中央のピクセルを変更するかどうか、およびどのように変更するかについての決定を生成する木の形をしていました。適合性は、出力を従来の方法でクリーンアップされた画像と比較することによって判断されました (つまり、露出を積み重ねます)。
それは実際にはある程度機能しましたが、元のアプローチを放棄することを保証するには十分ではありませんでした. 論文によって時間の制約がなければ、アルゴリズムで利用できる遺伝子パーツ ビンを拡張していたかもしれません。私はそれを大幅に改善できたと確信しています。
使用したライブラリ: 私の記憶が正しければ、天体画像データ処理と I/O には IRAF と cfitsio を使用しました。
私はかつて、遺伝的プログラミングのみに基づいて、囲碁のコンピューター プレーヤーを作ろうとしたことがあります。各プログラムは一連の動きの評価関数として扱われます。生成されたプログラムは、かなり小さい 3x4 ボードでさえ、あまり良くありませんでした。
私は Perl を使用し、すべてを自分でコーディングしました。今日は違うことをするでしょう。
The Blind Watchmakerを読んだ後、ドーキンスが時間をかけて進化できる有機体のモデルを作成するために開発したと述べたパスカル プログラムに興味を持ちました。Swarmを使って自分で書くことに興味がありました。私は彼がした派手な生き物のグラフィックスをすべて作ったわけではありませんが、私の「染色体」は、生物の生存能力に影響を与える特性を制御しました. 彼らは単純な世界に住んでいて、お互いに、そして彼らの環境に対してそれを打ち負かすことができました.
生物が生きたり死んだりするのは、部分的には偶然によるものですが、その地域の環境にどれだけ効果的に適応したか、どれだけ栄養を消費したか、どれだけ繁殖に成功したかに基づいています。それは楽しかったですが、私がオタクであることを妻に証明するものでもありました.
Evolutionary Computation Graduate Class: TopCoder Marathon Match 49: MegaParty のソリューションを開発しました。私の小さなグループは、さまざまなドメイン表現をテストし、さまざまな表現がgaの正しい答えを見つける能力にどのように影響するかをテストしていました. この問題に対して独自のコードを作成しました。
神経進化および生成および発生システム、大学院クラス: コンピュータ プレーヤーの最小最大ツリーで使用されるオセロ ゲーム ボード評価器を開発しました。プレーヤーは、ゲームの奥深くまで評価するように設定され、非常に重要なコーナーを考慮した貪欲なコンピューター プレーヤーと対戦するように訓練されました。トレーニング プレーヤーは 3 または 4 の深さを見ました (回答するには構成ファイルを確認する必要がありますが、それらは別のコンピューター上にあります)。実験の目的は、ノベルティ検索を、ゲーム ボード評価ドメインにおける従来のフィットネス ベースの検索と比較することでした。残念ながら、結果は比較的決定的ではありませんでした。ノベルティ検索と適応度ベースの検索方法の両方が解決策に達しましたが (ノベルティ検索がオセロ ドメインで使用できることを示しています)、隠しノードなしでこのドメインを解決することができました。どうやら、線形ソリューションが利用可能である場合、十分に有能なトレーナーを作成していなかったようです (そして、すぐに解決策を得ることが可能でした)。今回は、フィットネス ベースの検索の実装の方が、ノベルティ検索の実装よりも迅速にソリューションを生成したと思います。(常にそうであるとは限りません)。いずれにせよ、ニューラル ネットワークのコードには ANJI ("Another NEAT Java Implementation") を使用し、さまざまな変更を加えました。自分で書いたオセロゲーム。今回は、フィットネス ベースの検索の実装の方が、ノベルティ検索の実装よりも迅速にソリューションを生成したと思います。(常にそうであるとは限りません)。いずれにせよ、ニューラル ネットワークのコードには ANJI ("Another NEAT Java Implementation") を使用し、さまざまな変更を加えました。自分で書いたオセロゲーム。今回は、フィットネス ベースの検索の実装の方が、ノベルティ検索の実装よりも迅速にソリューションを生成したと思います。(常にそうであるとは限りません)。いずれにせよ、ニューラル ネットワークのコードには ANJI ("Another NEAT Java Implementation") を使用し、さまざまな変更を加えました。自分で書いたオセロゲーム。
私は数週間前にこの小さな楽しいドゥーダードを作りました. GA を使用して面白いインターネット画像を生成します。ちょっとばかだけど、笑うにはいい。
http://www.twitterandom.info/GAFunny/
これについてのいくつかの洞察。いくつかの mysql テーブルです。1 つは画像のリストとそのスコア (適合度) 用で、もう 1 つはサブ画像とページ上の位置用です。
サブイメージには、+size、skew、rotation、+location、+image_url などの詳細がすべて実装されているわけではありません。
人々がその画像の面白さを投票すると、次の世代まで生き残る可能性が高くなります。生き残った場合、わずかな突然変異を伴う 5 ~ 10 匹の子孫が生まれます。クロスオーバーはまだありません。