GeneticSharp 是什么
GeneticSharp 是一个C#的遗传算法类库, 遗传算法Java著名的JMetal, Python也有JMetalPy和PyMoo, C#相对差一截, 稍微有名的是GeneticSharp库.
GeneticSharp 的弱点:
- 不支持多目标优化
- 没有实现流行的 NSGA II算法, 缺少拥挤度等计算, 所以解的多样性要差一些.
- 对于整数型决策变量, 仅仅支持单个变量
- 对于浮点型决策变量, 可支持多个变量
GeneticSharp 默认只支持最大值优化, 如果要支持最小值优化, 决策函数乘-1就可以了.
概念
- 基因 Gene
一个决策变量就是一个基因. - 染色体 Chromosome, 即遗传算法中的个体
染色体由基因组成, 有多少个决策变量, 就由多少个基因组成.
GeneticSharp 主要的染色体类型有 FloatingPointChromosome 和 IntegerChromosome, 前者对应浮点数决策变量, 后者对应整数型决策变量. - Fitness 适应度
遗传算法就是按照适应度来确定淘汰哪个个体, GeneticSharp 中适应度取值越大, 代表个体越优秀, 实际编程中, 适应度计算就是等同于目标函数. - 约束
GeneticSharp 没有专门的约束处理机制, 我们可以通过自定义的 IFitness 接口来间接实现约束, 对于不符合约束条件的情况, 对应的 fitness 取值调到最小, 即这些不符合约束的个体直接被淘汰即可.
使用C#实现一个简单遗传算法
https://www.cnblogs.com/friend/p/17472506.html
示例代码讲解
https://diegogiacomelli.com.br/function-optimization-with-geneticsharp/
using System;
using GeneticSharp;
namespace FunctionOptimizationWithGeneticSharp
{
class MainClass
{
/// <summary>
/// 定义 Fitness 类
/// </summary>
public class DistinaceFitness : IFitness
{
public double Evaluate(IChromosome c)
{
var fc = c as FloatingPointChromosome;
var values = fc.ToFloatingPoints();
var x1 = values[0];
var y1 = values[1];
var x2 = values[2];
var y2 = values[3];
//假设有一个约束函数 x1+x2+y1+y2>=5
if (x1+x2+y1+y2<5) {
//违法约束, 适应度赋值为0
return 0.0 ;
}
return Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));
}
}
public static void Main(string[] args)
{
float maxWidth = 998f;
float maxHeight = 680f;
//定义染色体个数和取值范围
var chromosome = new FloatingPointChromosome(
new double[] { 0, 0, 0, 0 }, //包含4个决策变量, 这里定义每个决策变量的最小值
new double[] { maxWidth, maxHeight, maxWidth, maxHeight }, //包含4个决策变量, 这里定义每个决策变量的最大值
new int[] { 10, 10, 10, 10 }, //每个决策变量占用bit数, 一般取值为10或64
new int[] { 0, 0, 0, 0 }); //每个决策变量小数部分位数
//定义种群规模, 种群规模最小size为2, 否则无法交配.
var population = new Population(50, 100, chromosome);
//定义Fitness
var fitness = new DistinaceFitness();
//定义遗传算法因子
var selection = new EliteSelection();
var crossover = new UniformCrossover(0.5f);
var mutation = new FlipBitMutation();
//生成遗传算法对象
var ga = new GeneticAlgorithm(
population,
fitness,
selection,
crossover,
mutation);
//定义递归终止条件
var termination = new FitnessStagnationTermination(100);
ga.Termination = termination;
Console.WriteLine("Generation: (x1, y1), (x2, y2) = distance");
var latestFitness = 0.0;
//在算法执行之前, 可以定义每一代运算的回调事件
ga.GenerationRan += (sender, e) =>
{
//通过 ga.BestChromosome 获取截止当前最好的染色体
var bestChromosome = ga.BestChromosome as FloatingPointChromosome;
//通过 ga.BestChromosome.Fitness 获取截止当前最好的适应度, 即目标函数值
var bestFitness = bestChromosome.Fitness.Value;
//通过 ga.GenerationsNumber 输出算法已经迭代了多少代
if (bestFitness != latestFitness)
{
latestFitness = bestFitness;
var phenotype = bestChromosome.ToFloatingPoints();
Console.WriteLine(
"Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
ga.GenerationsNumber,
phenotype[0],
phenotype[1],
phenotype[2],
phenotype[3],
bestFitness
);
}
};
//运行遗传算法
ga.Start();
//输出最终结果
var bestChromosome = ga.BestChromosome as FloatingPointChromosome;
var phenotype = bestChromosome.ToFloatingPoints();
var bestFitness = bestChromosome.Fitness.Value ;
Console.WriteLine(
"Final Generation {0,2}: ({1},{2}),({3},{4}) = {5}",
ga.GenerationsNumber,
phenotype[0],
phenotype[1],
phenotype[2],
phenotype[3],
bestFitness
);
Console.ReadKey();
}
}
}
标签:类库,GeneticSharp,phenotype,ga,var,遗传算法,bestFitness
From: https://www.cnblogs.com/harrychinese/p/18648782