资源简介
人工智能 八数码问题 A*算法 智能搜索
用人工智能的A*算法解决八数码的问题
代码片段和文件信息
#include
#include
#include
typedef struct Node
{//节点结构体
int data[9];
double fg;
struct Node * parent;
}Node*Lnode;
typedef struct Stack
{//OPEN CLOSED 表结构体
Node * npoint;
struct Stack * next;
}Stack* Lstack;
Node * Minf(Lstack * Open)
{//选取OPEN表上f值最小的节点,返回该节点地址
Lstack temp = (*Open)->nextmin = (*Open)->nextminp = (*Open);
Node * minx;
while(temp->next != NULL)
{
if((temp->next ->npoint->f) < (min->npoint->f))
{
min = temp->next;
minp = temp;
}
temp = temp->next;
}
minx = min->npoint;
temp = minp->next;
minp->next = minp->next->next;
free(temp);
return minx;
}
int Canslove(Node * suc Node * goal)
{//判断是否可解
int a = 0b = 0ij;
for(i = 1; i< 9;i++)
for(j = 0;j < i;j++)
{
if((suc->data[i] > suc->data[j]) && suc->data[j] != 0)a++;
if((goal->data[i] > goal->data[j]) && goal->data[j] != 0)b++;
}
if(a%2 == b%2)return 1;
else return 0;
}
int Equal(Node * sucNode * goal)
{//判断节点是否相等 ,1相等,0不相等
for(int i = 0; i < 9; i ++ )
if(suc->data[i] != goal->data[i])return 0;
return 1;
}
Node * Belong(Node * sucLstack * list)
{//判断节点是否属于OPEN表 或 CLOSED表,是则返回节点地址,否则返回空地址
Lstack temp = (*list) -> next ;
if(temp == NULL)return NULL;
while(temp != NULL)
{
if(Equal(suctemp->npoint))return temp -> npoint;
temp = temp->next;
}
return NULL;
}
void Putinto(Node * sucLstack * list)
{//把节点放入OPEN 或CLOSED 表中
Stack * temp;
temp =(Stack *) malloc(sizeof(Stack));
temp->npoint = suc;
temp->next = (*list)->next;
(*list)->next = temp;
}
///////////////计算f值部分-开始//////////////////////////////
double Fvalue(Node suc Node goal float speed)
{//计算f值
double Distance(NodeNodeint);
double h = 0;
for(int i = 1; i <= 8; i++)
h = h + Distance(suc goal i);
return h*speed + suc.g; //f = h + g;(speed值增加时搜索过程以找到目标为优先因此可能不会返回最优解)
}
double Distance(Node suc Node goal int i)
{//计算方格的错位距离
int kh1h2;
for(k = 0; k < 9; k++)
{
if(suc.data[k] == i)h1 = k;
if(goal.data[k] == i)h2 = k;
}
return double(fabs(h1/3 - h2/3) + fabs(h1%3 - h2%3));
}
///////////////计算f值部分-结束//////////////////////////////
///////////////////////扩展后继节点部分的函数-开始/////////////////
int BelongProgram(Lnode * suc Lstack * Open Lstack * Closed Node goal float speed)
{//判断子节点是否属于OPEN或CLOSED表 并作出相应的处理
Node * temp = NULL;
int flag = 0;
if((Belong(*sucOpen) != NULL) || (Belong(*sucClosed) != NULL))
{
if(Belong(*sucOpen) != NULL) temp = Belong(*sucOpen);
else temp = Belong(*sucClosed);
if(((*suc)->g) < (temp->g))
{
temp->parent = (*suc)->parent;
temp->g = (*suc)->g;
temp->f = (*suc)->f;
flag = 1;
}
}
else
{
Putinto(* suc Open);
(*suc)->f = Fvalue(**suc goal speed);
}
return flag;
}
int Canspread(Node suc int n)
{//判断空格可否向该方向移动1,2,3,4表示空格向上向下向左向右移
int iflag = 0;
for(i = 0;i < 9;i++)
相关资源
- 自动解决智能拼图,A*算法+生成可解
- 人工智能经典作业,野人与传教士过
- wumpus世界(MFC编写)
- 四子棋智能下棋C语言实现
- LeNet-5神经网络——C源代码
- Python基础教程第3版) 高清PDF
- 基于人工智能的五子棋人机对弈
- 推箱子人工智能算法
- 八数码问题的八种实现方法
- 用C++stl与QT实现的A*算法Demo
- 人工智能小游戏-基于alpha-beta剪枝算法
- C++实现A*算法十五数码问题
- 八数码问题数字华容道,九宫格深度
- 动物识别系统MFC)
- 九宫格程序c++人工智能
- K210使用情况指南以及测试情况
- 人工智能归结反演c++代码
- 基于A*算法的十五数码程序 C语言版
- 人工智能 A算法 九宫格 启发式搜索
- 遗传算法解八数码问题
- 八数码问题C++图形界面
- C++实现的人脸识别系统
- Othello黑白棋游戏与AI
- 人工智能的贪食蛇
- Alpha-Beta剪枝算法一字棋源码及实验报
- A*算法求解八数码--演示程序MFC
- A*算法用于动态路径规划
- 八数码问题 队列式分支限界法
- A*算法 A star算法 C语言版
- 启发式搜索算法解决八数码问题(C语
评论
共有 条评论