2009-06-04 43 views
1

遺伝的プログラミングの一般的な知識に慣れていますが、どこで遺伝子プログラミングの実装の詳細がわかりますか?私はC#と.NET 3.5を使用しています。私は、経路探索のようなもののために遺伝的プログラミングを使いたいと思っています。一般的には、それができることを見たいと思っています。 編集:私はおそらく、私が探しているものを明確にする必要があります:どのような種類のデータ構造が構文木を格納するために使用されるのか、育成操作がどのように実行されるのか、ということに興味があります。遺伝的プログラミングの実装

答えて

5

は私が遺伝的プログラミングを学ぶ助けC++ HelloWorld例の一つの簡単な書き換えです:

using ga_vector = List<ga_struct>; 

class ga_struct 
{ 
    public ga_struct(string str, uint fitness) 
    { 
     Str = str; 
     Fitness = fitness; 
    } 

    public string Str { get; set; } 
    public uint Fitness { get; set; } 
} 

class Program 
{ 

    private const int GA_POPSIZE = 2048; 
    private const int GA_MAXITER = 16384; 
    private const float GA_ELITRATE = 0.10f; 
    private const float GA_MUTATIONRATE = 0.25f; 
    private const float GA_MUTATION = 32767 * GA_MUTATIONRATE; 
    private const string GA_TARGET = "Hello world!"; 

    private static readonly Random random = new Random((int)DateTime.Now.Ticks); 

    static void Main(string[] args) 
    { 
     ga_vector popAlpha = new ga_vector(); 
     ga_vector popBeta = new ga_vector(); 

     InitPopulation(ref popAlpha, ref popBeta); 
     ga_vector population = popAlpha; 
     ga_vector buffer = popBeta; 

     for (int i = 0; i < GA_MAXITER; i++) 
     { 
      CalcFitness(ref population); 
      SortByFitness(ref population); 
      PrintBest(ref population); 

      if (population[0].Fitness == 0) break; 

      Mate(ref population, ref buffer); 
      Swap(ref population, ref buffer); 
     } 

     Console.ReadKey(); 
    } 

    static void Swap(ref ga_vector population, ref ga_vector buffer) 
    { 
     var temp = population; 
     population = buffer; 
     buffer = temp; 
    } 

    static void InitPopulation(ref ga_vector population, ref ga_vector buffer) 
    { 
     int tsize = GA_TARGET.Length; 
     for (int i = 0; i < GA_POPSIZE; i++) 
     { 
      var citizen = new ga_struct(string.Empty, 0); 

      for (int j = 0; j < tsize; j++) 
      { 
       citizen.Str += Convert.ToChar(random.Next(90) + 32); 
      } 

      population.Add(citizen); 
      buffer.Add(new ga_struct(string.Empty, 0)); 
     } 
    } 

    static void CalcFitness(ref ga_vector population) 
    { 
     const string target = GA_TARGET; 
     int tsize = target.Length; 

     for (int i = 0; i < GA_POPSIZE; i++) 
     { 
      uint fitness = 0; 
      for (int j = 0; j < tsize; j++) 
      { 
       fitness += (uint) Math.Abs(population[i].Str[j] - target[j]); 
      } 

      population[i].Fitness = fitness; 
     } 
    } 

    static int FitnessSort(ga_struct x, ga_struct y) 
    { 
     return x.Fitness.CompareTo(y.Fitness); 
    } 

    static void SortByFitness(ref ga_vector population) 
    { 
     population.Sort((x, y) => FitnessSort(x, y)); 
    } 

    static void Elitism(ref ga_vector population, ref ga_vector buffer, int esize) 
    { 
     for (int i = 0; i < esize; i++) 
     { 
      buffer[i].Str = population[i].Str; 
      buffer[i].Fitness = population[i].Fitness; 
     } 
    } 

    static void Mutate(ref ga_struct member) 
    { 
     int tsize = GA_TARGET.Length; 
     int ipos = random.Next(tsize); 
     int delta = random.Next(90) + 32; 

     var mutated = member.Str.ToCharArray(); 
     Convert.ToChar((member.Str[ipos] + delta)%123).ToString().CopyTo(0, mutated, ipos, 1); 
     member.Str = mutated.ToString(); 
    } 

    static void Mate(ref ga_vector population, ref ga_vector buffer) 
    { 
     const int esize = (int) (GA_POPSIZE*GA_ELITRATE); 
     int tsize = GA_TARGET.Length, spos, i1, i2; 

     Elitism(ref population, ref buffer, esize); 

     for (int i = esize; i < GA_POPSIZE; i++) 
     { 
      i1 = random.Next(GA_POPSIZE/2); 
      i2 = random.Next(GA_POPSIZE/2); 
      spos = random.Next(tsize); 

      buffer[i].Str = population[i1].Str.Substring(0, spos) + population[i2].Str.Substring(spos, tsize - spos); 

      if (random.Next() < GA_MUTATION) 
      { 
       var mutated = buffer[i]; 
       Mutate(ref mutated); 
       buffer[i] = mutated; 
      } 
     } 
    } 

    static void PrintBest(ref ga_vector gav) 
    { 
     Console.WriteLine("Best: " + gav[0].Str + " (" + gav[0].Fitness + ")"); 
    } 

あり、いくつかの小さなエラーであってもよいが、それ以外の場合は、それがOK働いて見えるかもしれません。また、C#の精神で書かれているかもしれませんが、それはちょうど詳細です。それは非常に柔軟で強力なソフトウェアです

http://branecloud.codeplex.com

::)

+0

クール!おかげさまでこれはたくさんの助けになるはずです。 – RCIX

0

Survival of the Fittest: Natural Selection with Windows Formsをご覧ください。

編集:私が見つけたprevious SO questionを参照してください。それはかなり重複しています。申し訳ありませんがリンクを理解していません(それはそのようなことを言及するのは良いことです)。また、答えが受け入れられたにもかかわらず、もう1つの質問はまだ多くの回答/編集のために開いています。

+0

ありがとう、しかし、私はそれらの両方を見ました。 MSDNの記事はCodeDOMで書かれていたので、実際には役に立たなかった。これは私が理解するのが少し難しく、前のSO投稿は基本的に同じMSDN記事へのリンクであった。私はもう少しモダンなものを好むだろう。おそらくラムダ?再度、お答えいただきありがとうございます。 – RCIX

3

Roger AlsingのMona Lisaプロジェクトは非常に良い例です。 http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

EDIT:私が例が好きな理由は、やや小さく分かりやすいからです。遺伝的プログラミングの概念を理解するための迅速かつ簡単な方法です。ここで

+0

非常に興味深い、それは私の遺伝的プログラミングの実装を適用する用途の一つかもしれませんが、私は、高水準の理論をどのようにして目的の作業を実行するコードに変えるかについて具体的な詳細を探しています。 – RCIX

+0

ありがとう、私は概念を既に理解しています。私は、遺伝子プログラミングの高度な概念を、遺伝子プログラミングのさまざまな部分を実装するために使用できるコードの特定の構造に翻訳する方法を探しています。 – RCIX

+0

モナリザのプログラムは印象的ですが、実際には遺伝的プログラミングではありません。 –

0

あなたはショーン・ルークのECJ(Javaで進化的計算)のこのC#.NET 4.0ポートを試すことができます!しかし、作業中のコンソール・サンプルが多数(および変換中に開発された多くの有益な単体テスト)すぐに使用できるため、開始するのも比較的簡単です。

ベン

関連する問題