笔者最近研究生课题研究一点与优化相关的内容,调研遗传算法觉得很合适(遗传算法此处不过多介绍),但网上都是matlab上面的实现方法,虽然很简单,但我要用在c#系统上面,就打算自己写一个,中间遇到了很多坑,千言万语汇成一句:写算法千万别用c#。
话不多说直接上代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace GAtest
{
public class GA
{
//定义种群大小、最大迭代次数、交叉概率和变异概率
private int populationSize = 30;
private int maxIterations = 100;
private double crossoverProbability = 0.7;
private double mutationProbability = 0.1;
private int inputSize = 1;//要优化的参数个数
//定义优化函数
private double Evaluate(double x)
{
return x+10*Math.Sin(5*x)+ 7 * Math.Cos(4 * x);
}
//定义个体类
class Individual
{
public double[] genes;//参数列表,此处例子为单参数优化
public double fitness;//适应度值
public List<int[]> genesCoding;//基因编码
public Individual(double[] genes, double fitness, List<int[]> genesCoding)
{
this.genes = genes;
this.fitness = fitness;
this.genesCoding = genesCoding;
}
}
//生成初始种群
private Individual[] InitializePopulation()
{
Random rand = new Random(GetRandomSeed());
Individual[] population = new Individual[populationSize];
for (int i = 0; i < populationSize; i++)
{
double[] genes = new double[inputSize];
//确定每个值的范围
genes[0] = rand.NextDouble() * 20 - 10; //随机生成[-10,10)之间的实数
//genes[1] = rand.NextDouble() * 4 + 1; //随机生成[1,5)之间的实数
List<int[]> genesCoding = GenesCoding(genes);//将值转化成编码
double fitness = Evaluate(genes[0]);
population[i] = new Individual(genes, fitness, genesCoding);
}
return population;
}
//编码
public List<int[]> GenesCoding(double[] individual)
{
List<int[]&g