当前位置:文档之家› 启发式搜索 A

启发式搜索 A


The heuristic search algorithm
Yx-Kx Yx (Nxx University of Technology, Nixx 3xx00, China) Abstract: abstract content (including purpose, method, result and conclusion four elements) of artificial intelligence to solve the problem is mostly unstructured or poorly structured problems, can improve the efficiency of heuristic search polar. The basic idea of this paper with eight digital problem as an example to explain the heuristic search algorithm. Through the search and violence than we found the heuristic search is efficient There is nothing comparable to this. Heuristic search is bound to play an important role in the field of artificial intelligence. Keywords: A*; heuristic search; best first search; evaluation function;
int dx,dy=0; string s="283064175"; string s0=s; temp.priority=Wcount(s) + 0; temp.value=s; temp.pre=0; q.push(temp); //第一个节点入队 V.insert(s);//加入已搜索的队列 if(isOver(s)) return s; OutPut(s); while(!q.empty()) { s=s0=q.top().value; int Pre=q.top().pre; q.pop(); //取出当前节点,并从中删除 dx=s.find('0')/3; dy=s.find('0')%3; if(dy-1>=0) //向左 { swap(s[dx*3+dy],s[dx*3+dy-1]);//向左交换 if(V.find(s)==V.end()) { if(isOver(s)) return s; temp.priority=Wcount(s)+Pre; temp.value=s; temp.pre=Pre+1; q.push(temp);//当前节点加入队列 V.insert(s);//加入已搜索的队列 OutPut(s);cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl; } } s=s0; if(dy+1<=2) //向右 { swap(s[dx*3+dy],s[dx*3+dy+1]);//向左交换 if(V.find(s)==V.end())//当前状态未曾访问过 { if(isOver(s))//到达目的状态 return s; temp.priority=Wcount(s)+Pre; temp.value= s;
Figure 2-2 九宫格
本题采用的估价函数为: f (n)=g (n)+h (n) 其中:h(n)用来计算对应于节点 n 的数据库中错放的棋子曼哈顿距离之和;g (n)为从起点到 n 的代价值。因此,第二层的棋局
2 启发式搜索算法解决八数码问题
2.1 暴力搜索
为了和启发式搜索算法对比实验数据我们先用暴力搜索解决八数码问题
1.1 启发式搜索介绍 为减小搜索范围而需要利用某些已知的、有关具体问题领域的特性信息。此种信息叫做启发信息。利 用启发信息的搜索方法叫做启发式搜索方法。 特点:重排 OPEN 表,选择最有希望的节点加以扩展 种类:最佳优先搜索、A*算法等 启发式搜索策略:有关具体问题领域的信息常常可以用来简化搜索。一个比较灵活(但代价也较大)的 利用启发信息的方法是应用某些准则来重新排列每一步 OPEN 表中所有节点的顺序。然后,搜索就可能沿着 某个被认为是最有希望的边缘区段向外扩展。应用这种排序过程,需要某些估算节点“希望”的量度,这 种量度叫做估价函数(evalution function) 估价函数:为获得某些节点“希望”的启发信息,提供一个评定侯选扩展节点的方法,以便确定哪个 节点最有可能在通向目标的最佳路径,f(n)表示节点 n 的估价函数值。 建立估价函数的一般方法:试图确定一个处在最佳路径上的节点的概率;提出任意节点与目标集之间 的距离量度或差别量度;或者在棋盘式的博弈和难题中根据棋局的某些特点来决定棋局的得分数。这些特 点被认为与向目标节点前进一步的希望程度有关。应用节点“希望”程度(估价函数值)重排 OPEN 表。
0 引言
暴力搜索暴力搜索不用技巧,类似穷举,对于复杂度较高的问题不具有现实意思。而启发式搜索会在 状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这 样可以省略大量无谓的搜索路径,提高了效率。可以在现实中很好的解决复杂问题,且具有不可比拟的时 间优越性。
1 知识背景
Figure 2-3 A 算法搜索过程 数据结构如下:(所有代码纯手打) struct node { string value; // 用一个字符串储存状态 int priority; // 优先级( = 不在位数 + 扩展深度 ) int pre; // 扩展深度 bool operator <(node a) const { return a.priority<priority; } }; priority_queue<node> q;// 待扩展队列 set<string>V; // 已经搜索过状态 A 搜索代码如下: (所有代码纯手打) string Solve() //宽搜: A 算法 深度+不在位数 {
s=s0;// 因为在上一部先左交换了一下,所以恢复栈顶值 if(dy+1<=2) //向右 { swap(s[dx*3+dy],s[dx*3+dy+1]);//向左交换 if(V.find(s)==V.end())//当前状态未曾访问过 { if(isOver(s))//到达目的状态 return s; q.push(s);//当前节点加入队列 V.insert(s);//加入已搜索的队列 OutPut(s);cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl; } } s=s0; if(dx-1>=0) //向上 { swap(s[dx*3+dy],s[(dx-1)*3+dy]);//向左交换 if(V.find(s)==V.end())//当前状态未曾访问过 { if(isOver(s))//到达目的状态 return s; q.push(s);//当前节点加入队列 V.insert(s);//加入已搜索的队列 OutPut(s);cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl; } } s=s0; if(dx+1<=2) //向下 { swap(s[dx*3+dy],s[(dx+1)*3+dy]);//向左交换 if(V.find(s)==V.end())//当前状态未曾访问过 { if(isOver(s))//到达目的状态 return s; q.push(s);//当前节点加入队列 V.insert(s);//加入已搜索的队列 OutPut(s);cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl; } } } return s; }
2.2 A 算法
f(n) — 节点 n 的估价函数; g(n) — 评价函数,从初始节点 S 到 n 节点的实际代价; h(n) — 启发函数,从 n 到目标节点 Sg 最佳路径的估计代价。
这里 h(n)体现了搜索的启发信息,因为 g(n)是已知的。如果说详细点,g(n)代表了搜索 的宽度优先趋势。但是当 h(n)g(n) 时,可以省略 g(n),而提高效率。 g(n)的计算方法:g(n)就是在搜索树中从 S 到 n 这段路径的代价,这一代价可以由从 n 到 S 寻找指针时,把所遇到的各段弧线的代价加起来给出(这条路径就是到目前为止用搜索算法 找到的从 S 到 n 的最小代价路径)。 h(n)的计算方法:h(n)依赖于有关问题的领域的启发信息。这种信息可能与八数码魔方问题 中的函数 W(n)所用的那种信息相似。把 h(n)叫做启发函数。
启发式搜索算法研究
xxx11010108
(xx 大学 电信学院,浙江 xx 3xx010) 摘 要: 人工智能所要解决的问题大部分是非结构化或结构不良的问题,启发式搜索可以极地提高效率。 本文以八数码问题为例讲解了启发式搜索算法的基本思想。通过和暴力搜索相比我们发现启发式搜索具有 无可比拟的高效性。启发式搜索必然在人工智能领域发挥重要作用。 关键词: 启发式搜索; A*; 最佳优先搜索; 估价函数;
Figure 1-1 算法流程图
1.2 问题引入 八数码问题也称为九宫问题。在 3×3 的棋盘,摆有八个棋子,每个棋子上标有 1 至 8 的某一数字,不 同棋子上标的数字不相同。 棋盘上还有一个空格, 与空格相邻的棋子可以移到空格中。 要求解决的问题是: 给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子的移动步骤。
相关主题