人工智能導論:狀態(tài)空間搜索實驗—八數(shù)碼問題求解_第1頁
人工智能導論:狀態(tài)空間搜索實驗—八數(shù)碼問題求解_第2頁
人工智能導論:狀態(tài)空間搜索實驗—八數(shù)碼問題求解_第3頁
人工智能導論:狀態(tài)空間搜索實驗—八數(shù)碼問題求解_第4頁
人工智能導論:狀態(tài)空間搜索實驗—八數(shù)碼問題求解_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、昆明理工大學信息工程與自動化學院學生實驗報告( 2014 2015 學年 第 一 學期 )課程名稱:人工智能導論 開課實驗室: 年 月 日年級、專業(yè)、班學號姓名成績實驗項目名稱狀態(tài)空間搜索實驗八數(shù)碼問題求解指導教師胡蓉教師評語該同學是否了解實驗原理: A.了解 B.基本了解 C.不了解 該同學的實驗能力: A.強 B.中等 C.差 該同學的實驗是否達到要求 : A.達到 B.基本達到 C.未達到實驗報告是否規(guī)范: A.規(guī)范 B.基本規(guī)范 C.不規(guī)范實驗過程是否詳細記錄: A.詳細 B.一般 C.沒有 教師簽名: 年 月 日一、實驗內容和要求八數(shù)碼問題:在3×3的方格棋盤上,擺放著1到

2、8這八個數(shù)碼,有1個方格是空的,其初始狀態(tài)如圖1所示,要求對空格執(zhí)行空格左移、空格右移、空格上移和空格下移這四個操作使得棋盤從初始狀態(tài)到目標狀態(tài)。例如:28312316484705765(a) 初始狀態(tài) (b) 目標狀態(tài)圖1 八數(shù)碼問題示意圖請任選一種盲目搜索算法(廣度優(yōu)先搜索或深度優(yōu)先搜索)或任選一種啟發(fā)式搜索方法(全局擇優(yōu)搜索,加權狀態(tài)圖搜索,A 算法或 A* 算法)編程求解八數(shù)碼問題(初始狀態(tài)任選)。選擇一個初始狀態(tài),畫出搜索樹,填寫相應的OPEN表和CLOSED表,給出解路徑,對實驗結果進行分析總結,得出結論。實驗報告內容格式要求:XXXXXXXXXXXX(中文:宋體,小四;英文:Ti

3、mes New Roman)。二、實驗目的1. 熟悉人工智能系統(tǒng)中的問題求解過程;2. 熟悉狀態(tài)空間的盲目搜索和啟發(fā)式搜索算法的應用;3. 熟悉對八數(shù)碼問題的建模、求解及編程語言的應用。三、實驗算法啟發(fā)函數(shù)設定 由八數(shù)碼問題的部分狀態(tài)圖可以看出,從初始節(jié)點開始,在通向目標節(jié)點的路徑上,各節(jié)點的數(shù)碼格局同目標節(jié)點相比較,其數(shù)碼不同的位置個數(shù)在逐漸減少,最后為零,因此可以把數(shù)碼不同的位置個數(shù)作為標志一個節(jié)點到目標節(jié)點距離遠近的一個啟發(fā)性信息,利用這個信息來擴展節(jié)點的選擇,減少搜索范圍,提高搜索速度。2、數(shù)據結構與算法設計數(shù)碼結構體typedef struct node /八數(shù)碼結構體int for

4、mNN; /數(shù)碼組int evalue; /評估值,差距int udirec; /所屏蔽方向,防止往回推到上一狀態(tài),1上2下3左4右struct node *parent; /父節(jié)點Graph;Graph *QuMAX;/隊列Graph *StMAX;/堆棧搜索過程:(搜索采用廣度搜索方式,利用待處理隊列輔助,逐層搜索(跳過劣質節(jié)點)a、把初始數(shù)碼組壓入隊列;b、從隊列中取出一個數(shù)碼組節(jié)點;c、擴展子節(jié)點,即從上下左右四個方向移動空格,生成相應子節(jié)點:d、對子節(jié)點數(shù)碼組作評估,是否為優(yōu)越節(jié)點,即其評估值是否小于等于其父節(jié)點加一,是則將其壓入隊,否則拋棄。 e、判斷壓入隊的子節(jié)點數(shù)碼組(優(yōu)越點)

5、的評估值,為零則表示搜索完成,退出搜索; f、跳到步驟2;四、程序框圖起始把s放入open表失敗成功是否open表為空表?是把open表中的第一個節(jié)點n移入close表否擴展節(jié)點n,把其后裔放入open表的前頭是否有后繼節(jié)點為目標節(jié)點?否是 五、實驗結果及分析采用深度優(yōu)先搜索方式 并簡化搜索六、結論813204765 (2)103824765 (3)813024 (0)765813024765 (4)123804765 (5)013824765 (1)Open表 close表01 2 02 3 4 0 12 4 5 6 0 1 3 目標完成七、源程序及注釋#include <s

6、tdio.h>   /設計了搜索深度范圍,防止隊列內存越界#include <stdlib.h>  6、運行結果#include <time.h>    #define N 3 /數(shù)碼組大小  #define Max_Step 50 /最大搜索深度  #define MAX 50    typedef

7、0;struct node/八數(shù)碼結構體        int formNN;/數(shù)碼組      int evalue;/評估值      int udirect;/所屏蔽方向,防止往回推到上已狀態(tài),1上2下3左4右      struct node *parent;/父節(jié)點&#

8、160; /打印數(shù)碼組  void Print(Graph *The_graph)        int i,j;      if(The_graph=NULL)          printf("圖為空n");     

9、0;else                printf("-n");          for(i=0;i<N;i+)                &

10、#160;       printf("|t");              for(j=0;j<N;j+)                     &#

11、160;          printf("%dt",The_graph->formij);/遍歷打印                            printf("t|n&q

12、uot;);                    printf("|ttt差距:%dt|n",The_graph->evalue);/差距顯示          printf("-n");     &#

13、160;      /評價函數(shù)  int Evaluate(Graph *The_graph,Graph *End_graph)        int valute=0;/差距數(shù)      int i,j;      for(i=0;i<N;i+) &#

14、160;              for(j=0;j<N;j+)                        if(The_graph->formij!=End_graph->formij)

15、0;                               valute+;                 &#

16、160;                  The_graph->evalue=valute;      return valute;      /移動數(shù)碼組  Graph *Move(Graph *The_graph,int Dir

17、ect,int CreatNew_graph)        Graph *New_graph;/      int HasGetBlank=0;/是否獲取空格位置      int AbleMove=1;/是否可移動      int i,j,t_i,t_j,x,y; 

18、0;          for(i=0;i<N;i+)/獲取空格坐標i,j                for(j=0;j<N;j+)                

19、        if(The_graph->formij=0)                                HasGetBlank=1;   &#

20、160;              break;                                  if

21、(HasGetBlank=1)              break;            /printf("空格位置:%d,%dn",i,j);            t_i=i; &#

22、160;    t_j=j;            /移動空格      switch(Direct)                case 1:/上     

23、;         t_i-;              if(t_i<0)                  AbleMove=0;    &

24、#160;         break;          case 2:/下              t_i+;            

25、  if(t_i>=N)                  AbleMove=0;              break;          case&#

26、160;3:/左              t_j-;              if(t_j<0)                  

27、;AbleMove=0;              break;          case 4:/右              t_j+;      

28、;        if(t_j>=N)                  AbleMove=0;              break;     

29、;                           if(AbleMove=0)/不能移動則返回原節(jié)點                return The_

30、graph;            if(CreatNew_graph=1)                New_graph=(Graph *)malloc(sizeof(Graph);/生成節(jié)點         &#

31、160;for(x=0;x<N;x+)                        for(y=0;y<N;y+)                   &#

32、160;            New_graph->formxy=The_graph->formxy;/復制數(shù)碼組                             &#

33、160;       else                New_graph=The_graph;            /移動后      New_graph->formij=N

34、ew_graph->formt_it_j;      New_graph->formt_it_j=0;      /printf("移動產生的新圖:n");      /Print(New_graph);      return New_graph;     

35、0;/搜索函數(shù)  Graph *Search(Graph *Begin,Graph *End)        Graph *g1,*g2,*g;      int Step=0;/深度      int Direct=0;/方向      int i

36、;      int front,rear;      front=rear=-1;/隊列初始化      g=NULL;      rear+;/入隊      Qurear=Begin;      while(rear!=fr

37、ont)/隊列不空                front+;/出隊          g1=Qufront;          /printf("開始第%d個圖:n",front);   

38、;       /Print(g1);          for(i=1;i<=4;i+)/分別從四個方向推導出新子節(jié)點                        Direct=i

39、;              if(Direct=g1->udirect)/跳過屏蔽方向                  continue;           

40、   g2=Move(g1, Direct, 1);/移動數(shù)碼組                            if(g2!=g1)/數(shù)碼組是否可以移動         &

41、#160;                      /可以移動                  Evaluate(g2, End);/評價新的節(jié)點   &#

42、160;              /printf("開始產生的第%d個圖:n",i);                  /Print(g2);         

43、60;        if(g2->evalue<=g1->evalue+1)                                   &#

44、160;    /是優(yōu)越節(jié)點                      g2->parent=g1;                   

45、60;  /移動空格                      switch(Direct)/設置屏蔽方向,防止往回推                    &

46、#160;                           case 1:/上                    

47、;          g2->udirect=2;                              break;      

48、                    case 2:/下                           

49、0;  g2->udirect=1;                              break;              

50、;            case 3:/左                              g2->udirect=4;  

51、0;                           break;                     

52、0;    case 4:/右                              g2->udirect=3;          

53、60;                   break;                             

54、60;                                            rear+;    

55、60;                 Qurear=g2;/存儲節(jié)點到待處理隊列                      if(g2->evalue=0)/為0則搜索完成  

56、60;                                             g=g2;   

57、0;                      /i=5;                          break

58、;                                                  

59、;        else                                        free(g2

60、);/拋棄劣質節(jié)點                      g2=NULL;                         &

61、#160;                                                 &

62、#160;if(g!=NULL)/為0則搜索完成                        if(g->evalue=0)                   

63、             break;                                    

64、        Step+;/統(tǒng)計深度          if(Step>Max_Step)                        break;  

65、;                    return g;      /初始化一個八數(shù)碼結構體  Graph *CR_BeginGraph(Graph *The_graph)        srand(uns

66、igned)time(0);      int M=10;/隨機移動步數(shù)      int Direct;      int i,x,y;      Graph *New_graph;      New_graph=(Graph *)malloc(s

67、izeof(Graph);      for(x=0;x<N;x+)                for(y=0;y<N;y+)                    

68、;    New_graph->formxy=The_graph->formxy;                      for(i=0;i<M;i+)              

69、;  Direct=rand()%4+1;/產生14隨機數(shù)          /printf("Direct:%dn",Direct);          New_graph=Move(New_graph, Direct, 0);         &

70、#160;/Print(New_graph);                  New_graph->evalue=0;      New_graph->udirect=0;      New_graph->parent=NULL;    

71、        return New_graph;      int main (int argc, const char * argv)              / insert code here.

72、60;     /*     Graph Begin_graph=         2,8,3,1,6,4,0,7,5,0,0,NULL               Graph Begin_graph=   &

73、#160;     2,8,3,1,0,4,7,6,5,0,0,NULL                    Graph Begin_graph=         2,0,1,4,6,5,3,7,8,0,0,NULL  

74、0;       */            /目標數(shù)碼組      Graph End_graph=          1,2,3,8,0,4,7,6,5,0,0,NULL     

75、60;            /初始數(shù)碼組      Graph *Begin_graph;      Begin_graph=CR_BeginGraph(&End_graph);/隨機產生初始數(shù)碼組      Evaluate(Begin_graph, &End_graph);/對初始的數(shù)碼組評價      printf("初始數(shù)碼組:n");      Print(Begin_graph);      printf("目標數(shù)碼組:n");     

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論