C# の優れた遺伝的プログラミングの例を探していました。良いオンライン/本のリソースを知っている人はいますか? Evolutionary/Genetic プログラミング用の C# ライブラリがあるのだろうか?
12 に答える
MSDN には昨年、遺伝的プログラミングに関する記事がありました:遺伝的アルゴリズム: Windows フォームによる適者生存
特に遺伝的アルゴリズムの実装を始めたばかりの場合は、絶対に必要でない限り、実際にアセンブリを生成しないことをお勧めします。
遺伝的アルゴリズムは、ターゲット言語が関数型で動的に型付けされている場合に最も簡単に実装できます。これが一般に、ほとんどの遺伝的アルゴリズムの研究が LISP で書かれている理由です。その結果、C# で実装する場合は、独自のミニ「ツリー言語」を定義し、アルゴリズムにツリーを生成させ、アルゴリズムの各反復を実行するときにツリーを解釈する方がよいでしょう。 .
私は大学時代にこのようなプロジェクト (C# での遺伝的アルゴリズムの実装) を行い、それが私が取ったアプローチでした。
そのようにすると、実行ステップと遺伝的アルゴリズムの「再現」ステップの両方に最適な表現 (AST 表現) を 1 つだけ持つという利点が得られます。
あるいは、アセンブリを生成しようとすると、アプリに大量の不必要な複雑さを追加することになる可能性があります。現在、CLR では、アプリ ドメイン全体が破棄されない限り、アセンブリをアプリ ドメインからアンロードすることはできません。これは、アプリに巨大なメモリ リークが発生するのを避けるために、アルゴリズムの反復ごとに生成されたプログラムごとに個別のアプリ ドメインをスピンアップする必要があることを意味します。一般に、すべてが余分な刺激を追加するだけです.
一方、解釈された AST は、他のオブジェクトと同様にガベージ コレクションが可能なため、複数のアプリ ドメインをいじる必要はありません。パフォーマンス上の理由から、最終結果をコード生成したい場合は、後でそのサポートを追加できます。ただし、DynamicMethodクラスを使用してそれを行うことをお勧めします。これにより、AST を実行時に動的にコンパイル済みのデリゲートに変換できます。これにより、コード生成をできるだけシンプルに保ちながら、単一の DLL を展開できます。また、DynamicMethod インスタンスはガベージ コレクション可能であるため、遺伝的アルゴリズムの一部として使用して、そこで処理を高速化することもできます。
LINQ 式ツリーを使用して遺伝的プログラミングを実装できる可能性があります。ランダムな IL 生成よりも、使用可能なものを生成する可能性が高くなります。
これについては、Mike Swanson による channel9 で、 http: //channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/ の高度な議論を見ました。
遺伝的アルゴリズムやヒューリスティック最適化全般に興味がある場合は、HeuristicLabを参照してください。. 新しいバージョンをリリースしてから1.5年、数年間開発されています。C# 4 でプログラムされており、優れた GUI を備えています。遺伝的アルゴリズム、遺伝的プログラミング、進化戦略、ローカル検索、タブー検索、粒子群最適化、シミュレーテッド アニーリングなど、多くのアルゴリズムが既に利用可能です。配車ルート問題、巡回セールスマン、実関数最適化、ナップザック、二次割り当て問題、分類、回帰など、いくつかの問題も実装されています。チュートリアルもあり、ソリューション評価のために外部プログラムと通信できるようにプロトコル バッファが統合されています。GPL の下でライセンスされています。2009 年には、このソフトウェアはマイクロソフト オーストリアのマイクロソフト イノベーション アワードを受賞しています。
また、このテーマに関する本も執筆しています: Genetic Algorithms and Genetic Programming .
一般的な遺伝的アルゴリズムとは対照的に、実際の遺伝的プログラミングを意味しますか?
もしそうなら、C#/.net は最適な言語ではありません。たとえば、LISP は常に GP の主力でした。
ただし、必要に応じて、おそらく CIL/MSIL を動的に生成する必要があります。System.Reflection.Emitを使用してこれを行うことができますが、 Mono.Cecilをお勧めします。それは良いドキュメントを欠いています (あたかも反射放出にそれらがあるかのように)..しかし、それははるかに優れたアセンブリの放出と反射を提供します.
もう 1 つの問題は、.net フレームワークでコードをロードし、後で破棄するのは簡単ではないことです。少なくとも、アセンブリをアンロードすることはできません。アプリドメインをアンロードすることはできますが、別のアプリドメインにコードをロードし、それを外部から呼び出すというビジネス全体がかなり面倒になる可能性があります。.NET 3.5 の System.Addin の機能により、これが容易になります。
フル機能の進化的計算フレームワークに興味がある場合は、ECJをC#.NET4.0にフォークしました。パッケージには、すべての作業サンプルを含む、元のECJJavaプロジェクトのすべてが含まれています。
また、変換の多くの側面を検証するために500の単体テストを作成しました。しかし、さらに多くのテストが必要です。特に、分散コンピューティングの側面は完全にはテストされていません。これは、ECJの単純なソケットの使用から、WCFとWFを使用したより堅牢な戦略に変換することを計画しているためです。また、TPL(タスク並列ライブラリ)を利用するためにフレームワークを作り直します。
とにかく、ここから最初の変換をダウンロードできます:
http://branecloud.codeplex.com
私はまた、「合成知能」の研究に関連する他のいくつかのフレームワークをJavaから.NETに変換する過程にあります(時間を見つけることができるとき)。
ベン
Manning の本: " Metaprogramming in .NET " は、式ツリーを介した GP に関する大きなセクションを提供しています。
私は今、遺伝的プログラミングのフィールドガイドを読んでいます(無料のPDFダウンロード)。ペーパーバックとしても販売されています。TinyGPと呼ばれる Java で書かれたライブラリの使用について説明します。あなたはそれからいくらかのマイレージを得るかもしれません。私は実際のプログラミングを始めたわけではありませんが、C# の概念のいくつかを適用したいと考えています。
私は C# で ECJ のポートを維持しています。それは素晴らしい。