人工智慧導論(2) 啟發式演算法(八數碼問題)

2021-08-10 19:44:53 字數 3273 閱讀 3786

用a*演算法來解決八數碼問題。

#include

#include

#include

using

namespace

std;

int open_cnt=0;

int open_node_cnt;//open表節點個數

int close_cnt=0;

int noresoult=0;

struct nodestart,end;

struct open_closeopen[10000],close[10000];

bool isable()

}for(int i=0;i<9;i++)

}if((tf%2==1&&ef%2==1)||(tf%2==0&&ef%2==0)) return

true;

else

return

false;

}int a_start_h(node *node)

if(end.a[i][j]==k)}}

h+=abs(old_x-end_x)+abs(old_y-end_y);

}

return h;

}void input()}}

for(int i=0;i<3;i++)}}

start.g=0;

start.h=a_start_h(&start);

start.f=start.g+start.h;

}int show(node *node)

printf("\n");

}cout

<<"**********====\n\n";

}bool isend(node *node)

}return

true;

} void sort(open_close *open)

}temp=open[min_flag];

open[min_flag]=open[0];

open[0]=temp;

}void move(int flag,node *node)

}n->a[node->x][node->y]=node->a[node->x-1][node->y];

n->a[node->x-1][node->y]=0;

n->x=node->x-1;

n->y=node->y;

n->flag=3;

n->father=node;

n->g=node->g+1; // 求 g()

n->h=a_start_h(n);

n->f=n->g+n->h;

open_cnt++;

open_node_cnt++;

open[open_cnt].np=n; //新增到open表

open[open_cnt].f=n->f; // 求 f()

}else

if(flag==2&&node->y<2)

}n->a[node->x][node->y]=node->a[node->x][node->y+1];

n->a[node->x][node->y+1]=0;

n->x=node->x;

n->y=node->y+1;

n->flag=4;

n->father=node;

n->g=node->g+1; // 求 g()

n->h=a_start_h(n);

n->f=n->g+n->h;

open_cnt++;

open_node_cnt++;

open[open_cnt].np=n; //新增到open表

open[open_cnt].f=n->f; // 求 f()

}else

if(flag==3&&node->x<2)

}n->a[node->x][node->y]=node->a[node->x+1][node->y];

n->a[node->x+1][node->y]=0;

n->x=node->x+1;

n->y=node->y;

n->flag=1;

n->father=node;

n->g=node->g+1; // 求 g()

n->h=a_start_h(n);

n->f=n->g+n->h;

open_cnt++;

open_node_cnt++;

open[open_cnt].np=n; //新增到open表

open[open_cnt].f=n->f; // 求 f()

}else

if(flag==4&&node->y>0)

}n->a[node->x][node->y]=node->a[node->x][node->y-1];

n->a[node->x][node->y-1]=0;

n->x=node->x;

n->y=node->y-1;

n->flag=2;

n->father=node;

n->g=node->g+1; // 求 g()

n->h=a_start_h(n);

n->f=n->g+n->h;

open_cnt++;

open_node_cnt++;

open[open_cnt].np=n; //新增到open表

open[open_cnt].f=n->f; // 求 f()

}

} void expand(node *node)

}int main()

expand(open[0].np);//擴充套件最優節點的子節點

open[0].np=null;

open[0].f=-1;

open_node_cnt--;

sort(open); //open表排序}}

else

cout

<<"無解";

} /*

有解1 0 3

7 2 4

6 8 5

1 2 3

8 0 4

7 6 5

無解1 2 3

4 0 7

6 5 8

3 2 1

6 5 0

4 7 8

*/

人工智慧 搜尋 啟發式搜尋

搜尋演算法的形式化描述 狀態state 動作motion 狀態轉移state transition 路徑path 測試目標test target 一 啟發式搜尋 有資訊搜尋 heuristic search 代表演算法 貪婪最佳優先搜尋 greedy best first search a 搜尋 啟...

人工智慧 有資訊搜尋 (啟發式)

一 最佳優先搜尋 根據評價函式選擇表現的最佳的節點進行擴充套件 最佳優先搜尋 best first search 演算法 不同的方法有不同的評價函式 啟發函式,標記h x h n 從節點n到目標的最低耗散估計值 啟發函式是額外資訊的一種最普通的形式 二 貪婪最佳優先搜尋 最先擴充套件離目標節點最近的...

八數碼問題 啟發式搜尋

一 問題描述 在乙個3 3 的方棋盤上放置著 1,2,3,4,5,6,7,8 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...