C# GeneticSharp包

可以直接从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();
		}
	}
}

《餐馆点餐管理系统——基于Java和MySQL的课程设计解析》 在信息技术日益发达的今天,餐饮行业的数字化管理已经成为一种趋势。本次课程设计的主题是“餐馆点餐管理系统”,它结合了编程语言Java和数据库管理系统MySQL,旨在帮助初学者理解如何构建一个实际的、具有基本功能的餐饮管理软件。下面,我们将深入探讨这个系统的实现细节及其所涉及的关键知识点。 我们要关注的是数据库设计。在“res_db.sql”文件中,我们可以看到数据库的结构,可能括菜品表、订单表、顾客信息表等。在MySQL中,我们需要创建这些表格并定义相应的字段,如菜品ID、名称、价格、库存等。此外,还要设置主键、外键来保证数据的一致性和完整性。例如,菜品ID作为主键,确保每个菜品的唯一性;订单表中的顾客ID和菜品ID则作为外键,与顾客信息表和菜品表关联,形成数据间的联系。 接下来,我们来看Java部分。在这个系统中,Java主要负责前端界面的展示和后端逻辑的处理。使用Java Swing或JavaFX库可以创建用户友好的图形用户界面(GUI),让顾客能够方便地浏览菜单、下单。同时,Java还负责与MySQL数据库进行交互,通过JDBC(Java Database Connectivity)API实现数据的增删查改操作。在程序中,我们需要编写SQL语句,比如INSERT用于添加新的菜品信息,SELECT用于查询所有菜品,UPDATE用于更新菜品的价格,DELETE用于删除不再提供的菜品。 在系统设计中,我们还需要考虑一些关键功能的实现。例如,“新增菜品和价格”的功能,需要用户输入菜品信息,然后通过Java程序将这些信息存储到数据库中。在显示所有菜品的功能上,程序需要从数据库获取所有菜品数据,然后在界面上动态生成列表或者表格展示。同时,为了提高用户体验,可能还需要实现搜索和排序功能,允许用户根据菜品名称或价格进行筛选。 另外,安全性也是系统设计的重要一环。在连接数据库时,要避免SQL注入攻击,可以通过预编译的PreparedStatement对象来执行SQL命令。对于用户输入的数据,需要进行验证和过滤,防止非法字符和异常值。 这个“餐馆点餐管理系统”项目涵盖了Java编程、数据库设计与管理、用户界面设计等多个方面,是一个很好的学习实践平台。通过这个项目,初学者不仅可以提升编程技能,还能对数据库管理和软件工程有更深入的理解。在实际开发过程中,还会遇到调试、测试、优化等挑战,这些都是成长为专业开发者不可或缺的经验积累
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值