遺伝的アルゴリズム/遺伝的プログラミングソリューションの良い例は何ですか?[閉まっている]


227

遺伝的アルゴリズム(GA)と遺伝的プログラミング(GP)は興味深い研究分野です。

GA / GPを使用して解決した特定の問題と、独自にロールしなかった場合に使用したライブラリ/フレームワークについて教えてください。

質問:

  • GA / GPを使用してどのような問題を解決しましたか?
  • どのライブラリ/フレームワークを使用しましたか?

直接の体験を探していますので、それがない限り答えないでください。


28
@ジェイソン:Googleのことを提案してくれてありがとう。それはいくらか有用であるように見えますが、GA / GPの経験を持つSOユーザーを具体的に扱っているため、この質問にどのように答えることができるかはわかりません。
knorv 2009年


13
「私たちは答えが...特定の専門知識によってサポートされることを期待しています...」チェック!「彼の質問は、おそらく議論、議論、投票、または拡張された議論を誘うでしょう。」いいえ。答えはたくさんありますが、それは投票ではなく、コメントやコメントでの議論は多くありません。なぜこれが閉じられたのですか?
Adrian McCarthy

Eureqaプログラムは、遺伝的プログラミングに非常に適しています。nutonian.com
Simon

回答:


146

宿題ではありません

プロのプログラマーとしての私の最初の仕事(1995)は、S&P500先物のための遺伝的アルゴリズムに基づく自動取引システムの作成でした。アプリケーションはVisual Basic 3 [!]で記述されており、VB3にはクラスさえなかったので、当時はどのようにしたかわかりません。

アプリケーションは、ランダムに生成された固定長文字列(「遺伝子」部分)の母集団から始まりました。各文字列は、S&P500先物の分単位の価格データの特定の形状と特定の注文に対応しています(購入または売却)およびストップロスとストッププロフィットの金額。各文字列(または「遺伝子」)の利益パフォーマンスは、3年間の履歴データの実行によって評価されました。指定された「形状」が履歴データと一致する場合は常に、対応する買いまたは売り注文を想定し、取引の結果を評価しました。各遺伝子は一定の金額で始まったため、壊れて遺伝子プールから完全に削除される可能性があるという警告を追加しました。

母集団の各評価後、生存者はランダムに(2つの親からのビットを混合することにより)交雑育種され、遺伝子が親として選択される可能性は、それが生み出した利益に比例します。また、点変異の可能性を追加して、物事を少し味わいました。これが数百世代続いた後、私は5000ドルを平均で約10000ドルにできる遺伝子の集団になりました(もちろん、過去のデータでは)

残念ながら、私はこのシステムをライブで使用する機会がありませんでした。上司が従来の方法で3か月未満で100,000ドル近くを失い、プロジェクトを続行する意欲を失ったためです。振り返ってみると、システムは莫大な利益を上げていただろうと思います-私が必ずしも正しいことをしているからではなく、私が作り出した遺伝子の集団はたまたま約5の買い注文(売り注文ではなく)に偏っているからです: 1つの比率。そして、私たちが20/20の後ろ向きで知っているように、市場は1995年以降少し上昇しました。


9
「システムは莫大な利益を上げたと思います」-はい、それはバックテスト環境で完全に機能したに違いない;-)
Joel

30
@ジョエル:もちろんそうでしたが、だからといってそれが有益だったとは思いません。売るのではなく買うという強い偏見があったので、それはお金を稼いだでしょう。1995年から1999年の間にランダムにS&P500先物を購入したシステム(GAのナンセンスは一切発生していません)は莫大な利益を上げていただろうが、これは振り返ってみればわかる。
MusiGenesis

10
ジョエルはおそらく「オーバーフィッティング」に言及していたでしょう。
Eric Normand

10
テスト用に履歴データを少し予約する必要があります。クロスフォールド検証を行うのが最適です。
Eric Normand

「形」とはどういう意味each of which corresponded to a specific shape in the minute-by-minute price dataですか?
CodyBugstein、2015年

89

この小さな世界に生息する小さな生き物を作りました。彼らは世界からいくつかの入力を受け取るニューラルネットワークの脳を持っていて、出力は他のアクション間の動きのベクトルでした。彼らの脳は「遺伝子」でした。

プログラムは、ランダムな脳を持つ生き物のランダムな集団から始まりました。入力ニューロンと出力ニューロンは静的でしたが、その間にあるのは静的ではありませんでした。

環境には食料と危険が含まれていました。食物はエネルギーを増加させ、十分なエネルギーがあれば交尾することができます。危険はエネルギーを減らし、エネルギーが0の場合、彼らは死にました。

やがて、生き物は進化して世界中を動き回り、食べ物を見つけて危険を回避しました。

その後、少し実験をすることにしました。クリーチャーの脳に「口」と呼ばれる出力ニューロンと「耳」と呼ばれる入力ニューロンを与えました。最初からやり直して驚いたのは、彼らがスペースを最大化するように進化し、それぞれの生き物がそれぞれの部分に留まることを発見して驚きました(食べ物はランダムに配置されました)。彼らはお互いに協力することを学び、お互いに干渉しないようにしました。常に例外がありました。

それから私は何か面白いものを試しました。私は死んだ生き物が食べ物になります。何が起こったのか推測してみてください!2種類のクリーチャーが進化しました。群れのように攻撃するクリーチャーと、回避率の高いクリーチャーです。

ここでの教訓は何ですか?コミュニケーションは協力を意味します。あなたが他を傷つけることがあなたが何かを得ることを意味する要素を導入するとすぐに、それから協力は破壊されます。

これが自由市場と資本主義のシステムにどう影響するのか。つまり、企業が競争を傷つけ、それで逃げる、彼らは競争を傷つけるために自分の力で全力を尽くします、その明確な。

編集:

フレームワークを使用せずにC ++で記述しました。私自身のニューラルネットとGAコードを書きました。エリック、もっともらしいことを言ってくれてありがとう。人々は通常、GAを試してみるまでGAの力を信じません(ただし、制限は明らかです)。GAは単純ですが単純ではありません。

疑い深い人のために、ニューラルネットは、複数の層がある場合、あらゆる機能をシミュレートできることが証明されています。GAは、ローカルおよび潜在的にグローバルな最小値を見つけてソリューションスペースをナビゲートするためのかなり単純な方法です。GAをニューラルネットと組み合わせると、一般的な問題の近似解を見つける関数を見つけるためのかなり良い方法があります。ニューラルネットを使用しているため、関数への一部の入力ではなく、一部の入力に対して関数を最適化しています。

サバイバルの例のデモコードは次のとおりです。http//www.mempko.com/darcs/neural/demos/eaters/ ビルド手順:

  • darcs、libboost、liballegro、gcc、cmake、makeをインストールします
  • darcs clone --lazy http://www.mempko.com/darcs/neural/
  • cd neural
  • cmake .
  • make
  • cd demos/eaters
  • ./eaters

イーターズのスクリーンショット


10
そして、あなたのチューリング賞はこの物語と一緒にどこに行きますか?そのような実験をRoadRunner以外でも実行できるようにするためには、科学にかなりの進歩があったに違いありません。
San Jacinto

1
エリックに同意しました。簡単なNNは1時間以内に書けます(実際、私は試験で書きました)。基本的なGAは、必ずしも1日か2日の作業ではありません。これは遺伝的アルゴリズムというよりはA-Lifeアルゴリズムに近いものですが、ここでは非常にシンプルで実現可能なものについて話しています。
カイロタン

2
これはほんの少しでも偽物ではありません...私の新入年の夏、C#のXNAを使用してこれと非常によく似たファンシープロジェクトを作成しました。 。たとえば、1つの遺伝子が視力を制御しました。高いほど遠くを意味し、低いほど広い視界を意味します。障害物と食べ物はランダムに配置され、生き物は食べ物を食べることでエネルギーを補充します。特性は、ランダムに生成されたガウス数をそれらに追加することによって変異し、実際の進化のように正規分布した遺伝子をもたらします。
Philip Guin、2011

2
私はこのようなこと(ALife)が人々が毎日したことである研究グループで働いています。あなたの話は完全に信じられます、そして正直に言って、私はそれが偽物であると誰もが思うだろうと思って少しショックを受けました。繰り返しになりますが、通常、それらを実行することのポイントは、非常に単純なシステムから複雑な動作が発生する可能性があることを指摘することです。ポイントが十分に理解されていないようです。
Lucas

1
彼のウェブサイトでいくつかの証拠を見つけました。ここでは例のコードは次のとおりです。mempko.com/darcs/neural/demos/eaters
guerda

51

2004年1月、私は、Amazon Kindleなどが米国で市場に出回る数年前に日本でのみリリースされた、初めての商用電子インクであるSony Librieの電子機器を作成していたPhilips New Display Technologiesから連絡を受けました。ヨーロッパ。

フィリップスのエンジニアは大きな問題を抱えていました。製品が市場に出るはずの数か月前、ページを変更するときに画面上でゴーストが発生していました。問題は、静電場を生成していた200のドライバーでした。これらの各ドライバーには、0〜1000 mVの範囲で適切に設定する必要がある特定の電圧がありました。しかし、そのうちの1つを変更すると、すべてが変更されます。

したがって、各ドライバの電圧を個別に最適化することは問題外でした。可能な値の組み合わせの数は数十億であり、特別なカメラが単一の組み合わせを評価するのに約1分かかりました。エンジニアは多くの標準的な最適化手法を試しましたが、何も近づきませんでした。

以前にGenetic Programmingライブラリをオープンソースコミュニティにリリースしていたため、ヘッドエンジニアから連絡がありました。彼はGP / GAが助けになるかどうか、そして私が参加できるかどうか尋ねました。私はそれを行い、約1か月間一緒に働き、合成データについてGAライブラリーを作成および調整し、彼はそれをシステムに統合しました。そして、ある週末、彼らはそれを本物でライブ走行させました。

次の月曜日、私は彼とそのハードウェア設計者から、GAが見つけた驚くべき結果を誰も信じられないほどの輝かしいメールを受け取りました。これでおしまい。その年の後半に製品が市場に出回った。

1セントも支払われませんでしたが、「自慢」する権利を得ました。彼らは最初から彼らはすでに予算を超えていると言ったので、私がそれに取り掛かる前に契約が何であったかを知っていました。そして、それはGAのアプリケーションにとって素晴らしい物語です。:)


23
「予算超過」というのは無意味です。もちろん彼らはあなたに支払うお金を持っていましたが、彼らはそうしないことを選びました。それは、大企業が優れたプログラマーをどのように利用できるかを本当に吸い込んで示しています。
マーティンカポディッチ14

50

結婚披露宴でGAを使用して座席の割り当てを最適化しました。10テーブル以上の80人のゲスト。評価関数は、日付を付けて人々を維持し、共通点のある人々をまとめ、極端な反対のビューを人々に別々のテーブルで維持することに基づいていました。

何度か実行しました。毎回、9つの良い​​テーブルと1つすべての奇妙なボールがありました。結局、妻は座席の割り当てをしました。

私の巡回セールスマンオプティマイザーは、染色体の旅程への新しいマッピングを使用しました。これにより、無効なツアーを生成するリスクなしに染色体を繁殖および変異させることは簡単になりました。

更新:カップルの方から質問があったため...

ゲスト(または都市)の配列から始めます。たとえば、アルファベット順など、任意ではあるが一貫した順序で並べます。これを参照ソリューションと呼びます。ゲストのインデックスを彼/彼女の座席番号と考えてください。

この順序を染色体に直接エンコードする代わりに、参照ソリューションを新しいソリューションに変換するための命令をエンコードします。具体的には、染色体を交換する配列内のインデックスのリストとして扱います。染色体をデコードするには、参照ソリューションから始めて、染色体が示すすべてのスワップを適用します。配列内の2つのエントリを交換すると、常に有効な解決策が得られます。すべてのゲスト(または都市)は、まだ1回だけ表示されます。

したがって、染色体はランダムに生成、変異、および他の染色体と交差させることができ、常に有効なソリューションを生成します。


そして、その斬新なマッピングは何でしたか?
ManuelAráoz、

4
@Manuel:ツアーを「染色体」に直接エンコードするのではなく、参照ツアーをソリューションに変換する変換をエンコードしました。変換は、インデックス内の都市間の単なる交換です。そのため、それらは古い方法で再結合でき、常にすべての都市を正確に1回訪問するツアーを常に生成できます。
エイドリアン・マッカーシー、

ありがとう!スワッピングの側面に少し戸惑っています。各染色体は、スワップするインデックスのリストをエンコードします-それは、インデックスが染色体に複数回出現する可能性があることを意味しませんか?
user3019612

1
Chomosomeにはインデックスc1、c2、c3、...、cnがあります。「ソリューション」は配列です。参照リストを使用してを初期化します。次に、染色体のインデックスのペアごとに、ソリューションの2つの要素を交換します(temp = a[c1]; a[c1] = a[c2]; a[c2] = temp)。aはすべてのゲスト(または都市)を1回だけ含むため、2つのインデックスが同一であるかどうかは関係ありません。
Adrian McCarthy、

33

私は、遺伝的アルゴリズム(およびいくつかの関連する手法)を使用して、金の農家が盗まれたクレジットカードを使用してMMOに支払うことを防ぐリスク管理システムの最適な設定を決定しました。システムは、「既知の」値(不正かどうか)を持つ数千のトランザクションを取り込んで、偽陽性が多すぎることなく不正なトランザクションを適切に識別するための設定の最適な組み合わせを見つけます。

トランザクションの数十(ブール)特性に関するデータがあり、それぞれに値が与えられ、合計されました。合計がしきい値より高かった場合、取引は詐欺でした。GAは多数のランダムな値のセットを作成し、それらを既知のデータのコーパスに対して評価し、(不正検出と偽陽性の数の制限の両方で)最高のスコアを取得したものを選択し、各世代が候補者の新世代を生み出す。一定の世代の後、最高のスコアリング値セットが勝者と見なされました。

テストする既知のデータのコーパスを作成したのは、システムのアキレス腱でした。チャージバックを待っていた場合、詐欺師への対応を試みた時点で数か月遅れていたため、誰かが大量のトランザクションを手動で確認して、長時間待たずにそのデータのコーパスを構築する必要がありました。

これにより、発生した詐欺の大部分が特定されましたが、ほとんどの詐欺が発生しやすいアイテムで1%未満にすることはできませんでした(受信トランザクションの90%が詐欺である可能性があると仮定すると、かなりうまくいっています)。

これはすべてperlを使用して行いました。かなり古いLinuxボックスでソフトウェアを1回実行すると、実行に1〜2時間かかります(WANリンクを介してデータをロードするには20分、残りの処理には時間がかかります)。特定の世代のサイズは、使用可能なRAMによって制限されていました。パラメータを少し変更して繰り返し実行し、特に優れた結果セットを探します。

全体として、何十もの詐欺インジケーターの相対値を手動で微調整しようとすることで生じた問題のいくつかを回避し、手作業で作成できるよりも優れた解決策を一貫して生み出しました。私の知る限り、それはまだ使用中です(私が書いてから約3年)。


ニューラルネットワークを使用してパラメーターの微調整を行うこともできたと思います(ただし、手動で行うよりも効果を上げるには時間がかかります)。
alexpinho98 2013

21

フットボールチップ。AFL(オージールールフットボール)の試合の週ごとの結果を予測するGAシステムを構築しました。

数年前、私は標準的な仕事のサッカープールに飽きてしまいました。誰もがインターネットに接続して、報道機関の専門家からピックを選んでいました。だから、私はたくさんの放送ジャーナリズムのメジャーを打ち負かすのはそれほど難しいことではないと思いましたよね?私の最初の考えは、マッセイレーティングスの結果を取り入れ、シーズンの終わりに名声と栄光を勝ち取り、私の戦略を明らかにすることでした。しかし、私はマッシーがAFLを追跡しないことを発見したことがない理由があります。私の皮肉屋は、それは各AFLゲームの結果が基本的にランダムなチャンスになっているためだと信じていますが、最近のルール変更に関する私の不満は別のフォーラムに属しています。

システムは基本的に、攻撃力、防御力、ホームフィールドの利点、週ごとの改善(またはその欠如)、およびこれらのそれぞれの変化の速度を考慮しました。これにより、シーズン中に各チームの一連の多項式が作成されました。特定の日付の各試合の勝者とスコアを計算できます。目標は、過去のすべてのゲームの結果に最も近い係数のセットを見つけ、そのセットを使用して次の週のゲームを予測することでした。

実際には、システムは過去のゲーム結果の90%以上を正確に予測するソリューションを見つけます。その後、次の週(つまり、トレーニングセットに含まれない週)のゲームの約60〜80%を正常に選択します。

結果:パックの真上。大きな賞金も、私がVegasを倒すために使用できるシステムもありません。でも楽しかったです。

私はすべてをゼロから構築し、フレームワークは使用していません。


21

Travelling SalesmanやRoger AlsingのMona Lisaプログラムのバリエーションなどの一般的な問題のいくつかだけでなく、革新的な数独ソルバーも書きまし(再実装するだけでなく、少し独自の考えが必要でした)他の誰かのアイデア)。数独を解くためのより信頼できるアルゴリズムがありますが、進化的なアプローチはかなりうまくいきます。

この数日間、私はRedditに関するこの記事を読んだ後、ポーカー用の「コールドデッキ」を見つけるための進化プログラムをいじっていました。現時点では十分ではありませんが、改善できると思います。

私には進化的アルゴリズムに使用する独自のフレームワークがあります。


17

私は1992年に会社が貨物業界用に開発した3Dレーザー表面プロファイルシステム用の自家製ビールGAを開発しました。このシステムは3次元の三角測量に依存し、カスタムレーザーラインスキャナー、512x512カメラ(カスタムキャプチャハードウェア付き)を使用しました。カメラとレーザーの間の距離は決して正確なものではなく、カメラの焦点は、予想通りの256,256の位置にありませんでした。

標準的なジオメトリとシミュレーテッドアニーリングスタイルの方程式の解法を使用して、キャリブレーションパラメーターを試してみるのは悪夢でした。

遺伝的アルゴリズムは夕方に打ち上げられ、それをテストするために校正キューブを作成しました。私は立方体の寸法を高い精度で知っていたため、私のGAは、生産のばらつきを克服する各スキャンユニットのカスタム三角測量パラメーターのセットを進化させることができるという考えでした。

トリックは御馳走を働いた。私は控えめに言っても驚かれました!約10世代以内に、私の「仮想」キューブ(生のスキャンから生成され、キャリブレーションパラメーターから再作成された)は実際にはキューブのように見えました。約50世代後、必要な校正を行いました。


11

家の塗装を計画しているときに、正確な色の組み合わせを得るのは難しいことがよくあります。多くの場合、あなたはいくつかの色を念頭に置いていますが、それは色の1つではありません、ベンダーはあなたに示します。

昨日、GA研究者である私の教授がドイツでの実話について言及しました(申し訳ありませんが、これ以上の参考文献はありません。そうです、要求があれば見つけることができます)。この男(彼を「色男」と呼ぶことにします)は、顧客が考えていたものに最も近い(RGBの)正確なカラーコードを人々が見つけるのを助けるためにドアドアから行っていました。これが彼のやり方です:

色の男は彼と一緒にGAを使用するソフトウェアプログラムを実行するために使用しました。彼は、4つの異なる色から始めました。それぞれがコード化された染色体(コード化された値はRGB値です)としてコード化されています。消費者は、4色のうち1つを選択します(どれが最も近いかを考えます)。次に、プログラムは最大フィットネスを割り当てますものに個々および次に移動世代使用突然変異/クロスオーバー。上記の手順は、消費者が正確な色を見つけて、RGBの組み合わせを色の男に教えるまで繰り返されます。

最大適合度を色に割り当てることで、消費者が考えているものに近づき、色の男のプログラムは、消費者が正確に考えている色に収束する機会を増やしています。とても楽しかったです!

-1を取得したので、さらに-1を計画している場合は、pls。その理由を説明してください!


6
私はあなたに反対票を投じるつもりはありませんが、それはあなたが自分でしなかったからだと思います。OPは、あなたが自分でしたことを具体的に求めました。
jprete 2009年

これは、リチャードドーキンスのバイオモーフをかなり簡略化したものです。
ニックジョンソン

1
色の面白いところは、それだけでは考えられないことです。カラーコンサルタントは、1つの色だけで作業するのではなく、パレットとスキームを使用します。自分で1つの色を選択するだけでは意味がありません。私は反対票を投じなかったが、あなたの答えはGAの定義を拡張することです。どのようにして1つの色を変更またはクロスオーバーしますか?これはより限定的に、限られたデータセットを繰り返し狭めていることを示しています。
カークブロードハースト2010

2
これはおそらく反対投票を説明します。これはGAではなく、山登りのようです。
Eric Normand

8

数週間前、私は 遺伝的アルゴリズムを使用してグラフレイアウトの問題を解決するSOのソリューション。これは制約付き最適化問題の例です。

また、機械学習の分野では、GAベースの分類ルールフレームワークをc / c ++に最初から実装しました。有名な逆伝播アルゴリズムを使用するのではなく、人工ニューラルネットワーク(ANN)
をトレーニングするためのサンプルプロジェクトでもGA を使用しました。

さらに、大学院での研究の一環として、EMベースのBaum-Welchアルゴリズム(c / c ++の場合)への追加アプローチとして、隠れマルコフモデルのトレーニングにGAを使用しました。


こんにちはアムロ。バックプロップとGAで得られた結果を完全に比較しましたか?もしそうなら、比較結果を私たちと共有できますか?2つのNNのクロスオーバーステップをどのように実装しましたか?
lmsasu

@lmsasu:派手なものはありません:母集団の各文字列または染色体はネットワークの重みとバイアスの値を表し、単純な1または2ポイントのクロスオーバー演算子が使用されました。思い出すと、GAを使用してネットワークをトレーニングするには長い時間がかかりました。私の実装は、他の何よりも概念実証でした(仮想掃海艇を制御するおもちゃの例については、こちらを参照してください)。ネットワーク構造。
Amro、

8

私の学部のCompSci学位の一部として、Jikes研究仮想マシンに最適なjvmフラグを見つける問題が割り当てられました。これは、コンソールに時間を返すDicappoベンチマークスイートを使用して評価されました。結果に影響を与えるハードウェアジッタを補正するために実行するのに何日もかかりましたが、ベンチマークスイートのランタイムを改善するためにこれらのフラグを切り替える分散genticアルゴリズムを作成しました。唯一の問題は、コンパイラの理論(割り当ての意図)について適切に学習しなかったことです。

既存のデフォルトフラグを初期母集団にシードすることもできましたが、興味深いのは、アルゴリズムがO3最適化レベルと非常によく似た構成を見つけたことです(ただし、実際には多くのテストでより高速でした)。

編集:また、割り当て用に独自の遺伝的アルゴリズムフレームワークをPythonで記述し、popenコマンドを使用してさまざまなベンチマークを実行しましたが、評価された割り当てでない場合は、pyEvolveを調べました。


7

まず、Jonathan Kozaによる "Genetic Programming"(amazonで)は、遺伝的および進化的アルゴリズム/プログラミング技術に関する本であり、多くの例があります。ぜひチェックしてみてください。

私自身の遺伝的アルゴリズムの使用については、(自作の)遺伝的アルゴリズムを使用して、オブジェクトの収集/破壊シナリオのスウォームアルゴリズムを進化させました(実用的な目的は地雷原をクリアすることもできたでしょう)。ここに論文リンクがあります。私が行ったことの中で最も興味深い部分は、多段階のフィットネス関数でした。これは、単純なフィットネス関数では、遺伝的アルゴリズムが集団のメンバーを十分に区別するための十分な情報を提供しなかったために必要でした。


コザのGPに関するシリーズは非常に密度が高く、GPを初めて使う人には向かないかもしれません。リカルドポリの遺伝的プログラミングフィールドガイド(無料のhtmlコピーとして入手可能)または メラニーミッチェルによる遺伝的アルゴリズムの紹介
だれも

7

私は、既存のプログラムのバグを自動的に修正するEvolutionary Computation(EC)の使用を調査するチームの一員です。私たちは、実際のソフトウェアプロジェクトの多くの実際のバグを正常に修復しました(このプロジェクトのホームページを参照してください))。

このEC修復手法には2つの用途があります。

  • 1つ目(プロジェクトページから利用できるコードと再現情報)は、既存のCプログラムから解析された抽象構文ツリーを進化させ、独自のカスタムECエンジンを使用してOcamlに実装されます。

  • 2つ目(プロジェクトページから入手できるコードと再現情報)は、プロジェクトへの個人的な貢献であり、x86アセンブリまたは多数のプログラミング言語で記述されたプログラムからコンパイルされたJavaバイトコードを進化させます。このアプリケーションはClojureで実装され、独自のカスタムビルドECエンジンも使用します。

Evolutionary Computationの優れた点の1つは、テクニックが単純であることにより、それほど難しいことなく独自のカスタム実装を作成できることです。遺伝的プログラミングに関する優れた無料の紹介テキストについては、「遺伝的プログラミングのフィールドガイド」を参照してください。


6

同僚と私は、会社が必要とするさまざまな基準を使用してトラックに貨物を積み込むためのソリューションに取り組んでいます。彼が積極的な剪定でブランチとバインドを使用している間、私は遺伝的アルゴリズムソリューションに取り組んできました。現在、このソリューションの実装を進めていますが、これまでのところ、良い結果が得られています。


5

数年前、gaを使用してasr(自動音声認識)文法を最適化し、認識率を向上させました。私はかなり単純な選択肢のリスト(gaが各スロットの可能な用語の組み合わせをテストしていた)から始めて、よりオープンで複雑な文法にたどり着きました。適合性は、一種の音声距離関数の下で用語/シーケンス間の分離を測定することによって決定されました。また、文法を弱く同等に変化させて、よりコンパクトな表現にコンパイルされたものを見つける実験も行いました(結局、直接アルゴリズムを使用したため、アプリケーションで使用できる「言語」のサイズが大幅に増加しました)。 。

最近では、さまざまなアルゴリズムから生成されたソリューションの品質をテストするためのデフォルトの仮説としてそれらを使用しています。これには、主に分類とさまざまな種類のフィッティング問題が含まれます(つまり、データセットに対してレビュアーが行った一連の選択を説明する「ルール」を作成します)。


4

多くの問題を解決するために、「GALAB」という名前の完全なGAフレームワークを作成しました。

  • GSM ANT(BTS)を検索して、重複や空白の場所を減らします。
  • リソース制約プロジェクトのスケジューリング。
  • 進化的な写真の作成。(エボピック
  • 巡回セールスマン問題。
  • N-QueenとN-Colorの問題。
  • ナイトのツアーとナップザックの問題。
  • 魔方陣と数独パズル。
  • Superstring問題に基づく文字列圧縮。
  • 2Dパッケージングの問題。
  • 小さな人工生命アプリ。
  • ルービックパズル。

はい、そのソースは私のGAブックの下で公開されています。
MShams、2012年

4

かつてGAを使用して、メモリアドレスのハッシュ関数を最適化しました。アドレスは4Kまたは8Kのページサイズだったので、アドレスのビットパターンにある程度の予測可能性が示されました(最下位ビットがすべてゼロ、中間ビットが定期的に増加するなど)。元のハッシュ関数は「分量」でした-ヒットをクラスター化する傾向がありました3番目ごとのハッシュバケット。改善されたアルゴリズムは、ほぼ完璧な分布を示しました。


3

宿題が重要かどうかわかりません...

勉強中、私たちは巡回セールスマン問題を解決するために独自のプログラムを導入しました。

アイデアは、いくつかの基準(問題のマッピングの難しさ、パフォーマンスなど)で比較することであり、シミュレーテッドアニーリングなどの他の手法も使用しました。

それはかなりうまくいきましたが、「再現」フェーズを正しく行う方法を理解するのにしばらく時間がかかりました:目の前の問題を遺伝的プログラミングに適したものにモデル化することは、本当に私を最も困難な部分として感じました...

ニューラルネットワークなどにも触れたので面白かったです。

この種のプログラミングを「プロダクション」コードで使用した人がいるかどうか知りたいのですが。


3

音楽の周波数スペクトルから、演奏中に有用なパターンを抽出する単純なGAを作成しました。出力は、Winampプラグインでグラフィック効果を駆動するために使用されました。

  • 入力:いくつかのFFTフレーム(フロートの2D配列を想像してください)
  • 出力:0.0または1.0にしきい値設定された単一の浮動小数点値(入力の加重和)
  • 遺伝子:入力の重み
  • フィットネス機能:デューティサイクル、パルス幅、BPMを適切な範囲で組み合わせたもの。

いくつかのGAをスペクトルのさまざまな部分とさまざまなBPM制限に合わせて調整したため、同じパターンに収束する傾向はありませんでした。各母集団の上位4つからの出力は、レンダリングエンジンに送信されました。

興味深い副作用は、一般にそれを理解するのに4〜5秒かかったものの、人口全体の平均フィットネスが音楽の変化の良い指標であることでした。


3

私の論文の一部として、私は多目的最適化アルゴリズムmPOEMS(進化した改善ステップによる多目的プロトタイプ最適化)の一般的なJavaフレームワークを書きました。これは、進化的概念を使用したGAです。これは、すべての問題に依存しない部分が問題に依存する部分から分離され、フレームワークを使用して問題に依存する部分のみを追加するインターフェースが提供されるという点で一般的です。したがって、アルゴリズムを使用したい人はゼロから始める必要はなく、それは多くの作業を容易にします。

ここでコードを見つけることができます。

このアルゴリズムで見つけることができるソリューションは、最先端のアルゴリズムSPEA-2およびNSGAとの科学的研究で比較されており、アルゴリズムが同等またはそれ以上のパフォーマンスを発揮することが実証されています。パフォーマンスを測定します。特に、探している最適化の問題によって異なります。

あなたはここでそれを見つけることができます。

また、私の論文と作業の証明の一環として、このフレームワークをポートフォリオ管理で見られるプロジェクト選択問題に適用しました。それは、会社に最も価値を加えるプロジェクトを選択すること、会社の戦略のほとんどをサポートすること、または他の任意の目標をサポートすることです。例えば、特定のカテゴリーからの特定の数のプロジェクトの選択、またはプロジェクトの相乗効果の最大化、...

このフレームワークをプロジェクト選択問題に適用する私の論文:http : //www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf

その後、私はフォーチュン500のポートフォリオ管理部門で働いていました。彼らは、GAをプロジェクト選択問題/ポートフォリオ最適化にも適用する商用ソフトウェアを使用していました。

その他のリソース:

フレームワークのドキュメント:http : //thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf

mPOEMSプレゼンテーションペーパー:http ://portal.acm.org/citation.cfm?id=1792634.1792653

実際、少しの熱意があれば、誰でも簡単に汎用フレームワークのコードを任意の多目的最適化問題に適合させることができます。


2

仕事で私は次の問題を抱えていました:M個のタスクとN個のDSPが与えられた場合、タスクをDSPに割り当てる最良の方法は何ですか?「最良」とは、「最も負荷の高いDSPの負荷を最小限に抑える」ことと定義されました。タスクにはさまざまなタイプがあり、さまざまなタスクタイプには、割り当てられた場所に応じてさまざまなパフォーマンスの影響がありました。そのため、ジョブからDSPへの割り当てのセットを「DNA文字列」としてエンコードし、遺伝的アルゴリズムを使用して「交配」しました私ができる最高の割り当て文字列。

それはかなりうまくいきました(可能なすべての組み合わせを評価するという私の以前の方法よりもはるかに優れていました...重要な問題サイズでは、完了するまでに何年もかかりました!)唯一の問題は、伝える方法がないことでした。最適解に達したかどうか。現在の「ベストエフォート」が十分であるかどうかを判断するか、それをより長く実行して、より良い結果が得られるかどうかを確認することができます。


2

codechef.com(ちなみに素晴らしいサイト、毎月のプログラミングコンペティション)では、解決できない数独を解くことになっています(可能な限り間違った列/行などをできるだけ少なくして、できるだけ近くに来る必要があります)。

私がやろうと思ったのは、最初に完璧な数独を生成し、次に与えられたフィールドを上書きすることでした。このかなり良い基礎から、私は遺伝的プログラミングを使用して私の解決策を改善しました。

この場合、数独が300x300であり、検索に時間がかかりすぎるため、決定論的アプローチを考えることができませんでした。


2

単純な遺伝的アルゴリズムを使用して、バイナリ文字列として表された波のS / N比を最適化しました。数百万世代にわたってビットを特定の方法で反転することにより、その波のS / N比が高くなる変換を生成できました。このアルゴリズムは、「シミュレーテッドアニーリング」である可能性もありますが、この場合は使用されませんでした。根本的には、遺伝的アルゴリズムは単純であり、これは私が見たユースケースとほぼ同じであったため、生成の作成と選択にフレームワークを使用しませんでした-ランダムシードと信号対ノイズ比のみ手元の機能。


2

学校のセミナーでは、音楽モードで音楽を生成するアプリケーションを開発しています。プログラムはJavaでビルドされ、出力は曲を含むmidiファイルでした。音楽を生成するために、GAの個別のアプローチを使用します。このプログラムは、新しい作曲を探すのに役立つと思います。


グレート私は似たようなものを試しました:リンク
Todor Balabanov 2017年

2

学部生では、NERO(ニューラルネットワークと遺伝的アルゴリズムの組み合わせ)を使用して、ゲーム内ロボットにインテリジェントな意思決定を教える。とてもかっこよかったです。


2

食物源と鉱山のランダム化されたグリッド地形のセットを介したロボットナビゲーションのマルチスレッドスイングベースのシミュレーションを開発し、ロボットの動作の最適化とロボット染色体の適者遺伝子の生存を探求する遺伝的アルゴリズムベースの戦略を開発しました。これは、各反復サイクルのチャートとマッピングを使用して行われました。

それ以来、私はさらに多くのゲーム動作を開発しました。私が最近自分で構築したアプリケーションの例として、開始および目標の状態、および1つまたは複数の接続ポイント、遅延、キャンセル、建設工事、ラッシュアワーを考慮に入れて、英国でのルート検索における巡回セールスマンの問題を解決するための遺伝的アルゴリズムがありました。スト、最速ルートと最安ルートの比較。次に、特定の日に取るルートのバランスのとれた推奨事項を提供します。

一般的に、私の戦略はPOJOベースの遺伝子の表現を使用することであり、その後、選択、突然変異、クロスオーバー戦略、および基準点に特定のインターフェース実装を適用します。すると、私のフィットネス関数は基本的に、ヒューリスティックな手段として適用する必要がある戦略と基準に基づいてかなり複雑になります。

また、体系的な突然変異サイクルを使用してコード内の自動テストに遺伝的アルゴリズムを適用して、アルゴリズムがロジックを理解し、コード修正の推奨事項を含むバグレポートを確認することも検討しました。基本的に、コードを最適化し、改善のための推奨事項を提供する方法と、新しいプログラムコードの検出を自動化する方法。私は他のアプリケーションの中でもとりわけ、音楽制作に遺伝的アルゴリズムを適用しようとしました。

一般的に、私はほとんどのメタヒューリスティック/グローバル最適化戦略のような進化的な戦略を見つけます。最初は学習が遅いですが、ソリューションがゴール状態にますます近づくにつれて、また、フィットネス関数とヒューリスティックスがうまく生成されている限り、次第に取り上げ始めます。検索スペース内での収束。


1

私はかつて囲碁のゲーム用に、遺伝的プログラミングだけに基づいてコンピュータープレーヤーを作ろうとしたことがあります。各プログラムは、一連の動作の評価関数として扱われます。生成されたプログラムは、かなり小さい3x4ボードであっても、あまり良くありませんでした。

私はPerlを使用し、すべて自分でコーディングしました。今日は違うことをするだろう。


1

The Blind Watchmakerを読んだ後、私はパスカルプログラムに興味を持った。ドーキンス氏は、時間とともに進化する生物のモデルを作成するために開発したと述べた。Swarmを使って自分で書くのに十分興味がありました。私は彼が作成したすべての派手な生き物のグラフィックを作成したわけではありませんが、私の「染色体」は生物の生存能力に影響を与える特性を制御しました。彼らは単純な世界に住んでいて、お互いにそして彼らの環境に対してそれを強打することができました。

生物は、部分的に偶然のために生存または死亡しましたが、それらが局所環境にどれほど効果的に適応したか、栄養分をどれだけうまく消費したか、および繁殖に成功したかに基づいています。それは楽しかったですが、私がオタクであることを妻に証明しました。


1

少し前のことですが、GAをロールして、実際に画像処理カーネルを進化させて、ハッブル宇宙望遠鏡(HST)画像から宇宙線トレースを削除しました。標準的なアプローチは、ハッブルで複数の露出を取り、すべての画像で同じものだけを保持することです。HST時間は非常に貴重なので、私は天文学の愛好家であり、最近、進化計算に関する会議に出席したので、GAを使用して単一の露出をクリーンアップすることを考えました。

個人は、3x3ピクセルの領域を入力として取り、いくつかの計算を実行し、中心のピクセルを変更するかどうか、およびどのように変更するかについて決定を下す木の形でした。適合性は、出力を従来の方法でクリーンアップした画像と比較して判断されました(つまり、露出を重ね合わせる)。

それは実際にはうまくいったが、元のアプローチを先取りすることを保証するには十分ではない。論文で時間の制約を受けていなかった場合は、アルゴリズムで利用できる遺伝的部分のビンを拡張した可能性があります。私はそれを大幅に改善できたと確信しています。

使用したライブラリ:正しく思い出せば、天体画像データ処理とI / OのためのIRAFとcfitsio。


1

私は若い頃にGAを試しました。次のように機能するシミュレータをPythonで作成しました。

遺伝子はニューラルネットワークの重みをエンコードしました。

ニューラルネットワークの入力は、タッチを検出する「アンテナ」でした。高い値は非常に近いことを意味し、0は接触しないことを意味します。

出力は2つの「ホイール」へのものでした。両方の車輪が前進した場合、男は前進しました。車輪が反対方向にある場合、男は向きを変えました。出力の強さがホイールの回転速度を決定しました。

単純な迷路が生成されました。それは本当にシンプルでした。画面の下部に開始があり、上部にゴールがあり、間に4つの壁がありました。各壁にはランダムにスペースが取られていたので、常に小道がありました。

私は最初にランダムな人(私はそれらをバグとして考えました)を始めました。1人の男がゴールに到達するか、制限時間に到達するとすぐに、適合度が計算されました。それはその時のゴールまでの距離に反比例した。

次に、それらをペアにして「育て」、次世代を作成しました。育種するために選ばれる確率は、その適応度に比例しました。時々これは、それが非常に高い相対適合度を持っていた場合、それ自身が繰り返し飼育されたことを意味しました。

彼らは「左壁を抱き締める」行動を起こすだろうと思ったが、彼らは常に最適ではない何かに従っているようだった。すべての実験で、バグはらせん状のパターンに収束しました。彼らは右の壁に触れるまで外向きに螺旋を描く。彼らはそれに従い、ギャップに到達すると、(ギャップから離れて)らせん状に回りました。彼らは270度左に曲がり、通常ギャップに入るでしょう。これは彼らを壁の大部分を通過させ、そしてしばしば目標に到達させるでしょう。

追加した機能の1つは、遺伝子に色ベクトルを入れて、個人間の関連性を追跡することでした。数世代後、それらはすべて同じ色になり、より良い繁殖戦略が必要であることを私に教えてくれます。

彼らにもっと良い戦略を作ってもらいました。私はニューラルネットを複雑にしました。それは助けにはならなかった。私はいつも同じ戦略を見ました。

100世代後にしか再結合しない個別の遺伝子プールを作るなど、いろいろなことを試しました。しかし、何も彼らをより良い戦略に押しやることはありません。多分それは不可能でした。

もう1つの興味深い点は、時間の経過に伴うフィットネスのグラフです。それが上がる前に最大のフィットネスが下がるような明確なパターンがありました。私はその可能性についての進化の本の話を見たことがありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.