拿到这个实验的时候,我是一脸懵逼的,毕竟理论课只上了一节,还全是在吹水,然后实验课就来了,还是用的Python。实验课是周二上午上的,然而我周三晚上就把整个实验肝完了,期间除了上课和早上学英语单词,其他时间都在这上面,写代码还是挺快乐的,于是将(踩坑)过程记录如下:
偷个懒,以下是实验报告原文:
分析估价函数对启发式搜索算法的影响。
由实验结果可知,估价函数的选取对结果的长度和求出的时间都有印象,不同的估价函数应对不同的初值,性能也有差异。总的来说,选取一个好的估价函数,对于使用启发式搜索算法又快又好地求出结果是至关重要的。
探究讨论各个搜索算法的特点。
广度优先搜索:如果有解,总是能找到最优解,但是其效率较低,体现在耗时较长。
深度优先搜索:一般找到的都不是最优解,性能和深度限制的设置有很大关系。
A&A*启发式搜索: 在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无谓的搜索路径,效率极高。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。
*扩展选做题:从初始状态到目标状态的变换,符合什么规律才可解。
由数学知识可知,可计算这两个有序数列的逆序值,如果两者都是偶数或奇数,则可通过变换到达,否则,这两个状态不可达。
我的思考:
在编写代码的过程中,我遇到了许多或“哭笑不得”,或“意味深长”的bug。下面列举几例:
一.预先给的代码在我的电脑上(Linux)无法运行
但是在其他同学的Windows电脑上却能跑起来,我查阅资料,再细看这个报错,感觉这个构造函数里的“拼图”字符串是多此一举,遂去掉,程序便能正常运行了!
二.Python语言不熟练导致的问题
因为我对Python的了解不太深入,就导致了一些我写的代码和我想要的效果不一致的问题,比如:for i in range(-(COLS-1), COLS-1)中,range是“右开”的,所以右边界是取不到的。再比如有如下问题:错误写法看似没有毛病,如果是C的话,确实没毛病,但是Python中变量可以不声明就直接赋值,所以这里Python就会把145行当成声明了一个局部变量,即使外面有同名全局变量!第一种解决方法就是,因为该值是一个数组,所以可以直接操作其数组内的值,此时就会取到全局变量,没有歧义;第二种解决方法就是使用global声明该变量是全局变量,再对其进行操作。
三.i与j和x与y的匹配问题,到底哪个是行,哪个是列,常常搞得人晕头转向,不过使用调试器或者事先仔细思考一下也能解决。
总的来说,这次实验我确实学习到了很多,也收获到了很多。
代码地址:https://github.com/Yuzi0201/AIProgramming/blob/main/EX1/tmpPuzzleWithAutoPlay.py
一些参考:
https://zhuanlan.zhihu.com/p/266830722
https://blog.csdn.net/weixin_48557496/article/details/121463172
局部变量问题: