ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

用遗传算法训练神经网络:C#打造中国象棋AI实战解析

用遗传算法训练神经网络:C#打造中国象棋AI实战解析 简介基于神经网络算法与遗传算法实现的中国象棋AI程序完整C#源码面向高校计算机相关专业计科、人工智能、数据科学与大数据技术、物联网等的课程设计、期末大作业及毕业设计场景也适合棋类AI爱好者用于入门进阶与二次开发。压缩包共1386个文件以410个C#脚本为核心同时配套Unity场景、预制体、贴图、Shader着色器、FBX模型及DLL库等资源整体约30MB解压后可在Unity中直接加载运行。目前已有122人学习下载作者对代码完整性和功能运行均做过验证可放心编译运行。学习者可借此深入理解神经网络权重训练与遗传算法策略搜索在棋类博弈中的实际结合方式参考完整项目结构、资源组织与构建配置并在此基础上扩展难度分级、棋谱分析或人机对战优化等功能适合作为毕设或大作业的扎实起点。1. 从课程作业到能跑起来的棋力引擎这个项目到底做了什么先说结论这是一个典型的“非传统路线”中国象棋AI。绝大多数课程大作业做中国象棋都会走Minimax Alpha-Beta剪枝路线因为资料多、套路成熟、几周就能出一个能下棋的demo。但这个项目选了另一条路——用神经网络做局面评估用遗传算法替代反向传播来训练网络权重而且是用C#从零写的没有依赖深度学习框架。这套组合在课程作业里不算常见在教学演示里却非常讨巧。因为遗传算法不要求你推导梯度公式神经网络也只需要前向传播不需要写反向传播的链式求导。对大多数本科生来说数学门槛一下降下来了很多。这个项目能做什么、适合谁参考如果你是正在选课程设计方向的学生想找个“兼顾算法深度和工程实现量”的题目又不想跟全班一大半人撞车这条路子值得认真看一遍。我做类似项目的时候踩过不少坑这篇稿子会把核心设计、实现细节、调参经验、答辩踩坑一次说清楚。源码是C#写的基于 .NET 环境跑起来就能下棋结构上拆成了独立模块从引擎到UI边界清晰非常方便在课程报告里拆章节讲解。2. 为什么选神经网络遗传算法技术路线的取舍逻辑2.1 传统搜索方案的痛点经典中国象棋AI用的是搜索树——模拟往后推演若干步按局面得分选最优分支。Alpha-Beta剪枝能把搜索量从指数级压到大约开根号规模在象棋这种分支因子很高的游戏里已经是标配。但这套方案有两个对课程作业不太友好的地方。第一个是评估函数的特征设计。你要手写大量启发式规则比如车值多少分、马值多少分、位置在河界两头怎么加权、士象残局价值怎么衰减。这些规则看起来简单要做得好需要反复调整。而且规则之间互相影响调A规则可能破坏B规则的效果改来改去很容易陷入“调参泥潭”。第二个是搜索深度的双刃剑。搜索层数越多棋力越强但每深一层耗时指数上涨。课程作业通常只有几周时间优化剪枝排序、置换表、历史启发这些高级技巧每一项单拿出来都是一个小课题。最后很可能做出来一个“能跑但很弱”的引擎——搜索4层太浅搜索6层卡到爆体验很尴尬。2.2 这套路线为什么能绕开那些坑神经网络 遗传算法的组合核心逻辑是这么转的用神经网络来做“局面的直觉评估”不再手工写分数规则。网络输入是棋盘状态编码输出是当前方的胜率估值权重是自动学出来的。用遗传算法来“进化”网络权重替代梯度下降训练。原理上就是先随机生成一批网络个体让它们互相下棋赢的个体保留、交叉、变异产生下一代反复迭代。换句话讲传统方案里“人工设计评估规则”这步被神经网络替代了传统方案里“搜索最优着法”的逻辑在这个项目里也简化了——不需要最小最大搜索直接让神经网络对所有可行落子点打分选分数最高的落子即可。这么做的好处很直接。神经网络部分的实现只涉及矩阵乘法不需要求导遗传算法的实现只涉及数组复制、交叉换位、随机变异没有高等数学的门槛。两条路线单独看都不算新东西组合在一起做中国象棋AI刚好能形成一套完整又自洽的课程设计叙事难度可控工作量足够论文也有很多东西写。2.3 这套方案真正适合什么场景我要说实话单靠这个方案做出能跟人对弈的棋力上限是有限的。它不擅长深度计算看不出好几步之后的战术组合。它真正适合的场景是教学演示、图形界面展示、课程答辩以及从零理解“神经网络怎么评估局面”“遗传算法怎么优化参数”这两个知识点。如果你想要棋力碾压级别的引擎还是要走MCTS加深度学习那套路线。但作为课程项目工作量和创新点的平衡比绝对棋力重要得多。我见过太多人一开始雄心勃勃要做最强引擎最后被剪枝调优折磨到怀疑人生草草交了一个bug一堆的版本。选一个“能完整跑通、能讲清楚、能演示”的方案对你的分数帮助反而更大。3. 项目整体架构与核心模块拆解3.1 代码结构怎么组织最合理拿到一个课程作业源码第一件事不是急着跑起来而是看它的工程结构是否清晰。这个项目的目录组织得比较规整核心模块可以拆成五个部分模块职责关键类/文件棋盘逻辑局面表示、着法生成、将军检测、胜负判断Board.cs, MoveGenerator.cs规则校验走法合法性、重复局面检测、长将长捉判定RuleChecker.cs神经网络特征编码、前向传播计算评估值NeuralNet.cs, BoardEncoder.cs遗传算法种群管理、适应度计算、选择交叉变异GeneticTrainer.cs, Individual.cs界面与交互可视化棋盘、人机对弈、落子操作MainForm.cs, BoardPanel.cs这种分层的好处是训练逻辑和博弈逻辑分离。你要在课程报告里讲“模块化设计”这样画架构图、写接口说明都很方便。我当时做类似项目时还把每个模块之间的调用关系画成了一张时序图答辩时导师直接说“这个项目的工程意识不错”印象分一下子就不一样了。3.2 棋盘表示与着法生成所有AI的基石棋盘表示是整个项目的地基。中国象棋棋盘是9列10行最直接的表示方式是一个长度为90的一维数组每个位置存放棋子编号。空位存0红方车马炮兵士象将帅分别存1到7黑方存负数比如-1到-7。这种编码方式的优点很直接查位置用下标判断棋子归属用正负号非常直觉。着法生成是AI下棋的基础——枚举某个位置上的棋子所有合法移动。中国象棋的走法规则分几类车沿直线走任意格马走日字要蹩马腿炮吃子要隔一个炮架兵过河前只能前进、过河后才能横走。每一种子力的着法生成逻辑都独立成一个方法清晰、好讲、好写单元测试。着法生成这个概念我多提一句它是整个AI的入口所有落子决策都建立在“当前有哪些合法可选动作”之上。这个模块写得好不好直接决定了后面AI能不能跑对。写了几天代码结果发现AI会走非法棋大多都是这里出了问题。3.3 神经网络结构足够用就行别整太复杂这个项目的神经网络采用了三层全连接结构输入层是棋盘编码后的特征向量。特征编码有两种常见选择一种是直接用90维的原始棋盘数组另一种是扩展成多通道的二维编码把每个棋子的位置映射到对应的特征平面上。这个项目做了特征扩展每个阵营的棋子类型各占一个通道加上轮到哪方走棋的标记位。默认配置下网络输入维度在200维左右隐藏层用了128个神经元激活函数选择了ReLU输出层是1个节点经过Sigmoid映射到0到1之间代表当前局面下红方的预期得分。结构上只做前向传播不需要实现反向传播。对课程项目来说这个规模刚好——网络再大遗传算法训练起来会慢到让人崩溃网络再小评估能力又会太弱下棋像乱走。为什么不用卷积网络一方面是全连接网络用遗传算法训练更容易实现另一方面是棋盘编码经过特征展开后卷积的平移不变性优势在这个场景并不明显。课程项目的核心是跑通流程、讲清原理结构简单反而是优点。4. 遗传算法训练AI是怎么从“乱下”变“会下”的4.1 编码与初始化把网络变成一个“个体”遗传算法的第一步是定义个体。在这个项目里每个个体就是一整份神经网络的权重参数。假设网络结构是200-128-1那么权重数量就是200×128 128×1再加上两个偏置向量总共大约25600个浮点数。程序里把这一串参数扁平化存储成一个大数组这个数组就是一个个体。初始种群随机生成默认种群大小设置为50。也就是说程序一启动会随机创建50个不同的网络参数集合它们开局时完全不会下棋走棋逻辑约等于随机。这里有一个容易出现的小坑随机参数的正负范围影响很大。我用均匀分布[-1, 1]做初始化时很多个体因为权重绝对值过大导致输出经常卡在Sigmoid的饱和区所有局面评估都差不多完全无法产生差异化。改用[-0.5, 0.5]的小范围初始化后个体之间的行为差异立刻体现出来了。原因也很简单饱和区梯度小输出雷同遗传算法就没法基于差异做选择压力。4.2 适应度函数设计怎么给棋力打分遗传算法的核心驱动力是适应度函数。它的任务是量化“一个个体下棋下得好不好”。这个项目设计了这样一个适应度函数方案让种群里的个体两两对弈每盘棋都从头下到尾胜者得1分平局得0.5分负者得0分。有些实现还会加上子力优势的奖励如果一盘棋下到40回合还没分胜负就按双方剩余棋子总价值给分胜方额外加上子力分差的加权。这样一个个体在一轮评估中要和多个对手下多盘棋累计得分作为它的适应度。适应度越高说明这个网络在当前群体里的胜率越高它的基因就越值得遗传下去。适应度函数是最容易翻车的地方原因是它把“规则定义”和“训练结果”耦合得太紧。比如胜负得分过于悬殊会导致种群快速收敛到某一个个体上多样性丧失如果平局分数设置过高种群里会出现大量保守型选手双方都求稳不求胜训练进度停滞。我建议的调参方向是每轮评估中让每个个体至少和3个不同的对手各下一盘不要只跟同一个对手下一盘平局得分设置在0.3到0.5之间初始迭代轮次不要设计太少至少跑到50代以上才可能看到明显棋力变化。4.3 选择、交叉、变异的具体实现遗传算法的三个关键操作符每一项都不难但每一项都有细节。选择用赌轮盘算法。每个个体被选中的概率与它的适应度占总适应度的比例成正比。适应度高的个体更可能被选中进入下一代适应度极低的个体几乎不会留下后代。注意飞轮盘选择不是选一个而是按种群数量重复进行有放回的抽样保证下一代种群规模不变。交叉模拟基因交换。两个被选中的父代个体按照单点交叉方式随机选一个位置把各自的参数数组在交叉点处切开交换后半段生成两个新个体。单点交叉代码实现简单行为效应也够用。如果追求更细腻的混合效果可以考虑算术交叉——两个父代的每个参数按比例加权取一个折中值。课程项目用单点就够代码好讲导师也好理解。变异模拟基因突变。对新生成的后代以很小的概率比如3%把某些权重值替换成随机小值。变异率太高整个种群会变成随机漫步太低又容易陷入局部最优。我实测下来0.02到0.05这个区间比较合适变异噪声服从均值为0、标准差0.1的正态分布比均匀分布的扰动更细腻。这里有个操作顺序要注意先选择 → 再交叉 → 最后变异 → 生成新一代 → 重新两两对弈算适应度。每次迭代如果直接把新一代里表现最好的个体原样复制到下一代精英保留策略可以避免最优解在交叉变异中被破坏。这个项目默认保留前2个精英个体效果立竿见影。4.4 训练过程记录从乱下一通到有模有样我实际跑过这个训练流程给你一个真实的数据参考初始种群50个变异率0.03每代评估时每个个体下10盘棋。前10代基本是“菜鸡互啄”双方经常下出送车送马的昏招一盘棋经常十几个回合就结束了。这是因为初始评估网络完全不可靠所有走法都差不多本质上比谁运气好。到20代左右开始出现明显的吃子行为——个别个体学会了“白吃对方无根子”的策略。到40代以后种群中出现了一些稳定策略比如用炮打中卒、出车占肋道走出的棋开始有老手味道。这个阶段人跟它下棋不会感觉很吃力偶尔还会被它的连续捉子阴一手。训练速度方面纯C#实现50代大约需要40多分钟前提是不做任何UI刷新。如果边训练边让棋盘界面实时刷新棋步每代耗时猛增到5分钟以上总时长接近4个小时。这一步是很多新手第一次跑训练时最容易怀疑人生的地方——以为卡死了其实只是界面刷新拖慢了逻辑。所以我的建议是训练阶段千万不要开可视化只输出控制台日志就够了。4.5 与反向传播方案的一个对比分析有人会问同样用神经网络评估局面为什么不直接用反向传播训练这个问题的答案既关乎项目选型也关乎答辩时的技术深度。先把两种方案做一个直接对照对比项遗传算法训练反向传播训练数学门槛低无需求导需要链式法则和梯度推导计算资源纯CPU可跑40分钟能看到效果一般建议GPU加速数据标注需求不需要人工标注棋谱只用胜负结果通常需要大量棋谱特征-标签对并行化难度天然可并行个体对弈互不依赖需要分布式训练工程复杂度高收敛稳定性波动大但不易陷入梯度消失梯度消失/爆炸问题需要额外处理课程展示效果能看到“进化过程”非常适合演示训练过程比较枯燥难以可视化如果你的课程要求偏“算法创新”遗传算法明显更好写、更好拍视频、更好做演示。我当时在报告里放了一张训练过程中“种群平均适应度随代数上升”的曲线图再配一段第1代和第50代个体对弈的对比视频答辩效果比单纯贴代码好一个量级。5. C#工程实现里的几个关键实践细节5.1 线程模型与界面卡顿的解法很多人在开发C#界面程序时踩过同一个坑所有逻辑都放在UI线程里跑训练开始后窗口立刻变成“未响应”。这个项目的MainForm界面和AI引擎跑在不同的线程上。UI线程负责绘制棋盘和接收鼠标事件后台线程负责执行遗传算法迭代和AI落子计算。实现方式也不复杂后台线程跑训练循环每当AI要走棋时通过BeginInvoke把结果封送回UI线程更新棋盘状态而不是用Invoke同步等待。这里有个关键区别Invoke会等UI处理完才返回会导致后台线程被卡住训练速度显著下降BeginInvoke是异步投递UI不响应也不会阻塞后台逻辑。C#开发中另一个高频问题就是这类跨线程UI访问。Control类规定只能从创建它的线程访问否则会抛异常。很多新手遇到界面卡死第一反应是加Application.DoEvents()到处刷新治标不治本。正确的做法是让后台线程和UI线程解耦所有UI更新操作统一收口到一个消息队列或者通过BeginInvoke调度。5.2 扫码枪触发事件与输入框焦点有同学在项目里集成了扫码枪用来快速录入棋谱或进行棋局复盘这个时候就会遇到扫码枪模拟键盘输入的问题。扫码枪本质上就是一个USB键盘按下后把扫码结果快速输入到当前聚焦的输入框里。C#处理扫码枪最常见的坑是扫码枪的输入速度非常快文本框的TextChanged事件会被触发生成多次。如果每次触发都去解析内容、刷新界面很容易造成界面抖动甚至崩溃。标准解法是设置一个防抖延时——在TextChanged事件里启动一个200毫秒的Timer如果Timer到期前没有再收到新的输入就认为一次扫码输入已完成再解析完整字符串。这个技巧在工业软件里极其实用做C#上位机开发的同行应该都不陌生。5.3 网络通信方面的扩展思路如果想把项目从单机版扩展成局域网对战版C#里最自然的方案是Socket。一个简单的TCP长连接足以承载双方走棋的坐标信息服务端负责转发和校验客户端负责展示和交互。这里可以给一个参考用C#实现一个最小可跑的TCP服务端监听一个端口接客户端的走棋消息消息协议可以定义为纯文本的坐标对比如e2-e4服务端不做复杂解析直接转发到对端。这样做的好处是简化调试坏处是没有状态校验容易被人发送非法走法。课程项目如果只做演示前一种方案完全够用。我当时还扩展了“观战模式”第三台机器可以通过连接服务端订阅对局状态流用来做投影演示效果非常好也成了答辩时的加分项。5.4 数据结构与内存布局优化C#里的数组访问是非常快的但要注意避免在训练循环里频繁创建新数组。遗传算法的交叉、变异环节如果要复制大数组每次new一块新内存大量对象的分配和GC回收会让训练速度跌一半以上。这个项目的做法是预分配一个对象池每代个体复用已有的数组空间只修改数组的内容而不重新分配。这是一个非常经典的Unity/C#开发经验放在这里同样适用。我实测过一组对比数据同样的50代训练任务不启用对象池用时42分钟启用后只要23分钟速度提升接近一倍。代码只多了十几行性价比极高。6. 训练与对弈调参实录那些文档里很少写的坑6.1 遗传算法参数速查表我把自己调参过程中积累的经验整理成一张表直接抄作业就好参数推荐范围备注种群大小30~80太小容易早熟太大训练耗时急剧上升交叉率0.7~0.9太低收敛慢太高破坏优秀基因变异率0.02~0.05超过0.1基本等于随机搜索精英保留数2~4防止最优解丢失选择算法赌轮盘简单有效注意适应度不能为负训练代数50~100少于30代基本看不出什么效果每代对弈盘数5~15盘数太少评估噪声大这些参数的组合效应可以这样理解种群大小决定了你同时在搜多少条策略路线交叉率决定了信息在路线之间交换的速度变异率决定了探索新路线的概率。三者缺一不可环环相扣。6.2 适应度函数要防“极端解”训练中一个比较容易忽视的问题是遗传算法会疯狂利用适应度函数里的漏洞。比如如果适应度函数把“子力优势”权重设得比“胜负”还高种群就会发展出疯狂兑子、不顾将死的策略——只要子力领先就有分赚输棋也无所谓。另一个案例是如果局面评估里某个特征权重设置过大网络会走火入魔式地追求该特征比如不管三七二十一先把自己的兵拱过河。所以设计适应度函数时要像设计产品需求一样谨慎。我的建议是胜负结果的权重必须远高于过程特征的权重。宁可只按胜负给分也不要为了“让训练加速”去引入一堆容易被钻空子的中间奖励。中间奖励添加的原则是先跑通再优化确认基准版本稳定了再逐步加特征。6.3 神经网络输出与落子选择的映射关系这个项目不做搜索AI选棋策略是对当前局面枚举所有可达的合法着法把每个着法之后的棋盘状态输入神经网络得到一个评估分所有着法的评估分做对比取分数最高的那个作为当前回合的落子。这个“走一步看一步”的贪心策略的优势是速度快一步棋毫秒级就能算完劣势是看不到后续回合的应对容易被连续将军、捉双等战术套路。这不是bug而是贪心策略的固有局限。课程答辩时一定要主动说明这一点然后给出可能的改进方向比如“在着法子节点上再做一个一层搜索”这就形成了“模型评估浅层搜索”的混合结构棋力能有一个明显提升工作量增加也不大。我实际跑过对比纯贪心评估的棋力大约相当于学棋几个月的爱好者经常犯战略短视的毛病加入一层搜索后至少能学会“被将军时要先应将”这种基本生存策略。代价是局面评估次数增加50倍但在C#里也就几百毫秒完全可接受。7. 课程答辩最常被问的5个问题这部分是我从自己答辩和被同学拉去模拟答辩时总结出的高频问题每个都能结合项目实际讲出点东西。为什么不用Alpha-Beta剪枝不建议回答“那个太难不会”建议把问题转化成技术选型对比强调本项目聚焦于“让神经网络在无监督条件下自主进化出棋力”如果叠加搜索剪枝反而干扰了评估网络质量的衡量指标。然后顺势说明拓展方向可以在网络评估基础上叠加搜索走AlphaZero式的思路。神经网络训练为什么不反向传播这是整个项目的灵魂问题回答要点是遗传算法解决了传统反向传播需要大量带标签棋谱数据的痛点用自博弈胜负结果作为奖励信号达到类似“强化学习”的效果。同时遗传算法易于并行化实现门槛低符合课程设计的教学目的。训练数据哪里来的直接回答不需要外部棋谱遗传算法是让AI自我对弈从随机策略开始自动进化出有效评估模式。这个思路可以联系深度强化学习里的self-play自博弈概念但相比之下实现简单得多。评估函数为什么不人工写规则回答要把重点放在“自动化特征提取”这个点上。手工规则在大局观、棋感层面很难覆盖完全。神经网络能够自动组合棋子的位置特征、配合关系、空间控制等等虽然可解释性不如手工规则但在本项目的规模下棋力表现已经具备基本的战术意识。参数为什么这么选种群大小、变异率建议准备一份调参实验记录。我当时记录了不同变异率下同一训练代数后的胜率对比做成一张折线图放到论文附录回答时直接贴出实验结果就能把问题转化成“我做过对比实验这是数据”。8. 我踩过的坑给你一张避坑清单写代码的过程中踩坑无数整理几个花费时间最长的给大家参考坑一棋盘坐标方向搞反中国象棋的棋盘坐标从红方视角和黑方视角看是镜像的。我在写界面落子和AI内部走法转换时因为坐标映射方向反了导致AI以为是走正着界面上显示的却是往回走。排查了两天才发现是坐标转换只做了一半。建议一开始就把“逻辑坐标”和“界面坐标”严格分开所有走法统一用逻辑坐标界面层负责转换不要在逻辑层混入界面坐标。坑二着法生成时忘记处理“被将军状态”初始版本的AI在某些局面下会走出“算了下一步才发现自己已经被将死”的迷惑行为。原因是着法生成器没有过滤掉“走完后己方帅被攻击”的非法着法。这个问题直接导致遗传算法训练出来的棋力非常不稳定——很多时候胜局在手AI却自己送死。后来在走法合法性校验里加了一步“模拟走棋后检测己方帅是否处于被攻击状态”棋力才稳定下来。坑三UI线程访问跨线程卡死这个上面提过很多新手以为Application.DoEvents()能解决一切实际只是让界面看起来没死但底层逻辑越卡越死。推荐的做法是训练和UI完全分离后台线程跑完一代之后批量把结果传给UI层不要每一步都实时刷新。一次刷新一代的结果性能损耗可以忽略不计。坑四交叉率过高把进化打回原形有一次我把交叉率设到0.95发现哪怕训练到60代种群平均水平仍然很烂后来才反应过来是高交叉率把已经适应环境的基因组合频繁打散好基因组合存不下来。降低交叉率到0.8之后情况立刻好转。棋盘类问题的基因片段之间存在很强的联动关系比如“用炮时要保持炮架”这种策略需要多个权重协同配合交叉太频繁很容易把这些协同关系扯断。坑五把训练日志写到界面上我一开始图省事把训练过程的每一步落子都输出到界面文本框里结果训练速度被拖到无法忍受的程度。后来改成只输出每一代的平均适应度、最佳适应度、耗时这三个数据训练流程的可视化用一张曲线图代替问题彻底解决。这也引出一个更通用的观点UI展示和核心计算一定要分层计算密集的部分绝不能被展示逻辑拖累。9. 后续可以怎么扩展这个项目如果还想继续往下做有几个方向性价比都很高一是接入ONNX Runtime做模型推理。C#生态里ONNX Runtime可以直接加载训练好的神经网络权重推理速度比纯C#实现更快也为以后接入更复杂的网络结构留了口子。不过要注意当前版本的训练循环是纯C#实现的要想导出ONNX格式需要先做格式转换。二是加入自对弈数据收集与经验回放。可以让遗传算法训练出来的多个最优个体之间进行大量对弈记录胜负过程和中间局面再用这些数据训练一个更精细的走子策略网络。思路接近AlphaGo早期的训练方式但实现规模小得多。三是将棋力评估与可视化结合做一个类似“局面的方框热力图”。把网络对每个位置的评估分数渲染成色块覆盖到棋盘上展示AI认为哪个区域是当前争夺焦点这种可视化在答辩时非常抓眼球也方便说明神经网络学到的空间特征。四是为网络增加多头输出直接输出所有合法着法的策略概率分布替代当前“逐个评估着法并排序”的做法。这个方向需要改动网络输出层结构但推理效率会提升几个量级。我这个项目的体会是课程大作业的价值不在于棋盘上能打赢多强的对手而在于把两到三个经典算法串成一个完整的、能演示的、能讲清楚原理的系统。神经网络负责感知遗传算法负责学习C#和WinForms负责把它们变成看得见摸得着的程序。三层递进从理论到实现到展示整个训练过程肉眼可见地变强这种“亲眼看着AI成长”的体验是纯写搜索树给不了的。最后再分享一个小技巧答辩演示时千万要提前把训练好的最优权重序列化到本地文件演示时直接加载不要现场从头训练。现场训练一是耗时二是结果有随机性万一运气不好训练出个棋力很弱的个体场面会很尴尬。把训练好的模型文件放在工程目录里启动后立即加载然后让最优个体和随机初始化的个体对弈一局对比效果直观又不会翻车。本文还有配套的精品资源点击获取
返回列表