遺伝的プログラミングの一般的な知識に慣れていますが、どこで遺伝子プログラミングの実装の詳細がわかりますか?私はC#と.NET 3.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
::)
Survival of the Fittest: Natural Selection with Windows Formsをご覧ください。
編集:私が見つけたprevious SO questionを参照してください。それはかなり重複しています。申し訳ありませんがリンクを理解していません(それはそのようなことを言及するのは良いことです)。また、答えが受け入れられたにもかかわらず、もう1つの質問はまだ多くの回答/編集のために開いています。
ありがとう、しかし、私はそれらの両方を見ました。 MSDNの記事はCodeDOMで書かれていたので、実際には役に立たなかった。これは私が理解するのが少し難しく、前のSO投稿は基本的に同じMSDN記事へのリンクであった。私はもう少しモダンなものを好むだろう。おそらくラムダ?再度、お答えいただきありがとうございます。 – RCIX
Roger AlsingのMona Lisaプロジェクトは非常に良い例です。 http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/
EDIT:私が例が好きな理由は、やや小さく分かりやすいからです。遺伝的プログラミングの概念を理解するための迅速かつ簡単な方法です。ここで
あなたはショーン・ルークのECJ(Javaで進化的計算)のこのC#.NET 4.0ポートを試すことができます!しかし、作業中のコンソール・サンプルが多数(および変換中に開発された多くの有益な単体テスト)すぐに使用できるため、開始するのも比較的簡単です。
ベン
- 1. 遺伝的プログラミングStackoverflowエラー
- 2. 遺伝的プログラミングと検索アルゴリズム
- 3. 遺伝的アルゴリズムの遺伝子型
- 4. 遺伝的アルゴリズムとのサブセットの和を実装
- 5. 遺伝的プログラミングの目的でJavaでバイナリツリーを作成する
- 6. 遺伝的プログラミングにおけるテストケースの動的数は?
- 7. 遺伝的アルゴリズムの並列実行
- 8. 遺伝的アルゴリズム:フィットネス
- 9. DEAP遺伝的アルゴリズム
- 10. セルラー遺伝的アルゴリズム - セルラー遺伝的アルゴリズムでは、両親
- 11. 遺伝的プログラミングPythonのpyeasyGAとZelleのグラフィック
- 12. 線形遺伝プログラミング - エラーランドスケープ問題
- 13. 遺伝的プログラミングの性能を比較する
- 14. 遺伝的アルゴリズムトーナメントの選択
- 15. 遺伝的アルゴリズムフィットネススコアの問題
- 16. 遺伝的プログラムの段階
- 17. 遺伝的アルゴリズムの選択
- 18. 遺伝的アルゴリズムのコアアルゴリズム
- 19. 暗号の遺伝的アルゴリズム
- 20. 遺伝的アルゴリズムバイナリ表現
- 21. 遺伝的アルゴリズムSVM後
- 22. Scala用遺伝的アルゴリズムライブラリ
- 23. ディープコピーと遺伝的アルゴリズム
- 24. 遺伝的アルゴリズムの実装でローカル最大値に達した最大フィットネス
- 25. 遺伝的アルゴリズムの目的関数
- 26. 効率的な遺伝的アルゴリズム
- 27. 遺伝的アルゴリズムにおける遺伝子と染色体の表現
- 28. フローショップスケジューリングのための遺伝的アルゴリズム
- 29. Javaの遺伝的アルゴリズムクラシファイア:ルールベースのシステム
- 30. Javaでの遺伝的アルゴリズムの問題
クール!おかげさまでこれはたくさんの助けになるはずです。 – RCIX