【中小学AI人工智能教育】井字棋小游戏
Ai创想实验室是专门为中小学AI教育开发的教学平台,包含了值计算、图像分类、音频分类、文本分类、数值回归、图像回归、图像分类+回归、平衡杆、手写数字生成、文本生成等中小学人工智能学习类项目。无需编程基础、无需添加硬件、无需购买算力、无隐私担忧、无需师资培训即可进行教学实践。
井字棋小游戏在一定意义上属于“Hello World!”一类,所以相关文章或讨论有很多。用几个小时时间实现了一个极简项目——让一个全连接网络学会下井字棋,把它放在了首页上。即使这是一个不太公平的游戏,在玩家一直是先手的情况下,你训练的AI表现也能非常好。实现这个小游戏,主要途径有以下几条:
1、AlphaGo的思路:这种思路有一些现成的第三方库,如果需要了解可以搜索alphago-zero-tictactoe-js,学习把局面评价交给模型处理的蒙特卡洛树的思路——这非常经典。
2、传统的α—β剪裁:这种思路非常适合井字棋,其状态空间极小,完全能够穷举,相关内容可以搜索“清月连珠”来进行学习——这一点也不AI。
3、穷举局面训练一个网络——监督学习或强化学习。
最终选定的是:监督学习,利用α-β剪枝生成完美棋谱,让网络“模仿”最优走法。整个训练在浏览器中完成,无需GPU,数十秒即可看到AI从随机落子成长为不败高手。
一、什么是井字棋
井字棋状态空间极小(仅约5,478种不同局面),但包含完整博弈要素:先手优势、平局、攻防转换。它既非微不足道,又足够简单,非常适合作为AI入门的“Hello World”。更重要的是,我们可以穷举所有局面,为每个局面标记“最佳走法”,从而构建一个完美的监督学习数据集。
二、数据生成
实现了一个经典的α-β剪枝算法,它能从任意棋盘状态出发,计算出当前玩家的最优落子位置。我们让这个算法遍历所有可能局面,形成数据集(棋盘状态 → 最佳位置)。但这里有一个关键细节:棋盘必须以“当前玩家”的视角编码。即始终让当前玩家视为“1”,对手视为“2”,而非固定玩家为X、O。这样模型只需学习一个策略,而后在实战中通过视角转换即可应对先手或后手。
三、模型设计
有很多关于这个小游戏的资料、模型,但有一部分不尽人意,以下模型经过测试使用生成的数据+数据增强可以在几分钟之内学会攻守,棋力完全满足对弈需求。
model = tf.sequential(); model.add(tf.layers.dense({ units: 32, activation: 'relu', inputShape: [9] })); model.add(tf.layers.dense({ units: 64, activation: 'relu' })); model.add(tf.layers.dense({ units: 32, activation: 'relu' })); model.add(tf.layers.dropout({ rate: 0.1 })); model.add(tf.layers.dense({ units: 9, activation: 'softmax' })); model.compile({ optimizer: tf.train.adam(0.001), loss: 'categoricalCrossentropy', metrics: ['accuracy'] });四、数据增强
去重后数据量从29万压缩至4520个唯一状态,训练速度加快但存在对称局面AI棋力表现相差极多的线性。井字棋具有8种对称性(旋转和镜像)。为了让模型学会这些对称变形,对每个样本应用所有对称变换,并相应映射走法位置。这使数据量扩大8倍,模型泛化能力显著提升。
五、结束语
这个项目证明了一个简单神经网络配合完美数据,可以轻松解决一个看似需要推理的博弈问题。它展示了“模仿学习”的力量;在足够好的数据面前,复杂的强化学习并非总是必要。对于教育场景,这种轻量、可交互、可解释的AI演示,或许比黑盒式的大模型更有价值。
你可以在平台上亲身体验:打开Ai创想实验室平台首页,在右侧的井字棋训练你的AI(由于模型和数据特性,在CPU上训练要比在GPU上快,所以该模型训练时使用的是CPU),然后与它对弈。你也可以查看代码来学习井字棋项目,你会发现,从零开始创造一个AI棋手,原来如此简单!
六、模型和工程
花费一点时间,把模型导出和转换,而后利用模型做一个井字棋游戏。
使用ms.ml其中有几个需要注意的地方:
1、模型的输入名为intput,可以使用工具来查看:
也可以用如下代码来进行自动检测:
Private Sub DetectInputOutputNames() Try If _session.InputMetadata IsNot Nothing AndAlso _session.InputMetadata.Count > 0 Then _inputName = _session.InputMetadata.Keys.First() End If If _session.OutputMetadata IsNot Nothing AndAlso _session.OutputMetadata.Count > 0 Then _outputName = _session.OutputMetadata.Keys.First() End If Catch ex As Exception ' 使用默认名称 End Try End Sub2、不用ML的抽象层直接进行推理
' AI 走棋 Private Function GetAIMove() As Integer Try ' 构建输入(AI 视角:AI=1,玩家=2) Dim inputData(8) As Single For i As Integer = 0 To 8 Select Case _board(i) Case AI : inputData(i) = 1.0F Case PLAYER : inputData(i) = 2.0F Case Else : inputData(i) = 0.0F End Select Next Dim inputTensor As New DenseTensor(Of Single)(inputData, New Integer() {1, 9}) Dim inputs As New List(Of NamedOnnxValue)() inputs.Add(NamedOnnxValue.CreateFromTensor(_inputName, inputTensor)) Using results = _session.Run(inputs) Dim outputTensor = results.First(Function(x) x.Name = _outputName).AsTensor(Of Single)() Dim scores = outputTensor.ToArray() Dim bestPos As Integer = -1 Dim bestProb As Single = -1.0F For i As Integer = 0 To 8 If _board(i) = EMPTY Then If scores(i) > bestProb Then bestProb = scores(i) bestPos = i End If End If Next If bestPos >= 0 Then lblConfidence.Text = "AI 选择: " & _positionNames(bestPos) & " (概率: " & bestProb.ToString("P1") & ")" End If Return bestPos End Using Catch ex As Exception MessageBox.Show("AI 预测失败: " & ex.Message) Return -1 End Try End Function完整的项目(含全部模型在文章顶部绑定资源中下载)。
在AI创想实验室中,我们无需编程基础,不用学习框架,不用配置环境,无需购买费用高昂的显卡,更不用为云端算力付费,使用当前已有的各种硬件:仅有核显的个人、办公、机房电脑,希沃白板等都能达到理想的教学效果。操作简单但AI核心知识样样俱全,无需师资培训就可以进行教学且能取得理想的教学效果。如果加入试点或合作方那么只需要一台局域网服务器(无需显卡、服务器不用供算力)即可一次投入永久使用全部项目和功能,通过后台管理一分钟即可创建一个本地化、校本化的项目实例。
演示版本地址:www.AiEduLab.tech
有任何问题欢迎留言或发送邮件至:hello@AiEduLab.tech