1 / 19

人工智慧期末報告

人工智慧期末報告. 碩資工一甲 蘇柏榕 指導 老師:鄭淑真. 1. 主題. 主題:數字拼圖 使用 語法: C++ 沒有圖示 介面 全部採用文字 輸入 可 自行指定起始樣式及結束樣式. 1. 主題. 使用 方法 1. 輸入拼圖的組合. 2. 輸入想要的結果. 3. 輸入搜尋深度. 4. 處理完成後可選擇是否顯示圖形. 5. 顯示圖形. 程式架構. 程式主要分成三個架構 讀取 輸入 運算 顯示 結果及繪圖

ketan
Download Presentation

人工智慧期末報告

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 人工智慧期末報告 碩資工一甲蘇柏榕 指導老師:鄭淑真

  2. 1.主題 • 主題:數字拼圖 • 使用語法:C++ • 沒有圖示介面 • 全部採用文字輸入 • 可自行指定起始樣式及結束樣式

  3. 1.主題 • 使用方法 1.輸入拼圖的組合

  4. 2.輸入想要的結果

  5. 3.輸入搜尋深度

  6. 4.處理完成後可選擇是否顯示圖形

  7. 5.顯示圖形

  8. 程式架構 • 程式主要分成三個架構 • 讀取輸入 • 運算 • 顯示結果及繪圖 • 一開始程式會先建立陣列來供後續使用,接著會讓使用者輸入開始(block[i])與結束(goal_block[i])的拼圖樣式,接著會讓使用者輸入要搜尋的深度(maxdepth),深度的多寡會影響到搜尋結果,深度越深越有機會找到正確答案,然而,不一定會找到答案,若一直找不到大多是無解或步數過大。

  9. 輸入完成會呼叫heur、Prepend、goal、notonqueue…..等來處理拼圖排列及判定是否完成,goal會持續測量拼圖是否達成goal_block[i]指定的目標,若有就將程式導向完成的部分,如果沒有找出結果則導向尋找失敗。輸入完成會呼叫heur、Prepend、goal、notonqueue…..等來處理拼圖排列及判定是否完成,goal會持續測量拼圖是否達成goal_block[i]指定的目標,若有就將程式導向完成的部分,如果沒有找出結果則導向尋找失敗。 • 另外還有計時器和計算步數的部分,計時器會於處理完成後顯示系統花了多少時間完成(無論成功失敗),步數則在成功時顯示,顯示系統花了多少步完成。 • 最後還有畫圖的功能,會讀取node中的各步驟陣列,將陣列中的數字畫成拼圖來標示各步驟。

  10. DEMO

  11. 關鍵程式 •  while(i<9) • { • char chr; • chr = fgetc(stdin); • if (chr==32) continue; • if (chr=='x') block[i] = 8;   • else if (chr >= '1' && chr <= '9') block[i] = chr - '1'; • else { printf("錯誤輸入,請輸入類似這樣...2 1 3 4 7 5 6 8 x.", chr); return 1; } • i++; • }

  12. 關鍵程式 • printf("\n 請輸入想要的結果 (例如 1 2 3 4 5 6 7 8 x): "); •  i = 0; •  while(i<9) • { • char chr; • chr = fgetc(stdin); • if (chr==32) continue; • if (chr=='x') goal_block[i] = 8; • else if (chr >= '1' && chr <= '9') goal_block[i] = chr - '1'; • else { printf("chr=%d. 錯誤輸入,請照以下範例...2 1 3 4 7 5 6 8 x.",(int) chr); return 1; } • i++; • }

  13. 關鍵程式 • printf("輸入搜尋深度 (<25 快速搜尋): "); • scanf("%d", &maxdepth); •  Start = clock();  printf("\n處理中..."); •  top = newelement(); •  for(i=0; i<9; i++) •  top->block[i] = block[i]; •  top->totalcost = heur(block); • elementstruct* newnode = newelement();

  14. 程式節錄 • while (1) •    { • elementstruct* node = bestnodefromqueue(); •    if (node == NULL) {    •    End = clock(); • timecnt = (double)(End-Start)/CLOCKS_PER_SEC; • printf("完成!\n"); • printf("總時間%4.10f秒\n",timecnt); • printf("沒有辦法解決小於 %d 的深度.\n", maxdepth); • printf("請嘗試5以上的深度.\n"); • printf("若在深度35-40還是沒解決,代表無解\n\n"); • system("PAUSE"); • break; •      }

  15. 程式節錄 • else if (goal(node->block)) { •    End = clock(); • timecnt = (double)(End-Start)/CLOCKS_PER_SEC; • char chr[15]; • printf("done. \n發現解答."); • printf("\n步數:%d",node->pathcost); • printf("總時間%4.10f秒\n",timecnt); • printf("\n需要顯示每一步驟的圖形嗎? (Y/N)?"); • scanf("%s", chr); • if(chr[0] =='n' || chr[0]=='N') { • printf("\n (Move Blank u=up, d=down, l=left, r=right)\n"); • printf(node->str); • printf("\n"); •  system("PAUSE"); •  break; • }

  16. 程式節錄 • int block2[9]; • for (i=0; i<node->pathcost; i++) •  { • print_block(block); •    apply(block2, block, op(node->str[i])); •    for(int j=0; j<=8; j++) •      block[j] = block2[j]; •  } • print_block(block);

  17. 程式節錄 • printf("\n圖形顯示完成\n"); • printf(node->str); • printf("\n"); • system("PAUSE"); • break; •      }

  18. 參考資料 • http://gaurang.org/programs/astar/astar.cpp

  19. 感謝觀看

More Related