TA的每日心情 | 衰 2016-3-10 10:33 |
---|
签到天数: 14 天 [LV.3]偶尔看看II
管理员
  
- 积分
- 808
|
沙发

楼主 |
发表于 2014-5-8 15:36:15
|
只看该作者
们先看下最好优先算法的逻辑(起始为止为A结束位置是P,字母后数字为节点的估价值):
搜索的过程中设置两个表:OPEN和CLOSE。OPEN表保存了所有已生成的未考察的节点。CLOSE表中记录了已访问的节点。算法中有一步是根据估价函数重新排列OPEN表,这样循环中的每一步值考虑OPEN中状态最好的节点搜索过程如下:
1.初始状态
OPEN = [A5];CLOSED=[ ] ;
2.估算A5,取得所有子节点,并放入OPEN表中
OPEN = [B4,C4,D6];CLOSED = [A5];
3.估算B4,取得所有子节点,并放入OPEN表中
OPEN = [C4,E5,F5,D6];CLOSED = [B4,A5];
4.估算C4,取得所有子节点,并放入OPEN表中
OPEN = [H3,G4,E5,F5,D6];CLOSED = [C4,B4,A5];
5.估算H3,取得所有子节点,并放入OPEN表中
OPEN = [O2,P3,G4,E5,F5,D6];CLOSED = [H3,C4,B4,A5];
6.估算O2,取得所有子节点,并放入OPEN表中
OPEN = [P3,G4,E5,F5,D6];CLOSED = [O2,H3,C4,B4,A5];
7.估算P3得到解
伪代码如下:
Best_First_Seach()
{
Open = [起始节点];
Closed = [ ];
while(Open表非空)
{
从Open中取得一个节点X,并从Open表中删除。
if(X节点是目标节点)
{
求的路径PATH;
return PATH;
}
for(每个X的子节点Y)
{
if(Y不在OPEN表和CLOSE表中)
{
求Y的估价值;
将Y插入OPEN表中;
}
else if(Y在OPEN表中)
{
if(Y的估价值小于OPEN表的估价值)
更新OPEN表中的估价值;
}
else
{
if(Y的估价值小于CLOSE表的估价值)
更新CLOSE表中的股价值
从CLOSE表中移出节点,放入OPEN表中;
}
}
讲X节点插入CLOSE表中;
按照估价值讲OPEN表中的节点排序;
}
}
|
|