C# GeneticSharp包

news2025/3/17 8:40:33

可以直接从nuget安装GeneticSharp包

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#实现一个简单遗传算法

使用C#实现遗传算法 - 宁静致远. - 博客园

示例代码讲解

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2316517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode做题记录----3

1474、删除链表M个节点之后的N个节点 思路&#xff1a; 1、两个循环解决问题 第一个循环移动M个位置&#xff0c;第二个循环确定移动N个位置后的&#xff0c;然后将M位置的节点的next指向&#xff0c;N位置后的节点即可 2、注意边界条件和判空处理 代码实现&#xff1a; pub…

React(二):JSX语法解析+综合案例

事件绑定 this绑定方式 问题&#xff1a;在事件执行后&#xff0c;需获取当前类的对象中相关属性&#xff0c;此时需要this——当打印时&#xff0c;发现this为undefined,这又是为啥&#xff1f; 假设有一个btnClick函数&#xff0c;但它并不是我们主动调用的&#xff0c;而是…

Gitee重新远程连接仓库(Linux)

Gitee重新远程连接仓库&#xff08;Linux&#xff09; 因为虚拟机重新安装了一回&#xff0c;所以需要重新和远程仓库连接&#xff0c;在网上找了很久没有找到相关操作&#xff0c;自己实操成功&#xff0c;记录下本博客&#xff0c;帮助有需要的人 确保新虚拟机安装Git 在新虚…

Vitis HLS中的Array Partition与Array Reshape详解

Vitis HLS中的Array Partition与Array Reshape详解 引言 在高层次综合(HLS)设计中&#xff0c;数组是最常用的数据结构之一&#xff0c;但默认情况下&#xff0c;HLS会将数组映射到单个BRAM块&#xff0c;这会限制并行访问能力&#xff0c;成为性能瓶颈。为了克服这一限制&am…

Centos离线安装openssl

文章目录 Centos离线安装openssl1. openssl是什么&#xff1f;2. openssl下载地址3. openssl-devel安装4. 安装结果验证5. 版本查看 Centos离线安装openssl 1. openssl是什么&#xff1f; OpenSSL 是一个开源的、跨平台的 加密工具库 和 命令行工具集&#xff0c;广泛用于实现…

protobuf安装

安装 github官方链接 https://github.com/protocolbuffers/protobuf/ 以protobuf21为例 https://github.com/protocolbuffers/protobuf/releases/download/v21.11/protobuf-all-21.11.zip windows 解压好文件夹后,使用cmake,vs,qt creator等工具打开该项目,进行编译,编译需…

《基于超高频RFID的图书馆管理系统的设计与实现》开题报告

一、研究背景与意义 1.研究背景 随着信息化时代的到来&#xff0c;运用计算机科学技术实现图书馆的管理工作已成为优势。更加科学地管理图书馆会大大提高工作效率。我国的图书管理体系发展经历了三个阶段&#xff1a;传统图书管理模式、现代图书管理模式以及基于无线射频识别&…

小程序渲染之谜:如何解决“加载中...”不消失的 Bug(glass-easel)

&#x1f389; 小程序渲染之谜&#xff1a;如何解决“加载中…”不消失的 Bug &#x1f389; 引言 在小程序开发中&#xff0c;渲染问题总能让人抓狂。&#x1f62b; 这次&#xff0c;我遇到了一个奇怪的 bug&#xff1a;产品详情页的内容已经正常显示&#xff0c;但页面却一…

网络原理之HTTPS(如果想知道网络原理中有关HTTPS的知识,那么只看这一篇就足够了!)

前言&#xff1a;随着互联网安全问题日益严重&#xff0c;HTTPS已成为保障数据传输安全的标准协议&#xff0c;通过加密技术和身份验证&#xff0c;HTTPS有效防止数据窃取、篡改和中间人攻击&#xff0c;确保通信双方的安全和信任。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要…

五子棋小游戏-简单开发版

一、需求分析 开发一个基于 Pygame 库的五子棋小游戏&#xff0c;允许两名玩家在棋盘上轮流落子&#xff0c;当有一方达成五子连珠时游戏结束&#xff0c;显示获胜信息&#xff0c;并提供退出游戏和重新开始游戏的操作选项。 1.棋盘显示 &#xff1a; 显示一个 15x15 的五子棋…

2025中国科技大学少年班/创新试点班·初试备考测试卷(数学)

本卷考查内容&#xff1a;高中课程内容及拓展。 本卷考查形式&#xff1a;书面作答&#xff08;客观题18小题解答题4题&#xff09;。 卷首语&#xff1a;中科大少年班、创新班每年大规模招录在数理成绩优异的中学学生。其中初试数学题在高考基础上略有拓展&#xff0c;难度又低…

即时通讯平台测试报告

1.项目概述 项目名称&#xff1a;即时通讯平台 版本号&#xff1a;V1.0.0 测试周期&#xff1a;2025年2月25日--2025年3月15日 测试目标&#xff1a;验证核心功能&#xff08;登录、注册、消息收发、用户管理、群组功能等&#xff09;的稳定性和性能指标。 2. 测试范围 功…

如何记录Matlab程序运行过程中所占用的最大内存

有些时候&#xff0c;我们需要分析Matlab程序运行过程中所占用的最大内存。如果只是得到程序运行到当前位置所占用的内存&#xff0c;可以简单在程序当前位置插入memory命令即可&#xff1a; user memory; MemUsed_now user.MemUsedMATLAB; 但如果我们想要的是整个程序在运行…

WIN11开发环境变量记录

这里写自定义目录标题 总图JAVA环境变量配置GIT环境变量配置NODEJS环境变量配置 总图 JAVA环境变量配置 新建系统变量。变量名&#xff1a;JAVA_HOME&#xff0c;变量值&#xff08;可以选择浏览目录&#xff0c;JAVA的根目录&#xff0c;本处为D:\Java\jdk1.8.0_251&#xff…

易语言模拟真人鼠标轨迹算法

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

洛谷P9950 [USACO20FEB] Mad Scientist B

P9950 [USACO20FEB] Mad Scientist B - 洛谷 代码区&#xff1a; #include <iostream> #include <string>using namespace std; int main() {int n;cin>> n;string a;string b;cin >> a >> b;int flag,step0,i,t;for ( i 0; i < a.length(…

prometheus自定义监控(pushgateway和blackbox)和远端存储VictoriaMetrics

1 pushgateway采集 1.1 自定义采集键值 如果自定义采集需求时&#xff0c;就可以通过写脚本 定时任务定期发送数据到 pushgateway 达到自定义监控 1.部署 pushgateway&#xff0c;以 10.0.0.42 节点为例 1.下载组件 wget https://github.com/prometheus/pushgateway/relea…

C++相关基础概念之入门讲解(上)

1. 命名空间 C中的命名空间&#xff08;namespace&#xff09;是用来避免命名冲突问题的一种机制。通过将类、函数、变量等封装在命名空间中&#xff0c;可以避免不同部分的代码中出现相同名称的冲突。在C中&#xff0c;可以使用namespace关键字来定义命名空间。 然后我们在调…

【大模型】Transformer、GPT1、GPT2、GPT3、BERT 的论文解析

前言 在自然语言处理&#xff08;NLP&#xff09;和深度学习的快速发展中&#xff0c;Transformer模型和 GPT系列模型扮演了至关重要的角色。本篇博客旨在对这些开创性的论文进行介绍&#xff0c;涵盖它们的提出时间、网络结构等关键信息&#xff0c;能够快速的理解这些模型的设…

【Java 优选算法】分治-归并排序

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 数组分块如二叉树的前序遍历, 而归并排序就如二叉树的后序遍历 912. 排序数组 解法 使用归并算法 根据中间点划分区间, mid (right left ) / 2将左右区间排序合并两个有…