2.3 算法伪代码
首先定义两个表,open表用于存放已经生成,且已用启发式函数进行过估计或评价,但尚未产生它们的后继节点的那些结点,这些结点也称未考察结点;
closed表用于存放已经生成,且已考察过的结点。设S0为初态,Sg为目标状态。
具体过程如下:
(1) 把S0放入open表,记为f=h,令closed为空表;
(2)重复下列过程,直至找到目标结点为止。若open为空表,则失败;
(3)选取open表中未设置过的具有最小f值的结点为最佳节点,并放入closed表中
(4)若最佳节点不是目标节点,则扩展之,产生后继节点。
(5)对每个后继结点进行下列过程:
Ø 建立从该后继结点返回最佳节点的指针;
Ø 计算g(后继结点)=g(最佳节点)+k(最佳节点,后继结点);
Ø Ss:如果该后继节点∈open,则称此节点为old,并把它添加至最佳节点的后继节点中
Ø 比较新旧路径代价,如果个g(后继节点)<g(old),则重新确定old的父亲节点
Ø 若至old节点的代价比较低或一样,则停止扩展节点
Ø 若后继节点不再open表中,则看其是否在closed中
Ø 若后继节点在open表中,则转向Ss;
Ø 若后继节点既不在open表中,又不在closed表中,则把它放入open表中,并填入最佳节点的后裔表,然后走下一步
(6)计算f值
(7)GO LOOP
3算法实现
3.1 数据结构
本实验主要采用链表,队列,堆:
structChess//棋盘
{
int cell[N][N];//数码数组
int Value;//评估值
Direction BelockDirec;//所屏蔽方向
struct Chess * Parent;//父节点
};
queue<struct Chess *> Queue;//队列
stack<Chess *>Stack;//堆
Chess *p=ChessList;
p=p->Parent;//链表
3.2 实验结果
经测试,程序运行良好,结果正确。输入测试数据,初试状态<1 4 0 3 5 2 6 7 8>,目标状态<0 1 2 3 4 5 6 7 8>,运行结果有解,共经过四步。