人工智能-求解八数码问题

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>,运行结果有解,共经过四步。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lbx0815

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值