遗传规划实施

我熟悉遗传编程的一般性,但我想知道在哪里可以找到一些东西,向我展示实施遗传编程的细节。 我使用C#和.NET 3.5,我想将遗传编程用于寻路之类的东西,通常只想看看它能做些什么。 编辑:我应该澄清我正在寻找的东西:我感兴趣的是用什么类型的数据结构来存储语法树,如何进行繁殖操作,这类事情。

这是一个快速重写的C ++ HelloWorld示例之一,帮助我学习基因编程:

using ga_vector = List; 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 + ")"); } 

可能会有一些小错误,但除此之外它看起来工作正常。 它也可以在C#的精神上更好地编写,但这些只是细节。 🙂

Roger Alsing的蒙娜丽莎项目就是一个很好的例子。 http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/

编辑:我喜欢这个例子的原因是因为它相当小而且易于理解。 它是一种快速简便的方法来掌握遗传编程的概念。

你可以看看最适合的生存:Windows窗体的自然选择 。

编辑:看到我之前发现的SO问题 。 这几乎是重复的。 对不起,你不明白这个链接(在问题中提到这些事情很好)。 此外,即使答案已被接受,另一个问题仍然是开放的更多答案/编辑。

您可以尝试使用Sean Luke的ECJ(Java中的进化计算)的C#.NET 4.0端口:

http://branecloud.codeplex.com

它是非常灵活和强大的软件! 但它也相对容易上手,因为它包含许多开箱即用的工作控制台样本(以及转换期间开发的许多有用的unit testing)。