1、 人工智能 实验大作业实验题目: 广度优先搜索 专业 信息与计算科学 年级 09 姓名 常 红 学号 091001118 指导老师 时 华 日 期 2012-12-8 人工智能学习-广度优先搜索一 实验目的:熟悉和掌握广度优先算法二 实验方法:1. 熟悉广度优先搜索算法2. 用 C+编程实现三 实验背景知识:在深度优先搜索中,深度越大的结点越先得到扩展。如果把它改为深度越小的结点越先得到扩展,就是广度优先搜索法。广度优先搜索的显著特点是,在产生新的子结点时,深度越小的越得到优先扩展,即先产生它的子结点。当结点到根结点的费用和结点的深度成正比,特别是当每一结点到根结点的费用等于深度值时,用广度优
2、先得到的解一定是最优解。但只要将下述算法进行改进也可以求得最优解,这就成了代价优先搜索。四算法的基本思想:1.建立一个空的状态队列 SS;2.建立一个空的状态库 SB;3.把初始状态 S(0)存入队列 SS 中;4.若队列状态是目标状态,则搜索成功,算法运行中止。如该状态的形式为 S(path),则解就是(path);5.若某种搜索极限已经达到(如空间用完等) ,则搜索失败,算法运行结束,没有解;6.按某种原则取一个可以应用于 SS 第一个状态 S(path)并产生合适的新状态的规则Rn,产生新状态 T(path,n),并将其置于 SS 的最后,转(4) 。若扩展失败,即没有新状态产生,则将
3、SS 中第一个状态从 SS 中除去,送入 SB 中,执行下步;7.若 SS 成为空队列,则搜索失败,算法运行结束,没有解。否则转(5) 。 五基本算法伪代码:program BFS;初始化;建立数据库 data;初始状态存入数据库;设队列首指针 closed:=0;队列尾指针 open:=1;repeat取下一个 closed 所指结点;for r:=1 to rmax do r 为产生规则编号beginif 子结点符合条件 thenbeginopen 增1,把新结点存入数据库队尾;if 新结点与原有结点重复 then删去该结点(open 减1)elseif 新结点即目标 then 输出并退出
4、;endenduntil closed=open队列空;六程序代码:#include #include #include using namespace std; const double PRECISION=1E-6; /搜索精度const int COUNT_OF_NUMBER=4; /开始有 4个搜索节点const int NUMBER_TO_BE_CAL=24; /double numberCOUNT_OF_NUMBER; string expressionCOUNT_OF_NUMBER; bool Search(int n) if(n=1) /队列里面只有一个节点时,若精度不符合,则整个搜索失败 if(fabs(number0-NUMBER_TO_BE_CAL)x; numberi=x; itoa(x,buffer,10); /将整数 x转换为 10进制字符数组,然后存放在 buffer中expressioni=buffer; if(Search(COUNT_OF_NUMBER) cout“Success.“endl; else cout“Fail.“endl; 七实验结果: