这是面向编程小白,从零开始学习“软件编程+人工智能”的教程。在首篇教程《零基础入门,用Excel 编写人工智能程序:老鼠走迷宫》中,主要讲解了以下内容:
01 在Excel中编写和运行程序
02 编程基本操作
03 画迷宫
04 画参数表
我们学习了在Excel中用VBA编写和运行程序的全部步骤和基本语句,完成了人工智能老鼠走迷宫程序的基础部分:画一个3行3列共有9格的迷宫,建立了“动作参数表”。还没有读过第一篇教程的同学,请先点击上面的文章标题阅读。
“动作参数表”共有9行4列,每行代表迷宫的一格,每列代表一个方向,即“上、右、下、左”四个移动方向。动作参数表”可以完全表达迷宫中每个格的每个可能的移动方向。
对于迷宫中的某个单元格来说,有墙的方向无法移动。在“动作参数表”中,把这个方向的值设为0;对于没有墙的方向,参数设定为1。这样,老鼠根据“动作参数表”中的值,便可知道可以向哪个方向移动。
下图,左侧为迷宫,右侧为动作参数表:
下一步,我们的编程工作是让老鼠动起来,为此,还需要建立另一张表,称为“策略表”。以下的标题序号接前文继续。
05 画策略表
前面我们已经画出“动作参数表”。老鼠根据此表,无论到了哪个格子里,都能知道哪个方向可以走,哪个方向不能走。
有的格子,只有一个方向可走,有的格子,有两个或者多个方向可走。
那么,该如何选择方向呢?这是“策略表”负责的工作。
“策略表”与“动作参数表”大小相同,都是9行4列。行号代表迷宫的编号,列号代表“上、右、下、左” 4个方向。
“策略表”中的值是每个可移动方向的平均概率。
例如,如果迷宫中一个格子的某个方向有墙,则向该方向移动的概率为0,所以“策略表”该方向的值填0。
如果某个格子只有一个方向可以移动,那么,向这个方向移动的概率是100%。
如果某个格子有两个方向可以移动,那么,每个方向的移动概率是1/2=50%。
如果某个格子有三个方向可以移动,那么,每个方向的移动概率是1/3=33.33%。
如果某个格子四个方向都可以移动,那么,每个方向的移动概率是1/4=25%。
这个概率值就是动作策略值。
可见,所谓“策略表”,就是取每个可移动方向的平均概率。
下面我们编程画策略表:
我们把策略表的左上角,放在表格的第16行,第2列,我们定义两个常量代表这两个数字。定义常量的代码如下:
Const 策略表头行 = 16 '策略表左上角行号
Const 策略表头列 = 2 '策略表左上角列号
这两句代码与之前定义的迷宫常量和参数表常量放在一起,放在整个程序的最上方,如下图:
然后我们创建一个新的过程:“画策略表”,并定义内部使用的局部变量。如下:
Sub 画策略表() '设置动作方向的平均概率
Dim 参数之和 As Single '迷宫每个位置的动作参数之和
Dim 动作概率 As Single '迷宫每个位置动作概率(策略π)
Dim 概率梯度 As Single '迷宫动作概率的增加梯度
Dim 行号 As Integer '参数表或策略表的行号
Dim 列号 As Integer '参数表或策略表的列号
End Sub
接着,在Dim语句下面写“画表头”的语句,如下(代码显示不全可左右划动):
'画策略表表头
Cells(策略表头行 - 2, 策略表头列 + 1).Value = "策略表π(动作概率)"
Cells(策略表头行 - 2, 策略表头列 - 1) = "位置编号/"
Cells(策略表头行 - 1, 策略表头列 - 1) = "移动方向"
Cells(策略表头行 - 1, 策略表头列 + 0) = "0-上" '画策略表动作的方向
Cells(策略表头行 - 1, 策略表头列 + 1) = "1-右" '画策略表动作的方向
Cells(策略表头行 - 1, 策略表头列 + 2) = "2-下" '画策略表动作的方向
Cells(策略表头行 - 1, 策略表头列 + 3) = "3-左" '画策略表动作的方向
'画策略表边框
With Range(Cells(策略表头行, 策略表头列), Cells(策略表头行 + 8, 策略表头列 + 3))
.BorderAround LineStyle:=xlContinuous '画策略表四边单线边框
End With
然后,我们向策略表中填数据。
实现方法是根据“动作参数表”,从第0行开始,首先对该行所有列的值求和,赋给变量“参数之和”。
然后用该行每一列的值除以“参数之和”,得到该方向的动作概率。
一般来说,“策略表”中可以直接填写动作概率值。但是,为了后面编程方便,我们把动作概率值转成阶梯概率值,再填写。
举例来说,假设某一格子有三个方向可以移动,那么,每个方向的动作概率为1/3=0.3333。如下表所示:
0-上 |
1-右 |
2-下 |
3-左 |
0 |
0.3333333 |
0.3333333 |
0.3333333 |
而“阶梯概率”,是把当前列的动作概率值与左边所有列的动作概率值累加。例如,上表中第2列的值是0.3333,其左边两列的值分别为0和0.3333,三者累加和为0.6666。因为累加值像阶梯一样逐渐上升,所以称为阶梯概率。如下表:
0-上 |
1-右 |
2-下 |
3-左</ |