C# 用遗传算法解日历拼图

IDE: Visual Studio 2012
视频:https://www.bilibili.com/video/BV1V3411W7HY/
源码下载:https://pan.baidu.com/s/1YIp6qK4bugnwR9uOkdcK-A?pwd=3xj7

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data;
using MySql.Data.MySqlClient;



namespace DayPuzzle {
   
	class Program {
   

		/// <summary>
		/// 要解的月份
		/// </summary>
		static int Month = 1;
		
		/// <summary>
		/// 要解的日份
		/// </summary>
		static int Day = 1;

		/// MySQL连接字符串
		static string MySQL_ConnectionString = "server = localhost; user = root; database = userdata; port = 3306; password = photon";

		static void Main(string[] args) {
   

			//当前遗传信息列表
			List<PuzzleSolutionGenetic> GeneticList = new List<PuzzleSolutionGenetic>();
			const int limit = 1000;	//遗传信息数量限制	1000 2000
			int comp = -1;	//求解完成记录变量

			//【调整】遗传信息种子记录字典 保存近似解
			Dictionary<string, int> GeneticSeedRecord = new Dictionary<string, int>();
			const int recordLimit = 40000;//遗传信息种子记录数量限制 4000 10000 40000 100000
			bool timeFlag = false;	//经过标志
			
			//获取日期输入
			GetDateInput();
			
			while (true) {
   
				
				//锁定拼图底盘对应点
				PuzzleMap.Map.Lock(Month, Day);

				//配置初始族群-------------------------------------------------------------------------------------
				#region 配置初始族群
				//变量初始化
				comp = -1;
				timeFlag = false;
				GeneticSeedRecord.Clear();
				GeneticList.Clear();

				//【调整】从MySQL数据库获取记录的遗传信息种子 添加到 遗传信息列表
				GeneticList.AddRange(PuzzleSolutionGenetic.Create(GetSeed_MySQL(Month, Day)));

				//添加随机遗传信息
				GeneticList.AddRange(PuzzleSolutionGenetic.Random(10000));
				#endregion
				//-------------------------------------------------------------------------------------

				while (true) {
   
					//计算适应度---------------------------------------------------------------------------------
					#region 计算适应度
					//遍历当前遗传信息列表
					for (int i = 0; i < GeneticList.Count; i++) {
   
						//判断 遗传信息 是否计算过 适应度
						if (GeneticList[i].Fitness == -1) {
   
							int fitness = GeneticList[i].GetFitness();	//计算适应度
							if (fitness == 0) {
   		//适应度0 求解成功
								comp = i;
								break;
							} else if (fitness < 8) {
   	//【调整】适应度 小于 特定值 为 近似解
								string seedStr = GeneticList[i].ToString();
								if (GeneticSeedRecord.ContainsKey(seedStr)) {
   	//判断该近似解是否存在于 记录中
									//若存在 调整 适应度值
									GeneticList[i].Fitness = GeneticSeedRecord[seedStr] >= 8 ? 8 : GeneticSeedRecord[seedStr]++;
								} else {
   
									//若不存在 将遗传信息 保存到 记录中
									GeneticSeedRecord.Add(seedStr, fitness);
									//近似解记录每添加10000个 置位 经过标志
									if ((GeneticSeedRecord.Keys.Count % 10000) == 0) {
   
									//if (GeneticSeedRecord.Keys.Count == 500) {
   
										timeFlag = true;
									}
								}
							}
						}
					}
					//求解成功退出循环
					if (comp != -1) {
   
						break;
					}
					#endregion
					//---------------------------------------------------------------------------------

					//淘汰适应度低的个体---------------------------------------------------------------------------------
					#region 淘汰适应度低的个体
					//如果当前遗传信息列表的元素数量 超过限制数量
					if (GeneticList.Count >= limit) {
   

						GeneticList.Sort();		//根据适应度对遗传信息进行排序

						GeneticList.RemoveRange(limit, GeneticList.Count - limit);	//移除适应度低的遗传信息
						//GeneticList.RemoveRange(limit/2, GeneticList.Count - (limit/2));
						//输出显示
						Console.WriteLine(" [" + Month + ", " + Day + "] -" + " [" + GeneticSeedRecord.Keys.Count + "]\t" + GeneticList[0].ToString()); 
						
						GeneticList[0].Fitness = -1;	//【调整】清除列表排序最前的遗传信息的适应度

					}
					#endregion
					//---------------------------------------------------------------------------------
					//生成子代---------------------------------------------------------------------------------
					#region 生成子代
					//遗传信息交叉
					List<PuzzleSolutionGenetic> cross = PuzzleSolutionGenetic.Crossover(GeneticList);
					GeneticList.AddRange(cross);
					//遗传信息变异
					List<PuzzleSolutionGenetic> mutation = PuzzleSolutionGenetic.Mutation(cross, 1);
					GeneticList.AddRange(mutation);

					//【调整】如果经过标志置位
					if (timeFlag == true) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值