GeneticSharp 遗传算法类库

GeneticSharp 是什么

GeneticSharp 是一个C#的遗传算法类库, 遗传算法Java著名的JMetal, Python也有JMetalPy和PyMoo, C#相对差一截, 稍微有名的是GeneticSharp库.

GeneticSharp 的弱点:

  • 不支持多目标优化
  • 没有实现流行的 NSGA II算法, 缺少拥挤度等计算, 所以解的多样性要差一些.
  • 对于整数型决策变量, 仅仅支持单个变量, 可以通过浮点数变量来代替, 只要将浮点数变量的小数位数设置为0.
  • 对于浮点型决策变量, 可支持多个变量

GeneticSharp 默认只支持最大值优化, 如果要支持最小值优化, 决策函数乘-1就可以了.

NSGAII 算法特点:

  • 种群大小保持一致:在 NSGA-II 中,父代种群和子代种群的大小是相同的。如果初始种群包含𝑁 个个体,那么在每一代中,子代的数量也将是 𝑁。
  • 选择机制:在合并的种群中(父代和子代的组合),算法根据非支配等级和拥挤度距离选择出 𝑁 个个体作为下一代的种群。因此,最终的可行解个数不会超过初始种群的个体数。
  • 多目标优化:尽管最终的可行解个数最多为 𝑁,但 NSGA-II 的目标是找到多个 Pareto 最优解,最终返回的解可能在目标空间中形成一个 Pareto 前沿。

概念

  1. 基因 Gene
    一个决策变量就是一个基因.
  2. 染色体 Chromosome, 即遗传算法中的个体, 这些个体将有可能成为一个个可行解.
    染色体由基因组成, 有多少个决策变量, 就由多少个基因组成.
    GeneticSharp 主要的染色体类型有 FloatingPointChromosome 和 IntegerChromosome, 前者对应浮点数决策变量, 后者对应整数型决策变量.
  3. Fitness 适应度
    遗传算法就是按照适应度来确定淘汰哪个个体, GeneticSharp 中适应度取值越大, 代表个体越优秀, 实际编程中, 适应度计算就是等同于目标函数.
  4. 约束
    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();
		}
	}
}
posted @   harrychinese  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示