从零开始,轻松编程探秘人工智能:强化学习的魅力

AI快讯 3hours ago AICAT
0 0
掌握人工智能的第一步:用Excel编写迷宫程序

人工智能是否真的依赖于人类所提供的数据才能正常运作?通过编写一个简单的“迷宫”程序,你就能找到答案。

本文是网络上罕见的两篇零基础快速入门教程,旨在帮助编程新手从零开始学习“软件编程+人工智能”,使得更多非专业人士能够从根本上理解人工智能的运作机制。我们将少谈理论,直接进入实用的代码和算法应用

考虑到内容较多,计划以三篇文章完成。此文为第一篇:软件编程的快速入门,同时将帮助你完成迷宫程序的基础搭建。

学习的前提是你的电脑上安装有任何版本的微软Office办公软件。只要你掌握Excel的基本操作,就可以开始。不需要安装任何编程语言开发环境

如果你的电脑中仅有WPS Office,理论上也可以使用,但需要下载一个插件支持VBA编程。如有需要,请留言询问。

我们将从VBA编程语言的基础知识入手,帮助大家在最短时间内编写出自己的第一个计算机程序。紧接着,我们将编写一个真实的人工智能程序,使用强化学习算法。这种算法是谷歌的围棋AI阿尔法狗、OpenAI的红蓝小人捉迷藏以及ChatGPT等众多人工智能技术的基础。

我们将在Excel中构造一个小型迷宫,并设定三个表格作为人工智能的“参数”,让老鼠学习如何通过这些参数获得“智慧”,成功走出迷宫。

从零开始,轻松编程探秘人工智能:强化学习的魅力

这个教程非常适合假期中的学生们,帮助他们学习编程和人工智能相关的知识。

接下来,让我们开始吧:

01 在Excel中编写和执行程序

Excel自带的VBA编程语言是一种可视化的BASIC语言,特别适合初学者入门。

第一步:打开Excel的编程界面

首先打开Excel软件,创建一个新的空白工作表。接着按下 Alt+F11 组合键,以打开编程窗口。按法是先按住Alt键,再点击功能键F11,结果界面如图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

右侧的窗口是编写代码的地方,请根据上图调整编程窗口的大小,使其占据屏幕的一半,同时露出一半的工作表。

然后按照图中的指示,展开小框中的“+”号变为“-”号,再双击“Sheet1”,把光标移动到指定位置,就可以开始编写程序代码了。

第二步:编写你的第一个程序代码

每个程序都需要以“Sub”开头,后接一个空格,接着是『程序名称』和一对空括号,然后按回车键。『程序名称』可以使用英文或汉字,最后用“End Sub”结束。例如:

Sub 初始化()End Sub

示意图如下:

从零开始,轻松编程探秘人工智能:强化学习的魅力

特别需要注意的是,程序中只有名称可以使用汉字,其他字符和标点必须为英文状态输入。否则会出现“无效字符”的提示。最常出错的地方是标点符号,如逗号『,』、句点『.』、单引号『'』、双引号『""』、括号『()』等,务必要使用英文符号。

在一个程序中,允许书写多个以“Sub”开头并以“End Sub”结尾的代码段,这些代码段称为“过程”或“子程序”

在“Sub”与“End Sub”之间,输入你的程序代码。

第三步:在过程内编写程序代码

将光标移动到Sub过程内部,输入第一条语句:

Cells(1,1)=1

这条语句的作用是向指定的单元格中填入特定内容。格式如下:

从零开始,轻松编程探秘人工智能:强化学习的魅力

例如:Cells(1,1)=1,这条语句表示在第一行第一列的单元格中输入数字1。

在这个Sub过程里,我们将写入三条Cells()语句:

Sub 初始化()    Cells(1,1)=1    Cells(1,2)=2    Cells(1,3)=3End Sub

请注意,程序语句通常需要比Sub向右缩进4个空格,以使程序结构清晰。按Tab键即可实现缩进。完整代码如下图:

从零开始,轻松编程探秘人工智能:强化学习的魅力

接下来,我们来看一下如何运行这段程序。

第四步:执行程序

将光标放在Sub过程内部,然后按F8键,此时Sub语句的背景会变成黄色,表示程序将在此处开始执行。

如果在运行程序时出现错误,请参考第五步 设置安全级别。

从零开始,轻松编程探秘人工智能:强化学习的魅力

F8键用于逐行执行程序,称为“单步执行”。

继续按F8键,黄色背景将移动到下一句 Cells(1,1)=1,表示该句将被执行。

再按F8键,背景又下移一行,此时上一句已执行完毕,我们来查看结果:

从零开始,轻松编程探秘人工智能:强化学习的魅力

轻松掌握Excel VBA编程的第一步:从基本操作到程序执行

在表格的第一行第一列,我们已经成功填入了数字1。

我们的第一句代码顺利执行完成。

继续按F8键两次,后面的两条语句也将会被执行。这时,表格的第一行第二列和第三列分别填入了数字2和3,如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

至此,这段简短的程序已经全部运行完毕。我们成功编写了第一个程序。

不过,一次次按F8键逐步执行程序实在太费劲,是否可以一次性完成呢?

当然可以实现!

通过按下F5键可以一键执行整个程序。

之所以首先介绍F8的单步执行,是为了让大家直观地看到程序的执行顺序。在后续调试中,单步执行也将显得尤为便利。

请注意,若我们创建了多个Sub过程时,必须将光标放置在希望运行的Sub过程内,才可按F5执行该过程。其他过程将不会被执行,如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

最后,让我们总结一下,VBA编程中常用的功能键如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

以上便是在Excel中使用VBA语言编写与执行程序的完整步骤。其实一点也不复杂,对吧?

第五步:调整安全级别

如果前面的四步都顺利进行,可以选择跳过此步骤。

若程序无法运行并提示被“禁止”,这通常是因为Excel的安全级别设置过高,导致无法执行任何程序。需要重新配置“宏安全性

请按照下图中的四个步骤,将安全级别调整为“禁用所有宏并发出通知”。

从零开始,轻松编程探秘人工智能:强化学习的魅力

如果在Excel主菜单中找不到步骤①中的“开发工具”选项,不必焦急。

请点击主菜单中的“文件”→“选项”→“自定义功能区”,在“主选项卡”下,勾选“开发工具”复选框,即可显示“开发工具”。如下图所示的四个步骤:

从零开始,轻松编程探秘人工智能:强化学习的魅力

对于某些较旧版本的Excel软件,安全性设置在:“工具”→“宏”→“安全性”选项中,请将安全级别设为“中”即可。

02 编程基本操作

我们已经成功编写了三句代码,分别在表格第一行的前几列填入了数字1、2、3。接下来,我们将继续依次填入4、5、6,直到20,每列填一个数字。

如果使用前面的方法,则需要一条条写出20条Cells()语句,这显得繁琐。我们可以应用循环语句,通过几行代码来实现。具体步骤如下:

(1)定义变量。

在中学阶段,我们学习过代数,字母可以代表数字,例如x=8,y=0.5等。在程序中,这些字母称为变量

使用变量前,需要先定义其类型,具体方法如下:

从零开始,轻松编程探秘人工智能:强化学习的魅力

例如:(如果以下代码未完全显示,可左右滑动)

    Dim 列号 As Integer  '把变量『列号』定义为整型,只能表达整数    Dim x As Single     '把变量『x』定义为浮点型,可表达带小数点的数    Dim 姓名 As String   '把变量『姓名』定义为字符串,可表达“张三”等单词或汉字        Dim 列号 As Integer  '把变量『列号』定义为整型,只能表达整数

通常情况下,我们会将所有的变量定义语句集中在Sub过程的上方

此外,我们注意到在Dim语句后方,跟随一段以英文单引号『‘ 』开头的文字,这是注释语句,显示为绿色。这是为了便于阅读者理解程序的功能,这种以单引号开头的注释语句并不会被执行。

(2)For循环语句

For循环语句以For开始,以Next结束。中间则是循环体,具体如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

例如:

    Dim 列号 As Integer      '把变量 列号 定义为整型    For 列号 = 1 To 20        '列号从1到20循环       Cells(1, 列号) = 列号   '循环体,向指定单元格写入数据    Next 列号              '每循环一次,列号加1,大于20后退出循环

此段程序从『列号=1』开始,当执行到『Next』语句后,『列号』会自动加1,然后返回至『For』语句重新判断『列号』。

只要『列号』不超过20,循环体中的代码将再次被执行。

这个过程将持续重复,直到『列号』超过20,才会退出循环,继续执行Next后的下一句程序。

完整的代码如下图所示。请将光标移动到Sub过程内部,按F5来执行这段代码

最终结果是:在表格第一行的每一列中,依次填入了1到20的数字,见下图:

从零开始,轻松编程探秘人工智能:强化学习的魅力

这串连续的数字即为表格的列号,留作日后使用。

如果您对循环语句的用法仍有疑问,建议使用F8键逐步执行上述程序,以便直观了解循环语句的工作原理,同时观察循环变量『列号』的值的变化情况。如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

(3)保存程序

程序编写完成后,需要将其保存,以便下次使用。操作步骤为:

在主菜单中选择“文件”→“另存为”→“其他格式”

接着选择“文件格式”,选定“Excel 启用宏的工作簿(*.xlsm)”,输入文件名“老鼠走迷宫.xlsm”,然后点击“保存”按钮即可。如下图:

从零开始,轻松编程探秘人工智能:强化学习的魅力

需要注意的是,必须选择以.xlsm为后缀的文件格式进行保存,若选择其他格式,则会造成程序丢失

对于某些较旧版本的Excel,如果没有*.xlsm文件类型选项,则可按照正常方式进行保存。

(4)打开已保存的程序

在Excel中,点击主菜单的“文件”→“打开”,然后选择之前保存的“老鼠走迷宫.xlsm”文件。打开文件后,通常会出现一个安全警告,显示在黄色背景区域,如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

此警告是为了防范潜在的宏病毒。鉴于我们确认该文件安全,因此直接点击“启用内容”按钮即可。

对于某些较旧版本的Excel,安全警告可能会以对话框的形式出现,此时同样需要选择“启用宏”按钮

启用后,按下组合键 Alt + F11,就可以打开编程窗口,查看上次编写的程序。可以尝试运行该程序,以确认其功能正常。

如果在打开或运行程序时遇到问题,请返回到上面的第五步:设置安全级别。

以上内容是关于Excel VBA编程的基本入门,接下来我们将进入实际编程阶段。

03 画迷宫

首先,在Excel表格中绘制一个三行三列的迷宫。

我们将迷宫的起点设在整个表格的第4行,第2列的位置。

由于这两个数字在后续程序中将频繁使用,因此我们需要定义两个常量来表示这两个数字。定义常量的方法如下:

Const 迷宫头行 = 4  '迷宫左上角的行号Const 迷宫头列 = 2  '迷宫左上角的列号

完成定义后,程序中使用『迷宫头行』将代表数字4,而使用『迷宫头列』则代表数字2。

请将常量定义的代码放置在Sub过程的外部,即编程窗口的最上方。如下图所示。

这样做的原因在于:在Sub过程外部定义的常量或变量可以被所有Sub过程共享。

从零开始,轻松编程探秘人工智能:强化学习的魅力

接下来,我们将编写第二个过程“画迷宫”,该过程位于第一个Sub 初始化()过程的下方(如上图所示):

Sub 画迷宫()End Sub

在这个新的Sub过程中,输入以下代码:

    Dim 迷宫行号 As Integer   '迷宫内部的相对行号    Dim 迷宫列号 As Integer   '迷宫内部的相对列号    Dim 迷宫编号 As Integer   '迷宫内单元格的编号

这三条语句用于定义三个变量,这些变量被称为“局部变量”,它们是在Sub过程内部定义的。与在Sub过程外部定义的变量不同,局部变量仅在其所属的Sub过程内有效,其他Sub过程无法访问。此外,不同Sub过程内可以定义同名变量,它们之间不会相互干扰。

变量的具体含义将在后面的注释中详细说明。我们会在需要时进一步解释。

接下来输入以下代码:

   '以下画迷宫边框,并设置迷宫区域的字体属性   With Range(Cells(迷宫头行, 迷宫头列), Cells(迷宫头行 + 2, 迷宫头列 + 2))     .BorderAround LineStyle:=xlDouble  '在迷宫四周画出双线边框     .HorizontalAlignment = xlCenter '设字符居中显示     .Font.ColorIndex = 15 '设字体为灰色     .Font.FontStyle = "Bold" '设字体为粗体   End With

以With开头的第一条语句中,Range()语句用于定义一个矩形区域,括号内的两个Cells()分别代表矩形区域的左上角和右下角的单元格。

Cells()中使用了我们刚刚定义的两个常量『迷宫头行』和『迷宫头列』,分别表示4和2。换句话说,它的实际含义是:

Range(Cells(4, 2), Cells(6, 4))

这意味着以第4行第2列的单元格作为左上角,以第6行第4列的单元格作为右下角,形成一个3行3列的矩形区域。如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

可以看出,Cells()语句中的行号和列号可以用数字、常量、变量或表达式表示,非常灵活。这是编程的特点,大多数代码都可以如此使用。

有人可能会疑惑:为何在程序中不直接写Cells(4, 2)和Cells(6, 4),而是使用较长的名称呢?

这样做的目的是为了在需要更改数字时方便进行修改。

接下来查看With语句下方的四条代码,它们的功能是绘制该矩形的四个边框并设置字体属性。其中的英文字符均为Excel手册中规定的,查阅使用即可,无需记忆。

如果代码的开头或中间有一个或多个小句点,这意味着:小句点后面的对象属于前面的对象

例如,“中国.北京”表示:中国的北京。

若写成“中国.华盛顿”,则是错误的,因为中国并没有这个对象

每个对象还可以有自己的子对象,因此可以通过多个句点连接书写多级。比如:

中国.北京.清华大学.法学院.某某班.某某人.年龄=20。

最后一级的对象通常是前面对象的属性,例如某人的年龄、身高、体重、学习成绩等都是属性。

在VBA中,单元格、矩形块、表格等被称为对象。这种“面向对象”的表达方式使得归属关系十分清晰,即使存在重名的对象也不会造成混淆。

通常,当一个对象有多个属性需要设置或使用时,便可采用With语句。

这种语句以With开头,以End With结束。用法如下:

从零开始,轻松编程探秘人工智能:强化学习的魅力

将以上代码复制或输入到Sub 画迷宫()过程内,然后按F5键运行,查看是否成功绘制出一个矩形边框。

再次提醒,在按F5键运行之前,请确保光标位于Sub过程内部,这样才能正常运行该过程

如果光标在Sub过程外部,按F5键后将弹出菜单,让你选择要运行的过程。如下图:

从零开始,轻松编程探秘人工智能:强化学习的魅力

选择“画迷宫”,点击“运行”按钮即可执行。

接下来的四条代码用于绘制迷宫内部的墙,方法是利用Cells(行号,列号)语句指定某个单元格,并绘制该单元格某一边的边框,逐条完成。

    '以下画迷宫内部墙    Cells(迷宫头行 + 0, 迷宫头列 + 0).Borders(xlEdgeRight).LineStyle = xlDouble '指定单元格右边画双线边框    Cells(迷宫头行 + 1, 迷宫头列 + 0).Borders(xlEdgeBottom).LineStyle = xlDouble '指定单元格下边双线边框    Cells(迷宫头行 + 1, 迷宫头列 + 2).Borders(xlEdgeBottom).LineStyle = xlDouble '指定单元格下边双线边框    Cells(迷宫头行 + 1, 迷宫头列 + 1).Borders(xlEdgeTop).LineStyle = xlDouble '指定单元格上边双线边框

行号和列号均以常量『迷宫头行』和『迷宫头列』为基准,即以第4行第2列为起点,分别加0、加1、加2来指定相应的单元格。

接下来我们将绘制迷宫内部单元格的编号。

此时需要使用在Sub过程开头定义的三个局部变量。

其中『迷宫行号』和『迷宫列号』表示相对于左上角的行号和列号,取值分别为0、1、2,代表迷宫内部的第0行、1行和2行,或第0列、1列和2列。

迷宫左上角的位置由常量『迷宫头行』和『迷宫头列』决定。

例如:迷宫内的第0行第1列,即迷宫行号=0,迷宫列号=1。该单元格表示为:Cells(迷宫头行 + 迷宫行号, 迷宫头列 + 迷宫列号)

    '以下画迷宫内部单元格的编号    迷宫编号 = 0 '设迷宫编号的初始值为0    For 迷宫行号 = 0 To 2 '迷宫内部行号=0,1,2      For 迷宫列号 = 0 To 2 '迷宫内部列号=0,1,2        Cells(迷宫头行 + 迷宫行号, 迷宫头列 + 迷宫列号) =迷宫编号 '画迷宫内单元格的编号        迷宫编号 = 迷宫编号 + 1  '修改迷宫编号变为当前值+1      Next 迷宫列号    Next 迷宫行号

这是两个嵌套的For循环语句。

外层的For循环语句将循环三次,『迷宫行号』的值依次为0、1、2。

每次外层的For语句循环时,都会进入内层For循环语句并循环三次,『迷宫列号』的值依次为:0、1、2。

因此,总共将进行3乘3等于9次的循环。

迷宫的动态编程与参数表构建

在开始之前,『迷宫编号』的初始值设定为0,每进行一次循环就会递增1,因此在经过9轮循环后,最终的值将达到8。

这两个For循环的执行过程可以通过下图中箭头的指示来观察:

从零开始,轻松编程探秘人工智能:强化学习的魅力

蓝色箭头代表内层列号循环,而红色箭头则表示外层行号循环。经过9次的迭代,迷宫中的9个单元格将依次被填入0到8的值。

从零开始,轻松编程探秘人工智能:强化学习的魅力

最后,在迷宫的左上角写上“老鼠”,而在右下角则写上“食物”。

请注意,单元格中的字符需用英文双引号包围,而非中文双引号

  Cells(迷宫头行, 迷宫头列) = "老鼠" '在迷宫0号单元格写“老鼠”  Cells(迷宫头行, 迷宫头列).Font.ColorIndex = 1 '字体设为黑色  Cells(迷宫头行 + 2, 迷宫头列 + 2) = "食物"   '在迷宫8号单元格写“食物”  Cells(迷宫头行 + 2, 迷宫头列 + 2).Font.ColorIndex = 3  '字体设为红色

程序结束时以 End Sub 作为标志,绘制迷宫的过程就此完成。

请将光标移动至 Sub 画迷宫() 的内部,并按下F5键以执行该程序。

一个Sub过程不仅可以直接运行,还可以在其他Sub过程内部调用,只需写出该过程的名称,通常不需要加上Sub或括号。

例如,在Sub 初始化()内可以添加两行代码,如下:

Sub 初始化()    Dim 列号 As Integer       '把变量 列号 定义为整型    For 列号 = 1 To 20        '列号从1到20循环        Cells(1, 列号) = 列号   '循环体,向指定单元格写入数据    Next 列号                 '每循环一次列号加1,大于20后退出循环    Range(Cells(2, 1), Cells(26, 12)).Clear  '清空指定矩形区域    画迷宫  '调用“画迷宫()”过程End Sub

其中后面的两行是新增内容,第一行用于清空一个由左上角和右下角单元格确定的矩形区域,第二行则调用“画迷宫”过程。

这样,当运行“初始化”过程时,将自动执行“画迷宫”过程。运行效果如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

请将上述代码复制或输入到编程窗口中,并按F5键运行,查看是否能绘制出相同的迷宫。

如果对程序有不解之处,建议使用F8键逐步执行,以观察程序的执行流程,从而加深理解。

04 动作参数表的构建

当迷宫完成后,接下来要做的就是让老鼠能够在其中活动。

老鼠该如何移动呢?假设它处于迷宫的某个单元格,能够在上、下、左、右四个方向之间选择。但是,迷宫中存在墙壁,挡住了某些方向的通行。

因此,需要让老鼠清楚哪些方向可以前进,哪些方向无法通行。否则,它可能会随意穿越墙壁。

为此,我们制作一张表格,列出迷宫中每个单元格的四个移动方向。若该方向有墙,则标记为0;若没有墙,则标记为1。这样,老鼠可以根据参数表中的数值判断其是否能够移动

迷宫总共有9个单元格,每个单元格对应4个方向,因此可创建一张9行4列的表格,涵盖所有可能的情况。这张表被称为“动作参数表”

在人工智能领域,直接构建表格是处理参数最简单的方式。然而,并不是所有应用均可直接构建表格,或者由于参数量巨大而不经济。在这种情况下,通常会采用神经网络模型,例如在处理文本、图形和语言等复杂情况时。ChatGPT在处理自然语言时便使用了神经网络技术,涉及大量参数。

我们将动作参数表的左上角位置设置在第4行、第8列,并为这两个数字定义常量。常量的定义代码如下:

Const 参数表头行 = 4 '动作参数表左上角行号Const 参数表头列 = 8 '动作参数表左上角列号

这两行代码应与之前定义的迷宫常量一起放在程序的最上方,如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

接下来,我们创建一个新的过程:画动作参数表,并定义所需的局部变量。具体代码如下:

Sub 画动作参数表()  '画动作参数表(θ)    Dim 迷宫行号 As Integer '迷宫内部行号    Dim 迷宫列号 As Integer '迷宫内部列号    Dim 迷宫编号 As Integer '迷宫位置编号     Dim 参数表行号 As Integer '动作参数表当前行号    Dim 参数表列号 As Integer '动作参数表当前列号    End Sub

随后,在Dim语句下方编写“画表头”的代码,如下:

    '画动作参数表表头    Cells(参数表头行 - 2, 参数表头列 + 1).Value = "动作参数表θ(动作表格化)"    Cells(参数表头行 - 2, 参数表头列 - 1) = "迷宫编号/"    Cells(参数表头行 - 1, 参数表头列 - 1) = "移动方向"    Cells(参数表头行 - 1, 参数表头列 + 0) = " 上"    Cells(参数表头行 - 1, 参数表头列 + 1) = " 右"    Cells(参数表头行 - 1, 参数表头列 + 2) = " 下"    Cells(参数表头行 - 1, 参数表头列 + 3) = " 左"    '画动作参数表边框    With Range(Cells(参数表头行, 参数表头列), Cells(参数表头行 + 8, 参数表头列 + 3))        .BorderAround LineStyle:=xlContinuous   '画参数表四边单线边框    End With

接下来,我们开始向动作参数表中填写数据。

方法是从『迷宫编号』为0的单元格开始,逐一检查该单元格的上、右、下、左四个方向是否存在边框。

若没有边框,表示可以通行,则在对应的参数表中输入数字1 。

若存在边框,表示无法通行,则在参数表中填入数字0 。

具体示例如下:

从零开始,轻松编程探秘人工智能:强化学习的魅力

实现这一判断所需的功能需使用IF分支语句,其用法如下:

从零开始,轻松编程探秘人工智能:强化学习的魅力

在这里的『条件表达式』通常涉及两个常量或变量的比较,常用的比较运算符包括:

从零开始,轻松编程探秘人工智能:强化学习的魅力

表达式中也可以使用算数运算符,常见的有如下几种:

从零开始,轻松编程探秘人工智能:强化学习的魅力

使用示例:

Sub 测试()  '这是一个测试程序    Dim x As Integer '定义一个整型变量x    x = 7  '给x赋值为7    If x <=2*3 Then '如果x小于等于2乘以3(即6)        Cells(2, 1) = "小"  '则在第2行1列单元格中填入“小” 。    Else  '其他情况,即x大于10        Cells(2, 1) = "大"  '则在第2行1列单元格中填入“大”。    End If  'If语句结束End Sub

请将此段代码复制或输入到编程窗口中,按F5或F8执行,查看结果如何。

试着将 x=7 这一行的数字改为7以下的值,观察程序运行结果是否有变化。

接下来,我们将向动作参数表中填写参数的代码:

   '向表内填写动作参数    迷宫编号 = 0    For 迷宫行号 = 0 To 2       For 迷宫列号 = 0 To 2          参数表行号 = 参数表头行 + 迷宫编号          Cells(参数表行号, 参数表头列 - 1) = 迷宫编号 '动作参数表中左侧写迷宫编号          With Cells(迷宫头行 + 迷宫行号, 迷宫头列 + 迷宫列号) '指定迷宫某个单元格            '以下检查单元格上方有无边框            If .Borders(xlEdgeTop).LineStyle = -4142 Then '如果上方无边框                Cells(参数表行号, 参数表头列 + 0) = 1  '动作参数值填1            Else                Cells(参数表行号, 参数表头列 + 0) = 0  '动作参数值填0            End If            '以下检查单元格右方有无边框            If .Borders(xlEdgeRight).LineStyle = -4142 Then '如果右方无边框                Cells(参数表行号, 参数表头列 + 1) = 1  '动作参数值填1            Else                Cells(参数表行号, 参数表头列 + 1) = 0  '动作参数值填0            End If            '以下检查单元格下方有无边框            If .Borders(xlEdgeBottom).LineStyle = -4142 Then '如果下方无边框                Cells(参数表行号, 参数表头列 + 2) = 1  '动作参数值填1            Else                Cells(参数表行号, 参数表头列 + 2) = 0  '动作参数值填0            End If            '以下检查单元格左方有无边框            If .Borders(xlEdgeLeft).LineStyle = -4142 Then '如果左方无边框                Cells(参数表行号, 参数表头列 + 3) = 1  '动作参数值填1            Else                Cells(参数表行号, 参数表头列 + 3) = 0  '动作参数值填0            End If         End With         迷宫编号 = 迷宫编号 + 1 '迷宫编号+1      Next 迷宫列号    Next 迷宫行号

虽然程序较长,但其实结构非常简单。

程序的核心依然是两个嵌套的For循环语句,利用With语句依次选中编号为0到8的单元格,并通过4个IF分支语句判断该单元格的上、右、下、左四个方向是否存在边框。

根据手册,属性.LineStyle = -4142表示“无边框”。

将以上代码复制或输入到“Sub 画动作参数表()”过程中,以完成该过程的编写。

同时,我们也将在“Sub 初始化()”过程中添加调用“画动作参数表”的语句,如下:

Sub 初始化()    Dim 列号 As Integer       '把变量 列号 定义为整型    For 列号 = 1 To 20        '列号从1到20循环        Cells(1, 列号) = 列号   '循环体,向指定单元格写入数据    Next 列号                 '每循环一次列号加1,大于20后退出循环    Range(Cells(2, 1), Cells(26, 12)).Clear  '清空指定矩形区域    画迷宫  '调用“画迷宫()”过程    画动作参数表 '调用“画动作参数表()”过程End Sub

最后一句为新增内容。

然后按下F5键运行“初始化()”过程,结果如下图所示:

从零开始,轻松编程探秘人工智能:强化学习的魅力

图中左上部分为迷宫,右上部分为动作参数表。该表共9行4列。

其中,行编号为0至8,每一行代表迷宫中的一个单元格。每列代表一个移动方向,共4列,分别表示“上、右、下、左”。

我们可以看到,红色方框圈住的第0行,其四个参数值为:“0、0、1、0”,即“上、右、左”三个方向的参数均为0,表示不可移动。而“下”方向的参数则为1,表示可以移动。

这四个参数与左下方红色方框中“老鼠”的移动方向参数一致,如蓝色字所示。

在迷宫的每个单元格中,动作参数都以相同方式填入动作参数表中。

通过这张表,老鼠便能清楚地了解到哪些方向可以自由移动,哪些方向则无法通行。

在接下来的文章中,我们将讨论怎样编写代码以实现老鼠的移动,请持续关注,以便第一时间获取更新。

若在编程过程中遇到任何问题,欢迎在下方留言。

来源:百家号
原文标题零基础入门,编一个程序了解人工智能:强化学习
声明:
文章来自网络收集后经过ai改写发布,如不小心侵犯了您的权益,请联系本站删除,给您带来困扰,深表歉意!
广告也精彩
Copyrights:AICAT Posted on 2026-03-07 8:16:02。
Please specify source if reproduced从零开始,轻松编程探秘人工智能:强化学习的魅力 | AI工具导航

No comments

No comments...