“人工智能”实验报告
专业智能科学与技术
班级
学号
姓名
日期:2015.
实验一搜索策略
一实验内容
1.熟悉和掌握启发式搜索的定义、估价函数和算法过程;比较不同算法的
性能。
2. 修改八数码问题或路径规划问题的源程序,改变其启发函数定义,观察结果的变化,分析原因。
3. 熟悉和掌握各种搜索策略的思想,掌握A*算法的定义、估价函数和算法过程,理解求解流程和搜索顺序。
二实验思路
1.分别以各种搜索算法为例演示搜索过程,分析各种算法中的OPEN表CLOSE表的生成过程,分析估价函数对搜索算法的影响,分析某种启发式搜索算法的特点。进入演示系统后,选择搜索策略演示程序,可从多种不同搜索算法选择装载相关源文件。实验步骤如下:
(1)选择不同的搜索算法,点击“autosearch”观察搜索过程。
(2)设置不同属性,观察搜索过程的变化。
(3)观察运行过程和搜索顺序,理解启发式搜索的原理。
(4)算法流程的任一时刻的相关状态,以算法流程高亮、open表、close表、节点静态图、
(5)当前扩展节点移动图等5种形式在按钮上方同步显示,便于深入学习理解搜索算法。
(6)根据程序运行过程画出搜索算法框图。
三程序清单
1. 图搜索:
Let open be a list containing the initial state
Let closed be initially empty
Loop
if open is empty return failure
Node remove-first (open)
if Node is a goal
then return the path from initial state to Node else put Node in closed
generate all successors of Node into S
For all nodes m in S
if m is not in open or closed
merge m into open
End Loop
2. A*算法:
OPEN={s, nil}
while OPEN is not empty
remove from OPEN the node
place
if n is a goal node,
return success (path p)
for each edge e connecting n & m with cost c
if
put else if else if m is not on OPEN Then put Return failure 四运行结果说明 Path :0-3-4-5-10 实验二推理技术 一实验内容 1. 对已有的产生式系统(默认的例子)进行演示,同时可以更改其规则库或(和)事实库,进行正反向推理,了解其推理过程和机制。自己建造产生式系统(包括规则库和事实库),然后进行推理,即可以自己输入任何的规则和事实,并基于这种规则和事实进行推理。这为学生亲手建造产生式系统并进行推理提供了一种有效的实验环境。 2.观察并验证简单的规划过程。对照实验过程,弄清Green方法与Strips方法的主要思路。自己写一个简单的规划,再用实验环境创建一个相应的模型,并在实验中验证或修改它。 3.悉和掌握产生式系统的运行机制,掌握基于规则推理的基本方法,和利用规则演绎解决规划问题。熟悉和掌握自动规划的基本原理、方法和主要技术。 二实验思路 1.产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。下面以一个具体的动物识别专家系统模型来说明其原理。 实际问题:---由用户输入到计算机,经系统重新知识表示后自动转入其综合数据库。 设在综合数据库中已输入有如下初始事实集:要求解的问题是判断满足该事实集的是何种动物? 初始事实集:---由用户输入到计算机。经系统重新知识表示后自动转入其综合数据库。 该动物身上有暗斑点、有长脖子、有长腿、有奶、有蹄要求解的问题是判断满足该事实集的是何种动物? 推理过程: ---由产生式专家系统的推理机、规则库和综合数据库联合完成。 (1)首先从规则库取出第一条规则 r1(P65),将r1中的前提部分与初始事实集中的事实相比较,匹配失败;于是继续取第二条规则再试,匹配成功!将此规则的结论部分作为新事实加入到综合数据库的初始事实集中。于是初始事实集变为: 该动物身上有暗斑点、有长脖子、有长腿、有奶、有蹄、是哺乳动物。 (2)接着依次取 r3、r4、r5、r6 与初始事实集匹配、均不成功,当执行到 r7 时再次获得匹配,于是事实集中以增加一条事实: 该动物身上有暗斑点、有长脖子、有长腿、有奶、有蹄、是哺乳动物、是有蹄类动物。 (3)此后,当搜索到 r11 时又一次匹配成功,事实集变为: 该动物身上有暗斑点、有长脖子、有长腿、有奶、有蹄、是哺乳动物、 是有蹄类动物、该动物是长颈鹿。于是得到最终结论---该动物是长颈鹿。 上述问题的求解过程是一个不断地从规则库中选取可用规则与综合数据库中的已知事实进行匹配的过程,规则的每一次匹配都会使综合数据库增加新的内容,并朝着问题的解决前进了一步。 三程序清单 function FOL-FC-Ask(KB, ) returns a substitution or false repeat until new is empty new{} for each sentence r in KB do (p1pn q) STANDARDIZE-APART(r) for each such that (p1pn )= (p1pn’ ) for some p1pn’ in KB q’SUBST( ,q) if q’ is not a renaming of a sentence already in KB or new then do add q’ to new UNIFY(q’,) if is not fail then return add new to KB return false 四运行结果说明 % file: 动物识别系统规则库.pl 该动物是哺乳动物<- 该动物有毛发. 该动物是哺乳动物<- 该动物有奶. 该动物是有蹄类动物<- 该动物是哺乳动物&有蹄. 该动物是有蹄类动物<- 该动物是哺乳动物& 是嚼反刍动物. %------动物识别系统事实集: %----该动物是斑马<- 该动物是有蹄类动物&该动物是哺乳动物&身上有黑色条纹 %该动物是有蹄类动物. %身上有黑色条纹. 实验三神经网络 一实验内容 1.通过BP网络各项参数的不同设置,观察BP算法的学习效果。观察比 较BP网络拓朴结构及其它各项参数变化对于训练结果的影响。观察并分析不同训练数据对相同拓朴结构的BP网络建模的影响。 2.编写简单的感知器训练算法,实现简单的逻辑运算(与、或) 3. 理解反向传播网络的结构和原理,掌握反向传播算法对神经元的训练过程,了解反向传播公式。通过构建BP网络实例,熟悉前馈网络的原理及结构。二实验思路 1.进入神经网络可视化实验环境,基本实验步骤如下: (1)进入实验环境; (2)选择相关的实验模块; (3)设置相应地实验参数(如设置初始权值为随机值); (4)选择实验运行方式; (5)观测运行过程; (6)修改相应地参数重复第1~5步直到满意为止。 对设计型实验可参照以下步骤: (1)进入实验环境; (2)进入创建新模型工作窗; (3)创建网络拓朴结构; (4)设置相应的网络参数; (5)输入相应的训练数据集; (6)设置实验环境参数; (7)选择相应的运行方式; (8)观察实验过程 (9)修改相关参数并重复1~8步直至满意为止。 三程序清单 namespace bpannIris { class Program { private static double premnmx( double num , double min , double max ) { if (num > max) num = max; if (num < min) num = min; return 2*(num - min) / (max - min) - 1; } private static double premnmx1(double num, double min, double max) { if (num > max) num = max; if (num < min) num = min; return (num - min) / (max - min); } static void Main(string[] args) { int trainNum = 4 ; int testNum = 8 ; double [][] trainInput = new double[trainNum][] ; double[][] trainOutput = new double[trainNum][]; double [] max = new double [2] ; double [] min = new double [2] ; for (int i = 0; i < 2; ++i) { max[i] = double.MinValue; min[i] = double.MaxValue; } // 读取训练数据 StreamReader reader = new StreamReader("trainData.txt"); for (int i = 0; i < trainNum; ++i) { string value = reader.ReadLine(); string[] temp = value.Split('\t'); trainInput[i] = new double[2] ; trainOutput[i] = new double[2] ; for (int j = 0; j < 2; ++j) { trainInput[i][j] = double.Parse(temp[j]); if (trainInput[i][j] > max[j]) max[j] = trainInput[i][j]; if (trainInput[i][j] < min[j]) min[j] = trainInput[i][j]; } for (int j = 0; j < 2; ++j) trainOutput[i][j] = 0; trainOutput[i][ int.Parse( temp[2] ) -1 ] = 1; }// 归一化 for (int i = 0; i < trainNum; ++i) { for (int j = 0; j < 2; ++j) {trainInput[i][j] = premnmx(trainInput[i][j], min[j], max[j]); } } //训练网络 // create multi-layer neural network ActivationNetwork network = new ActivationNetwork( new SigmoidFunction(3), 2, 2, 2 ); // create teacher BackPropagationLearning teacher = new BackPropagationLearning(network); // set learning rate and momentum teacher.LearningRate = 0.1; teacher.Momentum = 0 int iteration = 1 ; while( iteration < 500 ) { teacher.RunEpoch( trainInput , trainOutput ) ; ++iteration ; } // 读取测试数据 StreamReader reader1 = new StreamReader("testData.txt"); double [][] testInput = new double [testNum][] ; double [] testOutput = new double [testNum] ; for (int i = 0; i < testNum; ++i) { string value = reader1.ReadLine(); string[] temp = value.Split('\t'); testInput[i] = new double[2] ; for (int j = 0; j < 2; ++j) { testInput[i][j] = double.Parse(temp[j]); } testOutput[i] = int.Parse(temp[4]); } // 对测试数据进行分类,并统计正确率 int hitNum = 0 ; for( int i = 0 ; i < testNum ; ++i ) { double[] inp = new double[2]{ testInput[i][0] , testInput[i][1] } ; for (int j = 0; j < 2; ++j) inp[j] = premnmx(inp[j], min[j], max[j]); double[] t = { inp[0], inp[1] }; // 使用网络对训练样本计算输出 double[] result = https://www.doczj.com/doc/2b291918.html,pute(t) ; int m = 0; for( int j = 0 ; j < 2 ; ++j ) if( result[j] > result[m] ) m = j ; if ( m + 1 == testOutput[i]) ++hitNum; } System.Console.WriteLine("分类正确率为{0}% ", 100.0 * hitNum / testNum ); System.Console.Read(); } } } 四运行结果说明 异或问题训练数据集: T:输入节点0,输入节点1,输出节点4; A:0.0,0.0,0.0; A:0.0,1.0,1.0; A:1.0,0.0,1.0; A:1.0,1.0,0.0;