用盲目搜索技术解决八数码问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
用盲目搜索技术解决八数码问题
题目
在3×3的棋盘,有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上
标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要解决的问题是:任意给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
算法流程
使用宽度优先搜索
从初始节点开始,向下逐层对节点进形依次扩展,并考察它是否为目标节点,再对下层节点进行扩展(或搜索)之前,必须完成对当层的所有节点的扩展。再搜
索过程中,未扩展节点表OPEN中的节点排序准则是:先进入的节点排在前面,
后进入的节点排在后面。
宽度优先算法如下:
把初始结点S0放入OPEN表中
若OPEN表为空,则搜索失败,问题无解
取OPEN表中最前面的结点N放在CLOSE表中,并冠以顺序编号n
若目标结点,则搜索成功,问题有解N?Sg若N无子结点,则转2
扩展结点N,将其所有子结点配上指向N的放回指针,依次放入OPEN表的尾部,转2
源程序
#include
文档Word
.
#include
#include
using namespace std;
const int ROW = 3;//行数
const int COL = 3;//列数
const int MAXDISTANCE = 10000;//最多可以有的表的数目const int MAXNUM = 10000;
typedef struct _Node{
int digit[ROW][COL];
int dist;//distance between one state and the destination 一个表和目的表的距离
int dep; // the depth of node深度
// So the comment function = dist + dep.估价函数值
int index; // point to the location of parent父节点的位置} Node;
Node src, dest;// 父节表目的表
vector
文档Word
.
bool isEmptyOfOPEN() //open表是否为空
for (int i = 0; i < node_v.size(); i++) {
if (node_v[i].dist != MAXNUM)
return false;
}
return true;
}
bool isEqual(int index,int digit[][COL]) //判断这个最优的节点是否和目的节点一样
{
for (int i = 0; i < ROW; i++)
for (int j = 0; j < COL; j++) {
if (node_v[index].digit[i][j] != digit[i][j])
return false;
}
return true;
}
ostream& operator<<(ostream& os, Node& node)
{
for (int i = 0; i < ROW; i++) {
文档Word
.
for (int j = 0; j < COL; j++)
os << node.digit[i][j] << ' ';
os << endl;
}
return os;
}
void PrintSteps(int index, vector
{
rstep_v.push_back(node_v[index]);
index = node_v[index].index;
while (index != 0)
{
rstep_v.push_back(node_v[index]);
index = node_v[index].index;
}
for (int i=rstep_v.size()-1;i>=0;i--)//输出每一步的探索过程
cout << Step << rstep_v.size() - i
<< endl << rstep_v[i] << endl;
文档Word
.
}
void Swap(int& a, int& b)
{
int t;
t = a;
a = b;
b = t;
}
void Assign(Node& node, int index)
{
for (int i = 0; i < ROW; i++)
for (int j = 0; j < COL; j++)
node.digit[i][j] = node_v[index].digit[i][j];
}
int GetMinNode() //找到最小的节点的位置即最优节点{
int dist = MAXNUM;
int loc; // the location of minimize node