首页 > 编程语言 >GeneticSharp 遗传算法类库

GeneticSharp 遗传算法类库

时间:2025-01-02 21:30:04浏览次数:1  
标签:类库 GeneticSharp phenotype ga var 遗传算法 bestFitness

GeneticSharp 是什么

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

GeneticSharp 的弱点:

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

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

概念

  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();
		}
	}
}

标签:类库,GeneticSharp,phenotype,ga,var,遗传算法,bestFitness
From: https://www.cnblogs.com/harrychinese/p/18648782

相关文章

  • 基于遗传算法优化VMD参数
    基于遗传算法优化多尺度排列熵参数,类似于粒子群算法优化参数基于遗传算法优化VMD参数程序列表基于遗传算法优化VMD参数/Code.m , 420基于遗传算法优化VMD参数/Cross.m , 1605基于遗传算法优化VMD参数/Decode.m , 1158基于遗传算法优化VMD参数/hua_fft.m , 1558基于......
  • 基础类库
    基础类库consoleconsole.log方法用于在console窗口输出信息。它可以接受多个参数,将它们的结果连接起来输出。Math属性ELN10LN2LOG2ELOG10EPISQRT1_2SQRT2以上属性的具体使用请参考ES5标准。方法absacosasinatanatan2ceilcosexpfloorlogmaxmin......
  • 遗传算法-生猪饲料比(一个接单任务)
    背景:饲料配方设计的方法比较多,常用的有传统手算法和现代计算机运算法。手算法包括试差法、对角线法和代数法等,手算法计算配方有它的局限性,即过程繁琐,计算量大,需要丰富的实践经验与较强的专业知识,往往经过反复计算才能得到结果,且无法得出最佳配方。随着计算机大数据在饲料配......
  • 遗传算法——附python实现与各方法的作用与修改
    前言遗传算法是数学建模中非常重要的一种搜索和优化算法,掌握遗传算法的精髓除了在竞赛中具有优势以外,更主要的是在解决实际问题的时候提供了一种全新的思路,通过将现实中的某种模式转换成算法,并用以解决某种问题的这种思路,或许是算法创新,提高效率的另一条路。本文将会介绍......
  • AWC2406分类库配置
    1)新版本的分类库视图:节点视图:前端用户可见的视图;类视图:实际存储分类对象的视图,同原来胖客户端的分类管理的视图;2)在Linux环境启动cmd命令窗口:TC_ROOT=/usr/Siemens/Teamcenterversion; export TC_ROOTTC_DATA=/usr/Siemens/Teamcenterversion/teamcenterdata; export TC_D......
  • 你有阅读过哪些类库的源码吗?你是如何阅读的?
    一、选择合适的类库在开始阅读源码之前,首先要选择一个合适的类库。可以根据自己的工作需求、技术兴趣或学习目标来选择。一些流行的前端类库如React、Vue、Angular等,它们的源码都是公开可查的,而且有着丰富的社区资源和文档支持。二、了解类库的整体架构在开始深入阅读源码之前,......
  • 现如今面对如层出不穷的类库,说说你的感受
    在前端开发领域,随着技术的快速发展,我们确实看到了层出不穷的类库和框架。这些工具为开发者提供了更多的选择和可能性,但同时也带来了一些挑战和考虑。以下是我对当前前端开发中众多类库的感受:选择多样性:如今,前端开发者可以从众多的类库中选择,以满足特定的项目需求。这种多样性使......
  • 【优化调度】基于遗传算法的公交车调度排班优化的研究与实现(Matlab代码实现)
     ......
  • 你有看过哪些框架或者类库的源码吗?通过看源码可以收获什么?
    我看过不少前端框架和类库的源码,主要集中在一些比较流行和核心的库,例如:React:重点关注过ReactDOM.render、useState、useEffect、fiber架构、reconciliation算法等部分的实现。Vue:研究过响应式系统reactive、ref、computed的实现,模板编译原理,以及v-dom的diff算法。Redux:......
  • 基于遗传算法的梯级水电站群优化调度研究(Python代码实现)
     ......