views:

4594

answers:

12

I've been looking for some good genetic programming examples for C#. Anyone knows of good online/book resources? Wonder if there is a C# library out there for Evolutionary/Genetic programming?

+9  A: 

MSDN had an article last year about genetic programming: Genetic Algorithms: Survival of the Fittest with Windows Forms

Judah Himango
+3  A: 

I saw a good high-level discussion of it on channel9 by Mike Swanson at http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

dpp
+3  A: 

Do you mean actual genetic programming, as opposed to genetic algorithms in general?

If so, C#/.net isn't the best language for it. LISP, for example, has always been a mainstay of GP.

However, if you must, you're probably going to want to dynamically generate CIL / MSIL. You could do this using System.Reflection.Emit, however I'd recommend Mono.Cecil. It lacks good docs (as if reflection emit has them).. But it offers much better assembly emission and reflection.

Another issue is that it is less than trivial to load code, and later dispose of it, in the .net framework. At least, you cannot unload assemblies. You can unload appdomains, but the whole business of loading code into a seperate appdomain, and calling it externally can get pretty messy. .NET 3.5's System.Addin stuff should make this easier.

mgsloan
He does specify GP rather than GAs, but then the tags say both.
Chris S
+7  A: 

You might be able to implement genetic programming using LINQ expression trees -- it's more likely to generate something usable than random IL generation.

Curt Hagenlocher
+6  A: 

I would recommend against actually generating assemblies unless you absolutely need to, particularly if you are just getting started with implementing the genetic algorithm.

The genetic algorithm is easiest to implement when the target language is functional and dynamically typed. That is generally why most genetic algorithm research is written in LISP. As a result, if you are going to implement it in C#, you are probably better off defining your own mini "tree language", having the algorithm generate trees, and just interpreting the trees when it comes time to run each iteration of the algorithm.

I did a project like this when I was in college (an implementation of the genetic algorithm in C#), and that was the approach I took.

Doing it that way will give you the advantage of only having 1 representation to work with (the AST representation) that is optimally suited for both execution and the genetic algorithm "reproduction" steps.

Alternatively, if you try to generate assemblies you are probably going to end up adding a large amount of unneeded complexity to the app. Currently, the CLR does not allow an assembly to be unloaded from an App domain unless the entire app domain is destroyed. This would mean that you would need to spin up a separate app domain for each generated program in each iteration of the algorithm to avoid introducing a giant memory leak into your app. In general, the whole thing would just add a bunch of extra irritation.

Interpreted AST's, on the other hand, are garbage collectible just like any other object, and so you wouldn't need to monkey around with multiple app domains. If, for performance reasons you want to code-gen the final result you can add support for that later. However, I you would recommend that you do that using the DynamicMethod class. It will allow you to convert an AST into a compiled delegate dynamically at runtime. That will enable you to deploy a single DLL while keeping the code generation stuff as simple as possible. Also, DynamicMethod instances are garbage collectible so you could end up employing them as part of the genetic algorithm to speed things up there as well.

Scott Wisniewski
Actually I have found that generated assemblies work quite well and the framework implementer can hide most of the complexity from the GA implementer. We can dynamically deploy versioned assemblies across a cluster
Steve
+1  A: 

I am reading A Field Guide to Genetic Programming right now (free PDF download). It is also available as a paperback. It discuses the use of a library written in Java called TinyGP. You might get some mileage out of that. I have not started doing any actual programming but am hoping to applies some of the concepts in C#.

Jason Jackson
A: 

I maintain a port of ECJ in C#. It's great.

A: 

@MrMan: Do you have a link users can go to?

Mac
you can add comments to his answer....
Luke Schafer
Are you going around looking for people to down vote? This was answered back in October! If you look at all my recent activities I think I've been using the comments functionality properly once I became aware. I would appreciate a warning before a down vote next time.I should be more afraid of being pulled over by COPS than you! Give me a break.
Mac
A: 

Where can i find this ecj c# port? thanks

+4  A: 

After developing my own Genetic Programming didactic application, I found a complete Genetic Programming Framework called AForge.NET Genetics. It's a part of the Aforge.NET library. It's licensed under LGPL.

Jader Dias
A: 

Hy, me again :) Hi, I see that you are interested about Algorithms and programing? I find one amazing book about it "Advances in Evolutionary Algorithms". This is the link where you can find it and download for free: http://www.intechopen.com/books/show/title/advances_in_evolutionary_algorithms Aim of the book is to present recent improvements, innovative ideas and concepts in a part of a huge EA field.

Hanibal Lecter
A: 

Also an interesting article "DNA seen through the eyes of a coder"