-
09-09-2019 - |
题
我熟悉基因编程的一般性,但想知道我可能会发现一些东西向我展示实施遗传编程的细节。我使用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 + ")");
}
可能会有一些小错误,但否则看起来还可以。另外,它可以以C#的精神来更好地编写,但这只是细节。 :)
其他提示
罗杰·阿尔辛(Roger Alsing)的莫娜·丽莎(Mona Lisa)项目是一个很好的例子。http://rogeralsing.com/2008/12/07/genetic-programming-evologry-evolution-of-mona-lisa/
编辑:我喜欢这个示例的原因是因为它相当小且易于理解。这是掌握基因编程概念的快速简便方法。
你可以看 优胜节的生存:窗户形式的自然选择.
编辑:请参阅此 以前的问题, ,我刚刚找到。这几乎是重复的。抱歉,您不了解链接(很高兴在问题中提及此类链接)。另外,即使接受了答案,另一个问题仍然开放,以获取更多答案/编辑。
您可以尝试此C#.NET 4.0 Sean Luke的ECJ港口(Java中的进化计算):
http://branecloud.codeplex.com
这是非常灵活且功能强大的软件!但这也相对容易入门,因为它包含许多开箱即用的工作台样本(以及在转换过程中开发的许多有用的单元测试)。
本
不隶属于 StackOverflow