版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
PAGE6實驗二:九宮重排一、實驗目的A*算法是人工智能領域最重要的啟發(fā)式搜索算法之一,本實驗通過九宮重排問題,強化學生對A*算法的理解與應用,為人工智能后續(xù)環(huán)節(jié)的課程奠定基礎。二、問題描述給定九宮格的初始狀態(tài),要求在有限步的操作內,使其轉化為目標狀態(tài),且所得到的解是代價最小解(即移動的步數(shù)最少)。如:281304756123804765三、實驗原理如果使一般搜索過程滿足如下限制,則它就稱為A*算法:1、把OPEN表中的節(jié)點按估價函數(shù)f(x)=g(x)+h(x)的值從小至大進行排序(一般搜索過程的第7步)。2、g(x)是對g*(x)的估計,g(x)>0。3、h(x)是h*(x)的下界,即對所有的x均有:h(x)≤h*(x)其中,g*(x)是從初始節(jié)點S0到節(jié)點x的最小代價;h*(x)是從節(jié)點x到目標節(jié)點的最小代價,若有多個目標節(jié)點,則為其中最小的一個。四、基本要求輸入:九宮格的初始狀態(tài)和目標狀態(tài)輸出:重排的過程,即途徑的狀態(tài)以及所用步數(shù)!實驗程序#include"iostream.h"#include<time.h>#include<stdio.h>#include<dos.h>#include<conio.h>staticinttarget[9];//classdefinitionclasseight_num{private: intnum[9]; intnot_in_position_num; intdeapth; inteva_function;public: eight_num*parent; eight_num*leaf_next; eight_num*leaf_pre;eight_num(intinit_num[9]); eight_num(intnum1,intnum2,intnum3,intnum4,intnum5,intnum6,intnum7,intnum8,intnum9) { num[0]=num1; num[1]=num2; num[2]=num3; num[3]=num4; num[4]=num5; num[5]=num6; num[6]=num7; num[7]=num8; num[8]=num9; } eight_num(void) { for(inti=0;i<9;i++) num[i]=i; }voidcul_para(void);voidget_numbers_to(intother_num[9]); intget_nipn(void) {returnnot_in_position_num;} intget_deapth(void) {returndeapth;} intget_evafun(void) {returneva_function;} voidset_num(intother_num[9]);voidshow(void); eight_num&operator=(eight_num&); eight_num&operator=(intother_num[9]); intoperator==(eight_num&); intoperator==(intother_num[9]);};//計算啟發(fā)函數(shù)g(n)的值voideight_num::cul_para(void){ inti; inttemp_nipn=0; for(i=0;i<9;i++) if(num[i]!=target[i]) temp_nipn++; not_in_position_num=temp_nipn; if(this->parent==NULL) deapth=0; else deapth=this->parent->deapth+1; eva_function=not_in_position_num+deapth;}//構造函數(shù)1eight_num::eight_num(intinit_num[9]){ for(inti=0;i<9;i++) num[i]=init_num[i];}//顯示當前節(jié)點的狀態(tài)voideight_num::show(){ cout<<num[0]; cout<<""; cout<<num[1]; cout<<""; cout<<num[2]; cout<<"\n"; cout<<num[3]; cout<<""; cout<<num[4]; cout<<""; cout<<num[5]; cout<<"\n"; cout<<num[6]; cout<<""; cout<<num[7]; cout<<""; cout<<num[8]; cout<<"\n";}//復制當前節(jié)點狀態(tài)到一個另數(shù)組中voideight_num::get_numbers_to(intother_num[9]){ for(inti=0;i<9;i++) other_num[i]=num[i];}//設置當前節(jié)點狀態(tài)(欲設置的狀態(tài)記錄的other數(shù)組中)voideight_num::set_num(intother_num[9]){ for(inti=0;i<9;i++) num[i]=other_num[i];}eight_num&eight_num::operator=(eight_num&another_8num){ for(inti=0;i<9;i++) num[i]=another_8num.num[i]; not_in_position_num=another_8num.not_in_position_num; deapth=another_8num.deapth+1; eva_function=not_in_position_num+deapth; return*this;}eight_num&eight_num::operator=(intother_num[9]){ for(inti=0;i<9;i++) num[i]=other_num[i]; return*this;}inteight_num::operator==(eight_num&another_8num){ intmatch=1; for(inti=0;i<9;i++) if(num[i]!=another_8num.num[i]) { match=0; break; } if(match==0) return0; else return1;}inteight_num::operator==(intother_num[9]){ intmatch=1; for(inti=0;i<9;i++) if(num[i]!=other_num[i]) { match=0; break; } if(match==0) return0; else return1;}//classdefinitionover//空格向上移intmove_up(intnum[9]){ for(inti=0;i<9;i++) if(num[i]==0) break; if(i<3) return0; else { num[i]=num[i-3]; num[i-3]=0; return1; }}//空格向下移intmove_down(intnum[9]){ for(inti=0;i<9;i++) if(num[i]==0) break; if(i>5) return0; else { num[i]=num[i+3]; num[i+3]=0; return1; }}//空格向左移intmove_left(intnum[9]){ for(inti=0;i<9;i++) if(num[i]==0) break; if(i==0||i==3||i==6) return0; else { num[i]=num[i-1]; num[i-1]=0; return1; }}//空格向右移intmove_right(intnum[9]){ for(inti=0;i<9;i++) if(num[i]==0) break; if(i==2||i==5||i==8) return0; else { num[i]=num[i+1]; num[i+1]=0; return1; }}//判斷可否解出inticansolve(intnum[9],inttarget[9]){ inti,j; intcount_num,count_target; for(i=0;i<9;i++) for(j=0;j<i;j++) { if(num[j]<num[i]&&num[j]!=0) count_num++; if(target[j]<target[i]&&target[j]!=0) count_target++; } if((count_num+count_target)%2==0) return1; else return0;}//判斷有無重復intexisted(intnum[9],eight_num*where){ eight_num*p; for(p=where;p!=NULL;p=p->parent) if(*p==num) return1; return0;}//尋找估價函數(shù)最小的葉子節(jié)點eight_num*find_OK_leaf(eight_num*start){ eight_num*p,*OK; p=OK=start; intmin=start->get_evafun(); for(p=start;p!=NULL;p=p->leaf_next) if(min>p->get_evafun()) { OK=p; min=p->get_evafun(); } returnOK;}//主函數(shù)開始intmain(void){ intmemery_used=0,step=0; intnum[9]; intflag=0;//是否輸入錯誤標志,1表示輸入錯誤 intbingo=0;//是否查找成功標志,1表示成功 inti,j; cout<<"Pleaseinputtheinitialmatrix(0fortheblank):\n"; for(i=0;i<9;i++) { flag=0; cin>>num[i]; for(j=0;j<i;j++) if(num[i]==num[j]) flag=1; if(num[i]<0||num[i]>8||flag==1) { i--; cout<<"Illeglenumber!\tReinput!\n"; } } cout<<"Pleaseinputthetargetmatrix(0fortheblank):\n"; for(i=0;i<9;i++) { flag=0; cin>>target[i]; for(j=0;j<i;j++) if(target[i]==target[j]) flag=1; if(target[i]<0||target[i]>8||flag==1) { i--; cout<<"Illeglenumber!\tReinput!\n"; } } eight_numS(num),Target(target); S.parent=S.leaf_next=S.leaf_pre=NULL; S.cul_para(); memery_used++; cout<<"Nowtheinitialnumbersare:\n"; S.show(); cout<<"AndtheTargetis:\n"; Target.show(); if(!icansolve(num,target)) { cout<<"Noonecansolveit!\n"; cin>>i; return1; } eight_num*OK_leaf=&S,*leaf_start=&S,*new_8num,*p; while(OK_leaf!=NULL&&bingo!=1) { OK_leaf=find_OK_leaf(leaf_start); if(*OK_leaf==Target) { bingo=1; break; } p=OK_leaf->leaf_pre; OK_leaf->get_numbers_to(num); if(move_up(num)&&!existed(num,OK_leaf)) { new_8num=neweight_num; new_8num->set_num(num); new_8num->parent=OK_leaf; new_8num->cul_para(); new_8num->leaf_pre=p; if(p==NULL) leaf_start=new_8num; else p->leaf_next=new_8num; p=new_8num; memery_used++; } OK_leaf->get_numbers_to(num); if(move_down(num)&&!existed(num,OK_leaf)) { new_8num=neweight_num; new_8num->set_num(num); new_8num->parent=OK_leaf; new_8num->cul_para(); new_8num->leaf_pre=p; if(p==NULL) leaf_start=new_8num; else p->leaf_next=new_8num; p=new_8num; memery_used++; } OK_leaf->get_numbers_to(num); if(move_left(num)&&!existed(num,OK_leaf)) { new_8num=neweight_num; new_8num->set_num(num); new_8num->parent=OK_leaf; new_8num->cul_para(); new_8num->leaf_pre=p; if(p==NULL) leaf_start=new_8num; else p->leaf_next=new_8num; p=new_8num; memery_used++; } OK_leaf->get_numbers_to(num); if(move_right(num)&&!existed(num,OK
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度生物制藥研發(fā)保密及知識產(chǎn)權轉讓協(xié)議4篇
- 個人借款補充合同:2024年延期還款安排版B版
- 科技前沿探析
- 2025年度智能穿戴設備產(chǎn)品區(qū)域代理銷售協(xié)議4篇
- 重慶文理學院高校介紹
- 2025年度廠房裝修與智能化管理系統(tǒng)合同協(xié)議3篇
- 專業(yè)醫(yī)療器械采購協(xié)議范本版
- 專用消防設備增補協(xié)議規(guī)范文本版A版
- 2025年度城市公共交通車輛運營管理合同3篇
- 2025年度柴油市場分析與預測服務合同范本4篇
- 期末綜合試卷(試題)2024-2025學年人教版數(shù)學五年級上冊(含答案)
- 教案:第三章 公共管理職能(《公共管理學》課程)
- 中國文化概論(第三版)全套課件
- 117-鋼結構工程質量常見問題與管控措施
- SHS5230三星指紋鎖中文說明書
- 諾和關懷俱樂部對外介紹
- 保定市縣級地圖PPT可編輯矢量行政區(qū)劃(河北省)
- 新蘇教版科學六年級下冊全冊教案(含反思)
- 供方注冊指南-ZTE
- 真心英雄合唱歌詞
- 旅游感知形象研究綜述 論文
評論
0/150
提交評論