190 likes | 326 Views
人工智慧期末報告. 碩資工一甲 蘇柏榕 指導 老師:鄭淑真. 1. 主題. 主題:數字拼圖 使用 語法: C++ 沒有圖示 介面 全部採用文字 輸入 可 自行指定起始樣式及結束樣式. 1. 主題. 使用 方法 1. 輸入拼圖的組合. 2. 輸入想要的結果. 3. 輸入搜尋深度. 4. 處理完成後可選擇是否顯示圖形. 5. 顯示圖形. 程式架構. 程式主要分成三個架構 讀取 輸入 運算 顯示 結果及繪圖
E N D
人工智慧期末報告 碩資工一甲蘇柏榕 指導老師:鄭淑真
1.主題 • 主題:數字拼圖 • 使用語法:C++ • 沒有圖示介面 • 全部採用文字輸入 • 可自行指定起始樣式及結束樣式
1.主題 • 使用方法 1.輸入拼圖的組合
程式架構 • 程式主要分成三個架構 • 讀取輸入 • 運算 • 顯示結果及繪圖 • 一開始程式會先建立陣列來供後續使用,接著會讓使用者輸入開始(block[i])與結束(goal_block[i])的拼圖樣式,接著會讓使用者輸入要搜尋的深度(maxdepth),深度的多寡會影響到搜尋結果,深度越深越有機會找到正確答案,然而,不一定會找到答案,若一直找不到大多是無解或步數過大。
輸入完成會呼叫heur、Prepend、goal、notonqueue…..等來處理拼圖排列及判定是否完成,goal會持續測量拼圖是否達成goal_block[i]指定的目標,若有就將程式導向完成的部分,如果沒有找出結果則導向尋找失敗。輸入完成會呼叫heur、Prepend、goal、notonqueue…..等來處理拼圖排列及判定是否完成,goal會持續測量拼圖是否達成goal_block[i]指定的目標,若有就將程式導向完成的部分,如果沒有找出結果則導向尋找失敗。 • 另外還有計時器和計算步數的部分,計時器會於處理完成後顯示系統花了多少時間完成(無論成功失敗),步數則在成功時顯示,顯示系統花了多少步完成。 • 最後還有畫圖的功能,會讀取node中的各步驟陣列,將陣列中的數字畫成拼圖來標示各步驟。
關鍵程式 • 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++; • }
關鍵程式 • 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++; • }
關鍵程式 • 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();
程式節錄 • 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; • }
程式節錄 • 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; • }
程式節錄 • 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);
程式節錄 • printf("\n圖形顯示完成\n"); • printf(node->str); • printf("\n"); • system("PAUSE"); • break; • }
參考資料 • http://gaurang.org/programs/astar/astar.cpp