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)