人工智能 試驗報告_第1頁
人工智能 試驗報告_第2頁
人工智能 試驗報告_第3頁
人工智能 試驗報告_第4頁
人工智能 試驗報告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——人工智能試驗報告

XX科技大學試驗報告

(2023/2023學年第

2學期)

課程名稱:人工智能學生姓名:陳嘉生學生學號:1040501211院系:數理學院專業(yè):信息與計算科學

2023年5月18日

試驗一:知識表示方法

一、試驗目的

狀態(tài)空間表示法是人工智能領域最基本的知識表示方法之一,也是進一步學習狀態(tài)空間探尋策略的基礎,本試驗通過牧師與野人渡河的問題,加強學生對知識表示的了解和應用,為人工智能后續(xù)環(huán)節(jié)的課程奠定基礎。二、問題描述

有n個牧師和n個野人準備渡河,但只有一條能容納c個人的小船,為了防止野人侵擾牧師,要求無論在何處,牧師的人數不得少于野人的人數(除非牧師人數為0),且假定野人與牧師都會劃船,試設計一個算法,確定他們能否渡過河去,若能,則給出小船來回次數最少的最正確方案。三、基本要求

輸入:牧師人數(即野人人數):n;小船一次最多載人量:c。

輸出:若問題無解,則顯示Failed,否則,顯示Successed輸出一組最正確方案。用三元組(X1,X2,X3)表示渡河過程中的狀態(tài)。并用箭頭連接相鄰狀態(tài)以表示遷移過程:初始狀態(tài)->中間狀態(tài)->目標狀態(tài)。

例:當輸入n=2,c=2時,輸出:221->110->211->010->021->000

其中:X1表示起始岸上的牧師人數;X2表示起始岸上的野人人數;X3表示小船現在位置(1表示起始岸,0表示目的岸)。

要求:寫出算法的設計思想和源程序,并以圖形用戶界面實現人機交互,進行輸入和輸出結果,如:

Pleaseinputn:2Pleaseinputc:2SuccessedorFailed?:Successed

OptimalProcedure:221->110->211->010->021->000四、試驗組織運行要求

本試驗采用集中授課形式,每個同學獨立完成上述試驗要求。五、試驗條件

每人一臺計算機獨立完成試驗。六、試驗代碼

Main.cpp

#include#include\usingnamespacestd;

//主函數voidmain(){}

system(\);

RiverCrossingriverCrossing(n,c);riverCrossing.solve();intn,c;

cout>n;

cout>c;

RiverCrossing::ShowInfo();

RiverCrossing.h

#pragmaonce#include//船classBoat{public:};

//河岸狀態(tài)classState{public:

staticintc;intpastor;//牧師intsavage;//野人

Boat(intpastor,intsavage);

staticintn;

intiPastor;//牧師數量intiSavage;//野人數量

};

intiBoatAtSide;//船所在河岸State*pPrevious;//前一個狀態(tài)

State(intpastor,intsavage,intboatAtSide);intgetTotalCount();//獲得此岸總人數boolcheck();//檢查人數是否符合實際boolisSafe();//檢查是否安全

Stateoperator+(BoatStateoperator-(Boatbooloperator==(State

//過河問題

classRiverCrossing{private:};

boolmove(State*nowState,Boat*boat);//進行一次決策

State*findInList(std::list//檢查某狀態(tài)節(jié)voidprint(State*endState);//打印結果staticvoidShowInfo();RiverCrossing(intn,intc);boolsolve();//求解問題

std::listopenList,closeList;StateendState;

點是否在列表中public:

RiverCrossing.cpp

#include\#include#include#includeusingnamespacestd;

//類靜態(tài)變量定義intState::n=0;intBoat::c=0;

/*=========================Methodsforclass\

Boat::Boat(intpastor,intsavage){}

/*=========================Methodsforclass\//構造函數

State::State(intpastor,intsavage,intboatAtSide){}

//獲取此岸總人數

intState::getTotalCount(){}

//檢查人數是否在0到n之間boolState::check(){}

//依照規(guī)則檢查牧師得否安全boolState::isSafe(){}

//重載+符號,表示船開到此岸StateState::operator+(Boatret.pPrevious=this;returnret;

//此岸的安全:x1==0||x1>=x2

//對岸的安全:(n-x1)==0||(n-x1)>=(n-x2)//將上述條件聯立后得到如下條件

return(iPastor==0||iPastor==n||iPastor==iSavage);

return(iPastor>=0returniPastor+iSavage;this->iPastor=pastor;this->iSavage=savage;

this->iBoatAtSide=boatAtSide;this->pPrevious=NULL;this->pastor=pastor;this->savage=savage;

}

//重載-符號,表示船此后岸開走StateState::operator-(Boatwhile(!openList.empty()){

//獲取一個狀態(tài)為當前狀態(tài)

State*nowState=openList.front();openList.pop_front();State::n=n;Boat::c=c;:endState(0,0,0)

coutiPastor==state.iPastor

Stateret(iPastor-boat.pastor,iSavage-boat.savage,iBoatAtSide-1);ret.pPrevious=this;returnret;

}

}

closeList.push_back(nowState);//從當前狀態(tài)開始決策

if(nowState->iBoatAtSide==1){//船在此岸}

//過河的人越多越好,且野人優(yōu)先

intcount=nowState->getTotalCount();count=(Boat::c>=count?count:Boat::c);for(intcapticy=count;capticy>=1;--capticy){}

//把船開回來的人要最少,且牧師優(yōu)先

for(intcapticy=1;capticyiBoatAtSide==0){//船在對岸

print(NULL);returnfalse;

//實施一步決策,將得到的新狀態(tài)添加到列表,返回是否達到目標狀態(tài)boolRiverCrossing::move(State*nowState,Boat*boat){

if(destState->check()){//檢查人數

if(*destState==endState){//是否達到目標狀態(tài)

closeList.push_back(destState);print(destState);

//獲得下一個狀態(tài)State*destState;

if(nowState->iBoatAtSide==1){}

destState=newState(*nowState-*boat);//船離開此岸destState=newState(*nowState+*boat);//船開到此岸}elseif(nowState->iBoatAtSide==0){

}

}

}

returntrue;//找到結果

if(!findInList(openList,*destState)returnfalse;

}elseif(destState->isSafe()){//檢查是否安全

*destState)){//檢查是否在表中

deletedestState;returnfalse;

//檢查給定狀態(tài)是否存在于列表中

State*RiverCrossing::findInList(listwhile(!st.empty()){

State*pState=endState;

stackst;//用棧將鏈表逆序,以便輸出while(pState){}

st.push(pState);

pState=pState->pPrevious;

cout::iteratorite=listToCheck.begin();ite!=listToCheck.end();}

returnNULL;

if(**ite==state)

return*ite;

++ite){

}

}

}

pState=st.top();st.pop();

cout0)

cout#include\usingnamespacestd;

//主函數voidmain(){

NineGrid::ShowInfo();stringstart,end;

cout>start;

cout>end;

{2;}

//解決問題

boolNineGrid::solve(){}

//實施一步決策,將得到的新狀態(tài)添加到列表,返回是否達到目標狀態(tài)boolNineGrid::takeMove(State*nowState,Movemove){

if(*destState==endState){//是否達到目標狀態(tài)

closeList.push_back(destState);//獲得下一個狀態(tài)

State*destState=newState(nowState->takeMove(move));}

print(NULL);returnfalse;

}

//從當前狀態(tài)開始決策

for(inti=0;icheck(move)){}

if(takeMove(nowState,move))

returntrue;

openList.push_back(newState(startState));while(!openList.empty()){

//獲取一個狀態(tài)為當前狀態(tài)

State*nowState=openList.back();openList.pop_back();

closeList.push_back(nowState);

cout

stackst;//用棧將鏈表逆序,以便輸出while(pState){

st.push(pState);

coutmoves::iteratorite=listToCheck.begin();ite!=}

returnNULL;

if(**ite==state)

return*ite;

listToCheck.end();++ite){

取得探尋花費時間

}

}

}

pState=pState->pPrevious;

//3行一起輸出,更直觀一點stringout[3];intcount=0;while(!st.empty()){}

pState=st.top();st.pop();

for(inti=0;igrid,i,j)==SPACE)

out[i]+='';

out[i]+=AT(pState->grid,i,j);else

out[i]+='';

coutvalue>state2->value;

七、試驗結果

試驗三:專家系統

一、試驗目的

專家系統是人工智能的重要研究內容和組成部分之一,本試驗通過設計一個簡單的專家系統,加深學生對專家系統的組成結構和構造原理的理解,并能轉化為具體的應用。

二﹑問題描述

設計一個簡單的專家系統,可根據屬性的輸入值自動識別事物的具體類別,內容自擬。如一個動物專家系統可由以下11個屬性組成,根據屬性的對應值(Y或N),可判斷動物的具體種類,運行結果如下圖所示:

三、試驗組織運行要求

本試驗采用開放授課形式,每個同學獨立完成上述試驗要求。四、試驗條件

每人一臺計算機獨立完成試驗。五、試驗代碼

}

returnfalse;

Disease.txt

[疾病1]病癥A病癥B病癥C病癥D

[疾病2]病癥A病癥B病癥C

[疾病3]病癥A病癥B病癥D病癥E

[疾病4]病癥A病癥C病癥D

[疾病5]病癥B病癥C病癥D病癥E

[疾病6]病癥A病癥B

[疾病7]病癥A病癥C病癥E

[疾病8]病癥A病癥D

[疾病9]病癥B病癥C病癥E

[疾病10]病癥B病癥D

[疾病11]病癥C病癥D病癥E

六、試驗結果

Main.cpp

#include\#includeusingnamespacestd;

voidmain(){}

Expert::ShowInfo();Expertexpert;

if(expert.initDiseaseList()){}

system(\);

expert.diagnosis();cout#includeusingnamespacestd;

//疾病信息定義typedefstruct{

//疾病診斷專家系統classExpert{

protected:

stringname;

vectorsymptomList;

}Disease;

vectorm_DiseaseList;//疾病列表boolreadFile();//讀取文件

booloptionSelect(conststring//提醒用戶選擇staticvoidShowInfo();//顯示信息boolinitDiseaseList();//初始化疾病列表

Disease*addDisease(conststring//添加疾病

voidaddSymptom(Disease*disease,conststring//添加疾病的病癥voiddiagnosis();//診斷

public:

};

Expert.cpp

#include\#include#include#includeusingnamespacestd;

//顯示信息

voidExpert::ShowInfo(){}

//初始化疾病列表,返回是否初始化成功boolExpert::initDiseaseList(){}

//讀取Disease.txt文件,獲取疾病信息boolExpert::readFile(){

cout>strInput;

cout>symptomInput;//用戶輸入的第一個病癥stringsymptomInput;//用戶有的病癥和沒有的病癥

vectorsymptomHave,symptomNotHave;//探尋的結果列表

vectorfindList;

disease->symptomList.push_back(symptom);Diseasedisease;=name;

m_DiseaseList.push_back(disease);return

for(vector::iteratorite=findList.begin();ite!=

boolremove=false;//是否從findList列表中排除本疾病

for(unsignedintj=0;jsymptomList.size();++j){

Disease*pDisease=*ite;

if(find(symptomNotHave.begin(),symptomNotHave.end(),

//在symptomNotHave列表中找到此病癥,直接排除remove=true;break;

findList.end();){

if(symptomInput==\不確定\){}

//添加所有疾病到findList列表中

for(unsigned

溫馨提示

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

最新文檔

評論

0/150

提交評論