第一篇:人工智能課程設計報告-n皇后問題解讀
人工智能課程設計報告
課 程:人工智能課程設計報告
班 級: 姓 名: 學 號: 指導教師:趙曼
2015年11月
人工智能課程設計報告
人工智能課程設計報告
課程背景
人工智能(Artificial Intelligence),英文縮寫為AI。它是研究、開發(fā)用于模擬、延伸和擴展人的智能的理論、方法、技術及應用系統(tǒng)的一門新的技術科學。人工智能是計算機科學的一個分支,它企圖了解智能的實質(zhì),并生產(chǎn)出一種新的能以人類智能相似的方式做出反應的智能機器,該領域的研究包括機器人、語言識別、圖像識別、自然語言處理和專家系統(tǒng)等。人工智能從誕生以來,理論和技術日益成熟,應用領域也不斷擴大,可以設想,未來人工智能帶來的科技產(chǎn)品,將會是人類智慧的“容器”。
人工智能是對人的意識、思維的信息過程的模擬。人工智能不是人的智能,但能像人那樣思考、也可能超過人的智能。
人工智能是一門極富挑戰(zhàn)性的科學,從事這項工作的人必須懂得計算機知識,心理學和哲學。人工智能是包括十分廣泛的科學,它由不同的領域組成,如機器學習,計算機視覺等等,總的說來,人工智能研究的一個主要目標是使機器能夠勝任一些通常需要人類智能才能完成的復雜工作。但不同的時代、不同的人對這種“復雜工作”的理解是不同的。
人工智能是計算機學科的一個分支,二十世紀七十年代以來被稱為世界三大尖端技術之一(空間技術、能源技術、人工智能)。也被認為是二十一世紀三大尖端技術(基因工程、納米科學、人工智能)之一。這是因為近三十年來它獲得了迅速的發(fā)展,在很多學科領域都獲得了廣泛應用,并取得了豐碩的成果,人工智能已逐步成為一個獨立的分支,無論在理論和實踐上都已自成一個系統(tǒng)。
人工智能是研究使計算機來模擬人的某些思維過程和智能行為(如學習、推理、思考、規(guī)劃等)的學科,主要包括計算機實現(xiàn)智能的原理、制造類似于人腦智能的計算機,使計算機能實現(xiàn)更高層次的應用。人工智能將涉及到計算機科學、心理學、哲學和語言學等學科。可以說幾乎是自然科學和社會科學的所有學科,其范圍已遠遠超出了計算機科學的范疇,人工智能與思維科學的關系是實踐和理論的關系,人工智能是處于思維科學的技術應用層次,是它的一個應用分支。從思維觀點看,人工智能不僅限于邏輯思維,要考慮形象思維、靈感思維才能促進人工智能的突破性的發(fā)展,數(shù)學常被認為是多種學科的基礎科學,數(shù)學也進入語言、思維領域,人工智能學科也必須借用數(shù)學工具,數(shù)學不僅在標準邏輯、模糊數(shù)學等范圍發(fā)揮作用,數(shù)學進入人工智能學科,它們將互相促進而更快地發(fā)展。
人工智能課程設計報告
a[] a[i]=0表示第i行上還沒有皇后;
b[] b[i]=0表示第i列反斜線/上沒有皇后; c[] c[i]=0表示第i列正斜線上沒有皇后。
棋盤中同一反斜線/上的方格的行號與列號相同;同一正斜線上的方格的行號與列號之差均相同,這就是判斷斜線的依據(jù)。
初始時,所有行和斜線上都沒有皇后,從第1列的第1行配置第一個皇后開始,在第m列,col[m]行放置了一個合理的皇后,準備考察第m+1列時,在數(shù)組a[],b[]和c[]中為第m列,col[m]行的位置設定有皇后的標志;當從第m列回溯到m-1列時,并準備調(diào)整第m-1列的皇后配置時,清除在數(shù)組a[],b[]和c[]對應位置的值都為1來確定。
2)遺傳算法
遺傳算法的基本運算過程如下:
a)初始化:設置進化代數(shù)計數(shù)器t=0,設置最大進化代數(shù)T,隨機生成M個個體作為初始群體P(0)。b)個體評價:計算群體P(t)中各個個體的適應度。遺傳算法 遺傳算法
c)選擇運算:將選擇算子作用于群體。選擇的目的是把優(yōu)化的個體直接遺傳到下一代或通過配對交叉產(chǎn)生新的個體再遺傳到下一代。選擇操作是建立在群體中個體的適應度評估基礎上的。d)交叉運算:將交叉算子作用于群體。遺傳算法中起核心作用的就是交叉算子。
e)變異運算:將變異算子作用于群體。即是對群體中的個體串的某些基因座上的基因值作變動。群體P(t)經(jīng)過選擇、交叉、變異運算之后得到下一代群體P(t+1)。
f)終止條件判斷:若t=T,則以進化過程中所得到的具有最大適應度個體作為最優(yōu)解輸出,終止計算。
3)csp最小沖突法
(1)初始化N個皇后的一個放置,允許有沖突
(2)考慮某一行的某個皇后,她可能與x個皇后沖突,然后看看將這個皇后移動到這一行的哪個空位能使得與其沖突的皇后個數(shù)最少,就移動到那里。(也可以考慮列,是等價的)(3)不斷執(zhí)行(2),直到?jīng)]有沖突為止
2.數(shù)據(jù)結構
使用數(shù)組結構存儲相關數(shù)據(jù) 一維數(shù)組:
t + n] == 1||rd[i + t] == 1)continue;
//沒有沖突 ver[i] = 1;ru[i
人工智能課程設計報告
}
} //后退處理 rd[i + t] = 0;ru[i1;i++){
}
cout << endl;*/ cout << “row:” << i << “ col:” << this->ChromosomeMatrix[i][0] << endl;g = 1;if(DisplayAllAnsures)this->FillArea(k);this->CostMatrix[k] = this->CostFunc(k);bool DisplayAllAnsures=PrintChessBoard;//是否輸出所有棋盤結果 int g = 0, num = 0;
//逐個檢查第row行的每個位置,看看是否存在沖突數(shù)更小的位置 for(int i = 0;i < N;i++){
} if(i == cur_col)continue;
int conflict = col[i] + pdiag[GetP(row, i)] + cdiag[GetC(row, i)];if(conflict < min_conflict){
} min_conflict = conflict;optimal_col = i;+ cdiag[GetC(row, optimal_col)]
人工智能課程設計報告
}
} col[optimal_col]++;pdiag[GetP(row, optimal_col)]++;cdiag[GetC(row, optimal_col)]++;R[row] = optimal_col;if(col[cur_col] == 1 && col[optimal_col] == 1
} && pdiag[GetP(row, optimal_col)] == 1 && cdiag[GetC(row, optimal_col)] == 1){ return Qualify();//qualify相對更耗時,所以只在滿足上面基本條件后才檢查
//否則當前點就是最佳點,一切都保持不變
return false;//如果都沒變的話,肯定不滿足終止條件,否則上一次就應該返回true并終止了
//檢查沖突
bool CSP_Queens::Qualify(){
} //最終用戶調(diào)用函數(shù),numOfQueens為輸入皇后數(shù),PrintChessBoard判斷是否輸出棋盤表示 int CSP_Queens::CSPAlgorithms(bool PrintChessBord){
srand((unsigned)time(NULL));Init();if(Qualify()){//運氣很好,初始化后就滿足終止條件
} bool end = false;while(!end){
for(int i = 0;i < N;i++){ if(Adjust_row(i)){ end = true;if(PrintChessBord)Print_result();return 0;for(int i = 0;i < N;i++){
} return true;if(col[R[i]]!= 1 ||
} pdiag[GetP(i, R[i])]!= 1 || cdiag[GetC(i, R[i])]!= 1){ return false;
人工智能課程設計報告
2.遺傳算法
3.CSP最小沖突算法
人工智能課程設計報告
總的來說,回溯在n值很小時,效率很高,但其求解范圍很小,超過35基本就解不出來,遺傳算法求解范圍適中。在n值很大(>100)時,前兩者都不能再解決,此時,CSP最小沖突法的效率最高,且與n值沒有必然的聯(lián)系。
總結
通過此次課程實習不僅大大加深了我對幾種經(jīng)典搜索算法的理解,而且?guī)椭液芎玫膹土暳岁犃?、堆棧、圖、文件讀寫這幾部分的內(nèi)容,使我對幾種基本的數(shù)據(jù)結構類型的運用更加熟練。在解決這些問題的過程中我不但很好的鞏固了數(shù)據(jù)結構的相關知識,而且提高了編程及程序調(diào)試能力,增強了自己編程的信心。
總之,在這次課程實習過程中我是實實在在學到了一些課堂上學不到的東西,同時也提高了實踐能力。同時在這個過程中也暴露了自己的不少問題,在今后的學習過程成也會更加有針對性。最后還要感謝老師的悉心指導,解答我編程過程中的疑問、指出我程序中的不足,及提出可行的解決方法,讓我的程序的功能更加完善。
CSP算法源代碼:
//CSPAlgorithms.h #pragma once
class CSP_Queens { public: //構造函數(shù),numOfQueens為輸入皇后數(shù),CSP_Queens(int numOfQueens);~CSP_Queens();
private:
//row[i]表示當前擺放方式下第i行的皇后數(shù),int *row;//col[i]表示當前擺放方式下第i列的皇后沖突數(shù) int *col;int N;//放置N個皇后在N*N棋盤上
//從左上到右下的對角線上row-col值是相同的,但是這個值有可能是負值,最小為
12],2*N-1條,作為對角線編號
//R[]用來存儲皇后放置位置,R[row] = col表示(row,col)處,即“第row行第col列”//cdiag[i]表示編號為i的對角線上的皇后數(shù) int *cdiag;//counter diagonal,副對角線
有個皇后
int *R;
public:
int swap(int &a, int &b);
//給定二維矩陣的一個點坐標,返回其對應的左上到右下的對角線編號 int GetP(int row, int col);//給定二維矩陣的一個點坐標,返回其對應的右上到左下的對角線編號 int GetC(int row, int col);//返回begin, begin + 1,..., endbegin個數(shù)中的隨機的一個 int My_rand(int begin, int end);//左閉右開[begin, end)
人工智能課程設計報告
N = numOfQueens;row = new int[N];col = new int[N];pdiag=new int[2 * N];cdiag=new int[2 * N];R=new int[N];}
CSP_Queens::~CSP_Queens(){ if(NULL!= row)delete[]row;if(NULL!= col)delete[]col;if(NULL!= pdiag)delete[]pdiag;if(NULL!= cdiag)delete[]cdiag;if(NULL!= R)delete[]R;} int CSP_Queens::swap(int &a, int &b){ int t = a;a = b;b = t;return 0;} //
int CSP_Queens::GetP(int row, int col){ return row1;}
int CSP_Queens::GetC(int row, int col){ return row + col;} //返回begin, begin + 1,..., endbegin個數(shù)中的隨機的一個 int CSP_Queens::My_rand(int begin, int end)//左閉右開[begin, end){ return rand()%(end
人工智能課程設計報告
{
} for(int i = begin;i <= end1;i++){ pdiag[i] = 0;cdiag[i] = 0;} //初始化當前棋局的皇后所在位置的各個沖突數(shù) for(int i = 0;i < N;i++){ col[R[i]]++;pdiag[GetP(i, R[i])]++;cdiag[GetC(i, R[i])]++;} //用最小沖突算法調(diào)整第row行的皇后的位置(初始化時每行都有一個皇后,調(diào)整后仍然在第
+ cdiag[GetC(row, optimal_col)]
人工智能課程設計報告
} } //當前點就是最佳點,一切都保持不變
return false;//如果都沒變的話,肯定不滿足終止條件,否則上一次就應該返回true并終止了 }
//檢查沖突
bool CSP_Queens::Qualify(){ for(int i = 0;i < N;i++){
if(col[R[i]]!= 1 ||
pdiag[GetP(i, R[i])]!= 1 ||
cdiag[GetC(i, R[i])]!= 1){
return false;
} } return true;} void CSP_Queens::Print_result(){
} cout << “-------結果為:” << endl;cout << endl;for(int j = 0;j < N;j++){ for(int k = 0;k < N;k++){
if(R[j] == k)
cout << “Q”;
else
cout << “+”;
cout << “ ”;} cout << endl;} //最終用戶調(diào)用函數(shù),numOfQueens為輸入皇后數(shù),PrintChessBoard判斷是否輸出棋盤表
人工智能課程設計報告
int N;cin >> N;int time1 = clock();CSP_Queens myQueens(N);myQueens.CSPAlgorithms(end);int time2 = clock();cout << “---” << N << “皇后問題耗時:” << time2
讀書的好處
1、行萬里路,讀萬卷書。
2、書山有路勤為徑,學海無涯苦作舟。
3、讀書破萬卷,下筆如有神。
4、我所學到的任何有價值的知識都是由自學中得來的?!_爾文
5、少壯不努力,老大徒悲傷。
6、黑發(fā)不知勤學早,白首方悔讀書遲。——顏真卿
7、寶劍鋒從磨礪出,梅花香自苦寒來。
8、讀書要三到:心到、眼到、口到
9、玉不琢、不成器,人不學、不知義。
10、一日無書,百事荒廢。——陳壽
11、書是人類進步的階梯。
12、一日不讀口生,一日不寫手生。
13、我撲在書上,就像饑餓的人撲在面包上。——高爾基
14、書到用時方恨少、事非經(jīng)過不知難。——陸游
15、讀一本好書,就如同和一個高尚的人在交談——歌德
16、讀一切好書,就是和許多高尚的人談話。——笛卡兒
17、學習永遠不晚?!郀柣?/p>
18、少而好學,如日出之陽;壯而好學,如日中之光;志而好學,如炳燭之光。——劉向
19、學而不思則惘,思而不學則殆?!鬃?/p>
20、讀書給人以快樂、給人以光彩、給人以才干?!喔?/p>
第二篇:人工智能課程設計(五子棋)解讀
《人工智能導論》課程報告
課題名稱: 五子棋
姓名: X X 學號:114304xxxx 課題負責人名(學號): X X114304xxxx 同組成員名單(學號、角色): x x1143041325 XXX1143041036
指導教師: 張建州 評閱成績: 評閱意見:
提交報告時間:2014年 1 月 9 日 課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
五子棋
計算機科學與技術 專業(yè) 學生 XXX 指導老師
張建州
[摘要] 人類之所以不斷在進步,是因為我們?nèi)祟愐恢辈粩嗟脑谒伎迹遄悠逵螒虺绦虻拈_發(fā)符合人類進步也是促進人類進步的一大動力之一。五子棋游戲程序讓人們方便快捷的可以下五子棋,讓人們在何時都能通過下棋來提高邏輯思維能力,同時也培養(yǎng)兒童的興趣以及愛好,讓孩子更加聰明。
同時,五子棋游戲程序的開發(fā)也使得五子棋這個游戲得到了廣泛的推廣,讓世界各地的人們知道五子棋,玩上五子棋,這已經(jīng)不是局限。五子棋游戲程序使得越來越多的人喜歡上了五子棋,熱愛下五子棋,它是具有很好的帶動性的。
關鍵詞:五子棋
進步
思考
-1-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
目錄
《人工智能導論》課程報告..................................................................................0 1 引言.....................................................................................................................3
1.1 五子棋簡介...........................................................................................3 1.2 五子棋游戲的發(fā)展與現(xiàn)狀......................................................................3 2 研究問題描述......................................................................................................4
2.1 問題定義...................................................................................................4 2.2 可行性研究...............................................................................................4 2.3 需求分析...................................................................................................5 2.4 總體設計...................................................................................................5 2.5 詳細設計...................................................................................................6 2.6編碼和單元測試........................................................................................6 3 人工智能技術......................................................................................................6 4 算法設計.............................................................................................................7
4.1α-β剪枝算法.............................................................................................7 4.2極大極小樹................................................................................................7 4.3深度優(yōu)先搜索(DFS).............................................................................8 4.4靜態(tài)估值函數(shù)............................................................................................9 5 軟件設計和實現(xiàn)..................................................................................................9
5.1 數(shù)據(jù)結構定義...........................................................................................9 5.2 程序流程圖.............................................................................................17 6 性能測試...........................................................................................................18
6.1 程序執(zhí)行結果.........................................................................................18 7 總結...................................................................................................................21 參考文獻...............................................................................................................21
-2-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 1 引言
1.1 五子棋簡介
五子棋是一種兩人對弈的純策略型漢族棋類益智游戲,棋具與圍棋通用,由中國漢族人發(fā)明,起源于中國上古時代的傳統(tǒng)黑白棋種之一。主要流行于華人和漢字文化圈的國家以及歐美一些地區(qū)。
容易上手,老少皆宜,而且趣味橫生,引人入勝;不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。已在各個游戲平臺有應用。
古代五子棋棋盤與圍棋棋盤是通用的,漢魏時為十七路(17×17)棋盤,至南北朝時即已流行十九路(19×19)棋盤,直至1931年出現(xiàn)所謂五子棋專用棋盤。
1.2 五子棋游戲的發(fā)展與現(xiàn)狀
目前,連珠這一棋類運動已迅速在國際上發(fā)展起來。外國人都十分看好這一不起眼的智力游戲,并認為五子棋不僅能提高思維、開發(fā)智力、手腦并用、修身養(yǎng)性 而且富含哲理,具有東方的神秘和西方的直觀,是中西文化的交匯點。許多國家的人對五子棋都有不同的愛稱,例如韓國人把五子棋稱之為“情侶棋”,言下之意是情人之間下五子棋有利于增加情感的交流;歐洲人稱之為“中老年棋”,表示五子棋適合中老年人的生理特點和思維方式;美洲人喜歡將五子棋稱之為“商業(yè)棋”,就是說商人談生意時可一邊下棋一邊談生意,棋下完了生意也談成了。由此可見,盡管國度不同,語言各異,但人們都可以借助五子棋這一簡單而又深奧的棋藝進行交流、比賽,增進友誼。
當前,有40多個國家和地區(qū)都在下五子棋,并有各種規(guī)模和級別的比賽。1989年8月在日本京都、1991年8月在俄羅斯聯(lián)邦的莫斯科、1993年8月在瑞典、1995年8月在愛沙尼亞的塔林分別舉行了第一、二、三、四屆世界錦標賽。除第三屆的冠軍是愛沙尼亞人之外,其余三屆的冠軍都是日本人。五子棋 的世界錦標賽,每兩年舉辦一次,其申國競爭也十分激烈。日本目前擁有自己的五子棋職業(yè)棋手,并且對連珠(五子棋)技術的研究也相當普遍和全面,就水平也正在日益增強。同時,五子棋的理論研究與探索也呈現(xiàn)蓬勃發(fā)展的勢頭,從1858年第一部五子棋專著問世以來,目前,全世界有2000多種五子棋的書籍及期刊,分別以日文、俄文、英文、瑞典文及中文出版發(fā)行。五子棋在我國的北京、上海、天津、云南、浙江、廣東、四川、湖北、遼寧、新疆、河北等?。▍^(qū))市都有很大的發(fā)展。北京多次舉辦了北京地區(qū)的五子棋賽,如“思曼杯”、“京空杯”、“奇奇童杯”、“北京第六屆民族團結杯”和“北京第四豈民族運動會”的五子棋比賽。上海地區(qū)舉辦了“上文杯”五子棋大賽。云南省以及其他省市亦舉辦過許多五子棋比賽。所有這些賽事都越來越多地吸引了無數(shù)人的關注,表明了根植于中國的五子棋有著廣泛的群眾基礎,-3-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 是群眾喜聞樂見的體育活動。
而現(xiàn)在,很多很多游戲平臺上面都有五子棋游戲供我們玩,任何游戲平臺上面只要有棋牌類游戲的,那么它就有五子棋在里面,網(wǎng)絡五子棋比賽,在聯(lián)眾,263,QQ游戲,UC里進行了10幾年了可見,五子棋游戲在網(wǎng)絡上面是非?;鸨┑?,而且在棋牌游戲里面玩家人數(shù)排名總會占到很前面,不愧是風靡全球的棋牌游戲啊!在未來中,將會有越來越多的人關注五子棋,喜歡五子棋,那么將其變?yōu)樯虡I(yè)化也會越來越多,而且還可以以教育孩子的方式來將其嵌套進去,或者用來做測試等等,可以說以后的五子棋游戲會是那么的精彩,那么的讓人憧憬。那么對于它的游戲開發(fā)和發(fā)展也將會上升到舉足輕重的地位去,它的發(fā)展會是相當之快的,就讓我們拭目以待吧。研究問題描述
2.1 問題定義
問題定義的一個的關鍵問題是“要解決的問題是什么”,這個是這個階段必須要明確要回答的問題。在沒將問題定義好,試圖準備下個階段的任務。這明顯是不成熟,甚至不可能的事。
本次系統(tǒng)設計中首先明確了需要解決的問題是五子棋AI算法,基本的要求是設計一款能夠實現(xiàn)人機對戰(zhàn)、人人對戰(zhàn)和禁手的五子棋游戲,提供一些基本的操作如退出系統(tǒng),向后悔棋等操作,重點是放在AI算法的研究。而并不是美工設計,也不是為了提供各種操作豐富的接口。主要是通過這種可視化的界面探討AI,當然增加可玩性和美工會給系統(tǒng)潤色不少。
上面只是很粗略的明確大概的方向,嚴格按照軟件工程的方法這個階段需要生產(chǎn)一份書面報告。需要通過對系統(tǒng)的實際用戶訪問調(diào)查,扼要地寫出他對問題的理解,并在用戶和使用部門負責人的會議上認真討論這份書面報告,澄清含糊不精的地方,改正理解不正確的地方,最后得出一份雙方都滿意的文檔。本系統(tǒng)的需求很少也很明顯了。
2.2 可行性研究
這個階段要回答的關鍵問題:“對于上一個階段所確定的問題是否可行?”為了回答這個問題,我們需要進行一次大大壓縮和簡化了的系統(tǒng)分析和設計的過程,也就是在較抽象的高層次上進行的分析和設計的過程。
可行性研究應該比較簡短,這個階段的任務不是具體解決問題,而是研究問題的范圍,探索這個問題是否值得去解,是否有可行的解決辦法。
可行性研究應該比較簡短,這個階段的任務不是具體解決問題,而是研究問題的范圍,探索這個問題是否值得去解,是否有可行的解決辦法??尚行匝?/p>
-4-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 究以后的那些階段將需要投入要多的人力物力。及時中止不值得投資的工程項目,可以避免更大的浪費。
根據(jù)這些基本的概念,我在技術上主要是通過相關文檔資料的查找后確定可行性,憑著大學期間打下厚實的專業(yè)科基礎,特別是數(shù)據(jù)結構和算法,能夠在這段時間理解通透并應該有所改進,后來證明是對的。利用剩下時間也應該來說也比較充裕的。經(jīng)濟上暫不考慮。
下面主要從技術上進行分析:
工具: Java是一種可以撰寫跨平臺應用軟件的面向對象的程序設計語言,是由Sun Microsystems公司于1995年5月推出的Java程序設計語言和Java平臺(即JavaSE, JavaEE, JavaME)的總稱。Java 技術具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于個人PC、數(shù)據(jù)中心、游戲控制臺、科學超級計算機、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。在全球云計算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢和廣闊前景。所以用java來編寫是一個很好的選擇。
算法:在這圖論搜索技術這方面,前人已有很成熟的算法。如粗糙的有深度優(yōu)先算法(DFS)和廣度優(yōu)先算法(BFS)這兩個基本的算法,關鍵需要解決的是能夠設計出一種高效的剪枝函數(shù),減小搜索問題的規(guī)模。目前博弈類游戲中的人工智能基本都采用極大極小值方法這對我來說是個挑戰(zhàn),而剪枝的則采用Alpha-Beta,通過豐富的文檔資料初步了解到這些技術已經(jīng)很成熟了。我們有信心能解決好這個問題。
2.3 需求分析
人工智能的第一大成就是下棋程序,在下棋程度中應用的某些技術,如向前看幾步,把困難的問題分解成一些較容易的子問題,發(fā)展成為搜索和問題歸納這樣的人工智能基本技術。今天的計算機程序已能夠達到下各種方盤棋和國際象棋的錦標賽水平。但是,尚未解決包括人類棋手具有的但尚不能明確表達的能力。如國際象棋大師們洞察棋局的能力。另一個問題是涉及問題的原概念,在人工智能中叫做問題表示的選擇,人們常能找到某種思考問題的方法,從而使求解變易而解決該問題。到目前為止,人工智能程序已能知道如何考慮它們要解決的問題,即搜索解答空間,尋找較優(yōu)解答。
在設計本系統(tǒng)時考慮到用戶需要的是一個操作簡便界面簡單的游戲軟件,同時要提供人機和人人這樣的功能,特別是人機部分,要考慮到不同級別的用戶,電腦智能不能太低需要有一定的智能下棋功能等等。所以采用α-β剪枝法算法時就是為了達到這些目標。
2.4 總體設計
這個階段必須回答的關鍵問題是:“概括地說,應該如何解決這個問題?”
-5-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 首先,應該考慮幾種可能的解決方案。如,目標系統(tǒng)的一些主要功能是用計算機自動完成還是用人工完成;如果使用計算機,那么是使用批處理方式還是人機交互方式;信息存儲使用傳統(tǒng)的文件系統(tǒng)還是數(shù)據(jù)庫??。通常至少應該考慮下述幾類可能的方案:
低成本的解決方案。系統(tǒng)只能完成最必要的工作,不能多做一點額處的工作。本系統(tǒng)的最基本要求就是能夠實現(xiàn)必要的操作,其他額外的一些工作在后面完成
中等成本的解決方案。這樣的系統(tǒng)不僅能夠很好地完成預定的任務,使用起來很方便,而且可能還具有用戶沒有具體指定的某些功能和特點。雖然用戶沒有提出這些具體要求,但是系統(tǒng)分析員根據(jù)自己的知識和經(jīng)驗斷定,這些附加的能力在實踐中將證明是很有價值的。
這個成本方案在完成上面的低成本方案后添加的。如增加保存棋局,美化界面,實現(xiàn)觀看電腦與電腦之間的對戰(zhàn)等功能。
高成本的“十全十美”的系統(tǒng)。這樣的系統(tǒng)具有用戶可能希望有的所有功能和特點。
結構設計的一條基本原理就是程序應該模塊化,也就是一個大程序應該由許多規(guī)模適中的模塊按合理的層次結構組織而成??傮w設計階段的第二項主要任務就是設計軟件的結構,也就是確定程序由哪些模塊組成以及模塊間的關系。通常用層次圖或結構圖描繪軟件的結構。
2.5 詳細設計
總體設計階段以比較抽象概括的方式提出了解決問題的辦法。詳細設計階段的任務就是把解法具體化,也就是回答下面這個關鍵問題:“應該怎樣具體地實現(xiàn)這個系統(tǒng)呢?”
這個階段的任務還不是編寫程序,而是設計出程序的詳細規(guī)格說明。這種規(guī)格說明的作用很類似于其他工程領域中工程師經(jīng)常使用的工程藍圖,它們應該包含必要的細節(jié),程序員可以根據(jù)它們寫出實際的程序代碼。
2.6編碼和單元測試
這個階段的關鍵任務是根據(jù)以上階段分析的軟件模型,編寫各個功能模塊。
要注意的是程序的擴張性和可讀性。以便以后軟件的升級修改。同時要仔細的測試每個功能編寫好的功能模塊。人工智能技術
人工智能也就是所謂的AI(Artificial Intelligence),它是一門很抽象的技術,-6-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 AI程序的編寫不需要依據(jù)任何既定的思考模式或者規(guī)則。尤其是游戲中的AI可以完全依程序設計者本身的思考邏輯制作。我個人認為人工智能的核心應該是使計算機具有自動的處理事件的能力,而我們的所有的研究也應該圍繞著這一方向。我們今天討論的是策略類的人工智能。
策略類人工智能可以說是AI中比較復雜的一種,最常見的策略類AI游戲就是棋盤式游戲。在這類游戲中,通常的策略類AI程序都是使計算機判斷目前狀況下所有可走的棋與可能的獲勝狀況,并計算當前計算機可走棋步的獲勝分數(shù)或者玩家可走棋步的獲勝分數(shù),然后再決定出一個最佳走法。本課程設計是基于AI中α-β剪枝算法的五子棋的博弈游戲,下面讓我們來具體介紹一下相關的內(nèi)容。算法設計
4.1α-β剪枝算法
我們的程序主要是用α-β剪枝法實現(xiàn)的。其基本思想或算法是,邊生成博弈樹邊計算評估各節(jié)點的倒推值,并且根據(jù)評估出的倒推值范圍,及時停止擴展那些已無必要再擴展的子節(jié)點,即相當于剪去了博弈樹上的一些分枝,從而節(jié)約了機器開銷,提高了搜索效率。具體的剪枝方法如下:
(1)對于一個與節(jié)點MIN,若能估計出其倒推值的上確界β,并且這個β值不大于 MIN的父節(jié)點(一定是或節(jié)點)的估計倒推值的下確界α,即α≥β,則就不必再擴展該 MIN節(jié)點的其余子節(jié)點了(因為這些節(jié)點的估值對MIN父節(jié)點的倒推值已無任何影響 了)。這一過程稱為α剪枝。
(2)對于一個或節(jié)點MAX,若能估計出其倒推值的下確界α,并且這個α值不小于 MAX的父節(jié)點(一定是與節(jié)點)的估計倒推值的上確界β,即α≥β,則就不必再擴展該MAX節(jié)點的其余子節(jié)點了(因為這些節(jié)點的估值對MAX父節(jié)點的倒推值已無任何影響 了)。這一過程稱為β剪枝。
4.2極大極小樹
目前絕大部分的博弈類游戲中的人工算法都采用這種方法。假設己方為MAX點,對方則為MIN點。如果當層的節(jié)點為奇數(shù)時那么就為MAX層,同樣為偶數(shù)時就為MIN層。當在MAX層時,該層的值就應該為下一個MIN層中的最大一個的值。當在MIN層是,該層的值就應該為它子層MAX的最小的一個。通俗的說就是當輪到我方時,我們就應該選擇一個最有利于我們的點,預測對方可能下的最有利他方的點(相對我方來說就是最壞的點)。這樣反復計算下去就能夠得到根節(jié)點的最大值,這個點也就是我們最佳下棋點。在計算這個點時可以很明顯的看出這是一個不斷遞歸的過程,到達葉子節(jié)點時根據(jù)相關
-7-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 的計算規(guī)則算出該值然后向上一層不斷的返回。下圖中矩形代表極大層,橢圓代表極小層。
4.3深度優(yōu)先搜索(DFS)
在圖論中有兩個很重要的遍歷的方法,一個是深度優(yōu)先搜索(DFS),另外一個是廣度優(yōu)先搜索(BFS).這兩個方法的主要區(qū)別在于下一個節(jié)點的選擇。DFS首先選擇它的連接節(jié)點,若它的下個節(jié)點已經(jīng)全部被遍歷過或者不存在的話。則向上返回到上一個節(jié)點,在遍歷其他的未被訪問過的點。很容易想到這要用到堆棧結構,使用一個遞歸來實現(xiàn)。而BFS則是逐個的遍歷它的聯(lián)接接點,將已經(jīng)訪問過的點放入隊列中。然后再依次取出繼續(xù)這個過程。
DFS遍歷過程如下:
首先從A點出發(fā)訪問它的領接點B,因為B的領接點C,F均未被訪問過,所以B點選擇C(當然也可以選擇F點)作為下一個要訪問的點,C點的領接點是D,F選擇下個節(jié)點D,而D的鄰接點只有一個E且未被訪問過,就將E作為了它下個節(jié)點。這時因為E已經(jīng)沒有可訪問的鄰點,所以向上一層返回到D,發(fā)現(xiàn)D也已經(jīng)沒有可訪問的點了,繼續(xù)向上層返回到C,由于C的鄰節(jié)點F未被訪問過,那么就訪問F。所以整個過程的遍歷結果為:
-8-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 A?B?E?C?F?D。
BFS的遍歷過程為A?B?E?C?F?D。
4.4靜態(tài)估值函數(shù)
當極大極小樹到達葉子節(jié)點時,需要估算一下當前盤面的值。這個就根據(jù)某個計算規(guī)則計算也即是估值函數(shù)。因為這個值是已經(jīng)確定的所以稱為靜態(tài)。
當只有一個點時,并且相鄰的無對方的棋子或者不是邊界等“阻礙物” 就給他50,否則給予10。
當兩個點時,并且相鄰的無對方的棋子或者不是邊界等“阻礙物”給予1000,若存在一方有“阻礙物”則給以100,否則給予10。
當是活三的時候給予3600,當存在一邊被堵時,就給予500。否則給予10。當是活四的時候給以500000,當一邊被堵時,給予50000。否則給予10 當是五連子的時候就給予最高分1000000。最后判斷是否是己方的,若不是則給予負號。
靜態(tài)估值函數(shù)會很嚴重的影響到算法的智能,所以可根據(jù)在下棋的過程中不斷的做出調(diào)整,使其更加的合理。根據(jù)一些測試,這組靜態(tài)估值函數(shù)能夠很好的反映棋盤重要性指標。軟件設計和實現(xiàn)
5.1 數(shù)據(jù)結構定義
本程序定義15*15的五子棋棋盤,實現(xiàn)算法,在算法中采用的數(shù)據(jù)結構包括:int isChessOn[][]描述當前棋盤,0表示黑子,1表示白字,2表示無子;int pre[][]用來記錄棋點的x,y坐標。
由于本課程設計是基于Java語言開發(fā)的,在Java中只能用類來表示并實現(xiàn)所定義的數(shù)據(jù)結構。所以下面將用類來描述相應的數(shù)據(jù)結構及算法:
public class ChessPanel extends JPanel{ private ImageIcon map;
//棋盤背景位圖
private ImageIcon blackchess;
//黑子位圖
private ImageIcon whitechess;
//白子位圖
public int isChessOn [][];
//棋局
protected boolean win = false;
// 是否已經(jīng)分出勝負
protected int win_bw;
// 勝利棋色
protected int deep = 3, weight = 7;
// 搜索的深度以及廣度
public int drawn_num = 110;
// 和棋步數(shù)
int chess_num = 0;
// 總落子數(shù)目
-9-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
public int[][] pre = new int[drawn_num + 1][2];
// 記錄下棋點的x,y坐標
最多(drawn_num + 1)個
public int sbw = 0;
//玩家棋色黑色0,白色1
public int bw = 0;
// 當前應該下的棋色
0:黑色(默認),1:白色
// 邊界值,用于速度優(yōu)化
protected int x_max = 15, x_min = 0;
protected int y_max = 15, y_min = 0;
protected boolean able_flag = true;
// 是否選擇禁手標志 0:無禁手
1:有禁手(默認
private int h;
//棋子長
private int w;
//棋子寬
private int insx;
//插入棋子的位置
private int insy;
private Point mousePoint;
//鼠標當前位置
private int winer;
//獲勝方
private boolean humanhuman=false;
//是否是人人對弈
private int plast=0;
//走了幾步了,public int BLACK_ONE;
//0表黑子
public int WHITE_ONE;
//1表白子
public int NONE_ONE;
//2表無子
public int N;
//棋盤邊長
//---------搜索當前搜索狀態(tài)極大值-//
//alpha 祖先節(jié)點得到的當前最小最大值,用于alpha 剪枝
//beta 祖先節(jié)點得到的當前最大最小值,用于beta 剪枝。
//step 還要搜索的步數(shù)
//return 當前搜索子樹極大值
protected int findMax(int alpha, int beta, int step){
int max = alpha;
if(step == 0){
return evaluate();
}
int[][] rt = getBests(1sbw)== 1)
//電腦可取勝
return 100 *(getMark(1)+ step*1000);
isChessOn[x][y] = 11);
isChessOn[x][y] = 2;
// 還原預設邊界值
x_min=temp1;
x_max=temp2;
y_min=temp3;
y_max=temp4;
if(t > max)
max = t;
//beta 剪枝
if(max >= beta)
return max;
}
return max;
}
//-----------------------搜索當前搜索狀態(tài)極小值--//
//alpha 祖先節(jié)點得到的當前最小最大值,用于alpha 剪枝
//beta 祖先節(jié)點得到的當前最大最小值,用于beta 剪枝
//step 還要搜索的步數(shù)
//return 當前搜索子樹極小值。
protected int findMin(int alpha, int beta, int step){
int min = beta;
if(step == 0){
return evaluate();
}
int[][] rt = getBests(sbw);
for(int i = 0;i < rt.length;i++){
int x = rt[i][0];
int y = rt[i][1];
int type = getType(x, y, sbw);
if(type == 1)
//玩家成5
return-100 *(getMark(1)+ step*1000);
// 預存當前邊界值
int temp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;
isChessOn[x][y] = sbw;
resetMaxMin(x,y);
int t = findMax(alpha, min, stepbwf);
if(able_flag && bwf==0 &&(type_1 == 20 || type_1 == 21 || type_1 == 22))// 禁手棋位置,不記錄
continue;
rt[n][0] = i;
rt[n][1] = j;
rt[n][2] = getMark(type_1)+ getMark(type_2);
n++;
-12-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
}
// 對二維數(shù)組排序
Arrays.sort(rt, new ArrComparator());
int size = weight > n? n:weight;
int[][] bests = new int[size][3];
System.arraycopy(rt, 0, bests, 0, size);
return bests;
} //----------------------------計算指定方位上的棋型-------------------//
// x,y 方向線基準一點。
//ex,ey 指定方向步進向量。
// k 棋子顏色,0:黑色,1:白色
// 該方向上的棋子數(shù)目 以及 活度
private int[] count(int x, int y, int ex, int ey, int bwf){
// 該方向沒意義,返回0
if(!makesense(x, y, ex, ey, bwf))
return new int[] {0, 1};
// 正方向 以及 反方向棋子個數(shù)
int rt_1 = 1,rt_2 = 1;
// 總棋子個數(shù)
int rt = 1;
// 正方向 以及 反方向連子的活度
int ok_1 = 0,ok_2 =0;
// 總活度
int ok = 0;
// 連子中間有無空格
boolean flag_mid1 =false,flag_mid2 = false;
// 連子中間空格的位置
int flag_i1 = 1,flag_i2 = 1;
if(isChessOn[x][y]!= 2){
throw new IllegalArgumentException(“position x,y must be empty!..”);
}
int i;
// 往正方向搜索
for(i = 1;x + i * ex < 15 && x + i * ex >= 0 && y + i * ey < 15 && y + i * ey >= 0;i++){
if(isChessOn[x + i * ex][y + i * ey] == bwf)
rt_1++;
-13-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
// 位置為空,若中空標志為false,則記為中空并繼續(xù)搜索
否則,break
else if(isChessOn[x + i * ex][y + i * ey] == 2){
if(!flag_mid1){
flag_mid1 = true;
flag_i1 = i;
}
else
break;
}
// 位置為對方棋子
else
break;
}
// 計算正方向活度,,// 最后一個位置不超過邊界
if(x + i * ex < 15 && x + i * ex >= 0 && y + i * ey < 15 && y + i * ey >= 0){
// 最后一個位置為空位 +1活
if(isChessOn[x + i * ex][y + i * ey] == 2){
ok_1++;
// 若是在尾部檢測到連續(xù)的空格而退出搜索,則不算有中空
if(rt_1 == flag_i1)
flag_mid1 = false;
// 若中空的位置在4以下 且 棋子數(shù)>=4,則這一邊的4非活
if(flag_mid1 && rt_1 > 3 && flag_i1 < 4){
ok_1--;
}
}
// 最后一個位置不是空格,且搜索了2步以上,若前一個是空格, 則不算中空,且為活的邊
else if(isChessOn[x + i * ex][y + i * ey]!= bwf && i >= 2)
if(isChessOn[x +(i-1)* ex][y +(i-1)* ey] == 2){
ok_1++;
flag_mid1 = false;
}
}
// 最后一個位置是邊界
搜索了2步以上,且前一個是空格, 則不算中空,且為活的邊
else if(i >= 2 && isChessOn[x +(i-1)* ex][y +(i-1)* ey] == 2){
-14-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
ok_1++;
flag_mid1 = false;
}
// 往反方向搜索
for(i = 1;xi * ex < 15 && yi * ey < 15;i++){
if(isChessOn[xi * ey] == bwf)
ey >= 0){
rt_2++;
else if(isChessOn[xi * ey] == 2){
if(!flag_mid2){
flag_mid2 = true;
flag_i2 = i;
}
else
break;
}
else
break;} // 計算反方向活度
if(xi * ex >= 0 && yi * if(isChessOn[xi * ey] == 2){
ok_2++;
if(rt_2 == flag_i2)
flag_mid2 = false;
if(flag_mid2 && rt_2 > 3 && flag_i2 < 4){
ok_2--;
} } else if(isChessOn[xi * ey]!= bwf && i >= 2)
if(isChessOn[x(i-1)* ey] == 2){
ok_2++;
flag_mid2 = false;
} } else if(i >= 2 && isChessOn[x(i-1)* ey] == 2){ ok_2++;flag_mid2 = false;}
課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
//------------------分析棋子類型
// 兩邊都沒中空,直接合成
if(!flag_mid1 &&!flag_mid2){
rt = rt_1 + rt_21;
// 判斷中間的純連子數(shù),在5以上,直接返回;為4,返回活4;
if(temp >= 5)
return new int[] {temp, 2};
if(temp == 4)
return new int[] {temp, 2};
// 先看有沒死4,再看有沒活3,剩下只能是死3
if(rt_1 + flag_i21 >= 4)
return new int[] {4, 1};
if(rt_1+flag_i2-1 == 3 && ok_1 > 0 || rt_2+flag_i1-1 == 3 && ok_2 > 0)
return new int[] {3, 2};
return new int[] {3, 1};
}
// 有一邊有中空
else {
// 總棋子數(shù)少于5,直接合成if(rt_1 + rt_21, ok_1 + ok_2};
// 多于5,先找成5,再找活4,剩下的只能是死4
else {
if(flag_mid1 && rt_2 + flag_i11, ok_2 + 1};
if(flag_mid2 && rt_1 + flag_i21, ok_1 + 1};
if(flag_mid1 &&(rt_2 + flag_i11 == 4 && ok_1 == 1 || flag_i2 == 4))
-16-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
}
}
} return new int[] {4, 2};
return new int[] {4, 1};5.2 程序流程圖
-17-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 6 性能測試
6.1 程序執(zhí)行結果
1.初始界面
2.人機博弈
3.人人博弈
-18-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
4.禁手選擇
5.悔棋選擇
-19-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163
6.規(guī)則界面
-20-課程名稱:人工智能原理及其應用 學生姓名:何兵 學生學號:1143041163 7 總結
本程序是使用α-β搜索的算法完成的一個簡單的五子棋博弈游戲。雖然α-βAlpha-Beta已經(jīng)盡力做到細致、全面,但由于α-β搜索存在博弈樹算法中普遍存在的一個缺點?一隨著搜索層數(shù)的增加,算法的效率大大下降。所以該搜索的效率還是不怎么理想,五子棋程序的“智力”也不高。因此可以在上述程序的基礎上,針對五子棋本身的特點和規(guī)律對α-β搜索算法進行優(yōu)化與修正,比如用啟發(fā)式搜索。還有就是雖然使用了禁手思維的算法,但是這并不能平衡先后手之間的差距,依然是“先行必勝”,這個問題還有待進一步解決。
參考文獻
[1] 明日科技.Java項目案例分析.清華大學出版社
[2](美)埃克爾著 陳昊鵬 譯.Java編程思想.機械工業(yè)出版社-21-
讀書的好處
1、行萬里路,讀萬卷書。
2、書山有路勤為徑,學海無涯苦作舟。
3、讀書破萬卷,下筆如有神。
4、我所學到的任何有價值的知識都是由自學中得來的?!_爾文
5、少壯不努力,老大徒悲傷。
6、黑發(fā)不知勤學早,白首方悔讀書遲?!佌媲?/p>
7、寶劍鋒從磨礪出,梅花香自苦寒來。
8、讀書要三到:心到、眼到、口到
9、玉不琢、不成器,人不學、不知義。
10、一日無書,百事荒廢。——陳壽
11、書是人類進步的階梯。
12、一日不讀口生,一日不寫手生。
13、我撲在書上,就像饑餓的人撲在面包上。——高爾基
14、書到用時方恨少、事非經(jīng)過不知難。——陸游
15、讀一本好書,就如同和一個高尚的人在交談——歌德
16、讀一切好書,就是和許多高尚的人談話?!芽▋?/p>
17、學習永遠不晚?!郀柣?/p>
18、少而好學,如日出之陽;壯而好學,如日中之光;志而好學,如炳燭之光。——劉向
19、學而不思則惘,思而不學則殆。——孔子
20、讀書給人以快樂、給人以光彩、給人以才干?!喔?/p>
第三篇:人工智能與專家系統(tǒng)課程設計解讀
目錄
1.設計任務 1.1 設計題目 1.2設計要求 1.3設計任務 2.方案設計 2.1原理
2.2 具體設計方法 3.系統(tǒng)實施
3.1 系統(tǒng)開發(fā)環(huán)境 3.2系統(tǒng)主要功能介紹 3.3處理流程圖 3.4 核心源程序 3.5系統(tǒng)運行結果 4.開發(fā)心得
4.1設計存在的問題
4.2進一步改進提高的設想 4.3經(jīng)驗和體會 5.參考文獻 1.設計任務 1.1 設計題目
在一個3*3的方棋盤上放置著1,2,3,4,5,6,7,8八個數(shù)碼,每個數(shù)碼占一格,且有一個空格。這些數(shù)碼可以在棋盤上移動,該問題稱八數(shù)碼難題或者重排九宮問題。
1.2 設計要求
其移動規(guī)則是:與空格相鄰的數(shù)碼方格可以移入空格。現(xiàn)在的問題是:對于指定的初始棋局和目標棋局,給出數(shù)碼的移動序列。
1.3 設計任務
利用人工智能的圖搜索技術進行搜索,解決八數(shù)碼問題來提高在推理中的水平,同時進行新方法的探討。
2.方案設計 2.1 原理
八數(shù)碼問題是個典型的狀態(tài)圖搜索問題。搜索方式有兩種基本的方式,即樹式搜索和線式搜索。搜索策略大體有盲目搜索和啟發(fā)式搜索兩大類。盲目搜索就是無“向導”的搜索,啟發(fā)式搜索就是有“向導”的搜索。
2.2 具體設計方法
啟發(fā)式搜索
由于時間和空間資源的限制,窮舉法只能解決一些狀態(tài)空間很小的簡單問題,而對于那些大狀態(tài)空間的問題,窮舉法就不能勝任,往往會導致“組合爆炸”。所以引入啟發(fā)式搜索策略。啟發(fā)式搜索就是利用啟發(fā)性信息進行制導的搜索。它有利于快速找到問題的解。由八數(shù)碼問題的部分狀態(tài)圖可以看出,從初始節(jié)點開始,在通向目標節(jié)點的路徑上,各節(jié)點的數(shù)碼格局同目標節(jié)點相比較,其數(shù)碼不同的位置個數(shù)在逐漸減少,最后為零。所以,這個數(shù)碼不同的位置個數(shù)便是標志一個節(jié)點到目標節(jié)點距離遠近的一個啟發(fā)性信息,利用這個信息就可以指導搜索。即可以利用啟發(fā)信息來擴展節(jié)點的選擇,減少搜索范圍,提高搜索速度。
啟發(fā)函數(shù)設定。對于八數(shù)碼問題,可以利用棋局差距作為一個度量。搜索過程中,差距會逐漸減少,最終為零,為零即搜索完成,得到目標棋局。
3.系統(tǒng)實施
3.1 系統(tǒng)開發(fā)環(huán)境
Windows操作系統(tǒng)、SQL Server 200X
3.2 系統(tǒng)主要功能介紹
該搜索為一個搜索樹。為了簡化問題,搜索樹節(jié)點設計如下: struct Chess//棋盤
3.4 核心源程序
#include “stdio.h” #include “stdlib.h” #include “time.h” #include “string.h” #include
const int N=3;//3*3棋盤
const int Max_Step=30;//最大搜索深度
enum Direction{None,Up,Down,Left,Right};//方向 struct Chess//棋盤 { int cell[N][N];//數(shù)碼數(shù)組
int Value;//評估值
Direction BelockDirec;//所屏蔽方向
struct Chess * Parent;//父節(jié)點 };
//打印棋盤
void PrintChess(struct Chess *TheChess){ printf(“----------n”);for(int i=0;i printf(“t”); for(int j=0;j { printf(“%dt”,TheChess->cell[i][j]); } printf(“n”);} printf(“tttt差距:%dn”,TheChess->Value);} break;case Left: t_j++; if(t_j>=N) AbleMove=false; break;case Right: t_j--; if(t_j<0) AbleMove=false; break;};if(!AbleMove)//不可以移動則返回原節(jié)點 { return TheChess;} if(CreateNewChess){ NewChess=new Chess(); for(int x=0;x { for(int y=0;y NewChess->cell[x][y]=TheChess->cell[x][y]; } } else NewChess=TheChess;NewChess->cell[i][j]=NewChess->cell[t_i][t_j];NewChess->cell[t_i][t_j]=0; return NewChess;} //初始化一個初始棋盤 struct Chess * RandomChess(const struct Chess * TheChess) p=NULL;queue do{ p1=(struct Chess *)Queue1.front(); Queue1.pop(); for(int i=1;i<=4;i++)//分別從四個方向推導出新子節(jié)點 { Direction Direct=(Direction)i; if(Direct==p1->BelockDirec)//跳過屏蔽方向 continue; p2=MoveChess(p1,Direct,true);//移動數(shù)碼 if(p2!=p1)//數(shù)碼是否可以移動 { Appraisal(p2,Target);//對新節(jié)點估價 if(p2->Value<=p1->Value)//是否為優(yōu)越節(jié)點 { p2->Parent=p1; switch(Direct)//設置屏蔽方向,防止往回推 { case Up:p2->BelockDirec=Down;break; case Down:p2->BelockDirec=Up;break; case Left:p2->BelockDirec=Right;break; case Right:p2->BelockDirec=Left;break; } Queue1.push(p2);//存儲節(jié)點到待處理隊列 if(p2->Value==0)//為0則,搜索完成{ p=p2; i=5; } } else { //打印 if(T){ /*把路徑倒序*/ Chess *p=T; stack while(p->Parent!=NULL) { Stack1.push(p); p=p->Parent; } printf(“搜索結果:n”); while(!Stack1.empty()) { PrintChess(Stack1.top()); Stack1.pop(); } printf(“n完成!”);}else printf(“搜索不到結果.深度為%dn”,Max_Step); scanf(“%d”,T);} 3.5 系統(tǒng)運行結果 4.開發(fā)心得 4.1 設計存在的問題 完全能解決簡單的八數(shù)碼問題,但對于復雜的八數(shù)碼問題還是無能為力。4.2 進一步改進提高的設想 可以改變數(shù)碼規(guī)模(N),來擴展成N*N的棋盤,即擴展為N數(shù)碼問題的求解過程。 2、內(nèi)存泄漏。由于采用倒鏈表的搜索樹結 05.參考文獻 [1]王汝傳.計算機圖形學[M].北京:人民郵電出版社,1999:123-130.[2]劉榴娣,劉明奇,黨長民.實用數(shù)字圖像處理[M].北京:北京理工大學出版,2000:12-25..[3]丁兆海.Delphi基礎教程[M].北京:電子工業(yè)出版社,1999.[4]王小華.Delphi 5程序設計與控件參考[M].北京:電子工業(yè)出版社,1999:70-120.[5]趙子江.多媒體技術基礎[M].北京:機械工業(yè)出版社,2001:118-130.[6]段來盛,鄭城榮,曹恒.Delphi實戰(zhàn)演練[M].北京:人民郵政出版社,2002:80-95. 讀書的好處 1、行萬里路,讀萬卷書。 2、書山有路勤為徑,學海無涯苦作舟。 3、讀書破萬卷,下筆如有神。 4、我所學到的任何有價值的知識都是由自學中得來的。——達爾文 5、少壯不努力,老大徒悲傷。 6、黑發(fā)不知勤學早,白首方悔讀書遲?!佌媲?/p> 7、寶劍鋒從磨礪出,梅花香自苦寒來。 8、讀書要三到:心到、眼到、口到 9、玉不琢、不成器,人不學、不知義。 10、一日無書,百事荒廢?!悏?/p> 11、書是人類進步的階梯。 12、一日不讀口生,一日不寫手生。 13、我撲在書上,就像饑餓的人撲在面包上?!郀柣?/p> 14、書到用時方恨少、事非經(jīng)過不知難?!懹?/p> 15、讀一本好書,就如同和一個高尚的人在交談——歌德 16、讀一切好書,就是和許多高尚的人談話?!芽▋?/p> 17、學習永遠不晚?!郀柣?/p> 18、少而好學,如日出之陽;壯而好學,如日中之光;志而好學,如炳燭之光?!獎⑾?/p> 19、學而不思則惘,思而不學則殆?!鬃?/p> 20、讀書給人以快樂、給人以光彩、給人以才干。——培根 //回溯法之N皇后問題 當N>10,就有點抽了~~ /*結果前total行每行均為一種放法,表示第i行擺放皇后的列位置,第total+1行,輸出total*/ #include int n,stack[100]; //存當前路徑 int total; //路徑數(shù) void make(int l) //遞歸搜索以stack[l]為初結點的所有路徑 { int i,j; //子結點個數(shù) if(l==n+1) { total=total+1; //路徑數(shù)+1 for(i=1;i<=n;i++) printf(“%-3d”,stack[i]);//輸出第i行皇后的列位置stack[i] printf(“n”); exit; //回溯(若試題僅要求一條路徑,則exit改為halt即可) } for(i=1;i<=n;i++) { stack[l]=i;//算符i作用于生成stack[l-1]產(chǎn)生子狀態(tài)stack[l]; if(!att(l,i)) make(l+1); } //再無算符可用,回溯 } int att(int l,int i){ int k; for(k=1;k if(abs(l-k)==abs(stack[k]-i)||i==stack[k])return 1; return 0;} int main(){ printf(“N=”); scanf(“%d”,&n); total=0;//路徑數(shù)初始化為0 make(1); //從結點1出發(fā),遞歸搜索所有的路徑 printf(“%dn”,total); system(“pause”); return 0;} 由回溯法的算法流程可以看出,除非邊界條件設置不當而導致死循環(huán)外,回溯法一般是不會產(chǎn)生內(nèi)存溢出的。但是,回溯法亦有其致命的弱點——時間效率比數(shù)學解析法低。為了改善其時效,我們可以從下述幾個方面考慮優(yōu)化: 1、遞歸時對尚待搜索的信息進行預處理,減少搜索量; 2、盡可能減少分支(解答樹的次數(shù)); 3、增加約束條件,使其在保證出解的前提下盡可能“苛刻”; 4、在約束條件中設置限定搜索層次的檻值。 人工智能學科誕生于20世紀50年代中期,當時由于計算機的產(chǎn)生與發(fā)展,人們開始了具有真正意義的人工智能的研究。(雖然計算機為AI提供了必要的技術基礎,但直到50年代早期人們才注意到人類智能與機器之間的聯(lián)系.Norbert Wiener是最早研究反饋理論的美國人之一.最熟悉的反饋控制的例子是自動調(diào)溫器.它將收集到的房間溫度與希望的溫度比較,并做出反應將加熱器開大或關小,從而控制環(huán)境溫度.這項對反饋 回路的研究重要性在于: Wiener從理論上指出,所有的智能活動都是反饋機制的結果.而反饋機制是有可 能用機器模擬的.這項發(fā)現(xiàn)對早期AI的發(fā)展影響很大。) 1956年夏,美國達特莫斯大學助教麥卡錫、哈佛大學明斯基、貝爾實驗室申龍、IBM公司信息研究中心羅徹斯特、卡內(nèi)基——梅隆大學紐厄爾和赫伯特.西蒙、麻省理工學院塞夫里奇和索羅門夫,以及IBM公司塞繆爾和莫爾在美國達特莫斯大學舉行了以此為其兩個月的學術討論會,從不同學科的角度探討人類各種學習和其他職能特征的基礎,并研究如何在遠離上進行精確的描述,探討用機器模擬人類智能等問題,并首次提出了人工智能的術語。從此,人工智能這門新興的學科誕生了。這些青年的研究專業(yè)包括數(shù)學、心理學、神經(jīng)生理學、信息論和電腦科學,分別從不同角度共同探討人工智能的可能性。他們的名字人們并不陌生,例如申龍是《信息論》的創(chuàng)始人,塞繆爾編寫了第一個電腦跳棋程序,麥卡錫、明斯基、紐厄爾和西蒙都是“圖靈獎”的獲獎者。 這次會議之后,在美國很快形成了3個從事人工智能研究的中心,即以西蒙和紐威爾為首的卡內(nèi)基—梅隆大學研究組,以麥卡錫、明斯基為首的麻省理工學院研究組,以塞繆爾為首的IBM公司研究組。隨后,這幾個研究組相繼在思維模型、數(shù)理邏輯和啟發(fā)式程序方面取得了一批顯著的成果: (1)1956年,紐威爾和西蒙研制了一個“邏輯理論家“(簡稱LT)程序,它將每個問題都表示成一個樹形模型,然后選擇最可能得到正確結論的那一枝來求解問題,證明了懷特黑德與羅素的數(shù)學名著《數(shù)學原理》的第2章中52個定理中的38個定理。1963年對程序進行了修改,證明了全部定理。這一工作受到了人們的高度評價,被認為是計算機模擬人的高級思維活動的一個重大成果,是人工智能的真正開端。 (2)1956年,塞繆爾利用對策論和啟發(fā)式搜索技術編制出西洋跳棋程序Checkers。該程序具有自學習和自適應能力,能在下棋過程中不斷積累所獲得的經(jīng)驗,并能根據(jù)對方的走步,從許多可能的步數(shù)中選出一個較好的走法。這是模擬人類學習過程第一次卓有成效的探索。這臺機器不僅在1959年擊敗了塞繆爾本人,而且在1962年擊敗了美國一個州的跳棋冠軍,在世界上引起了大轟動。這是人工智能的一個重大突破。 (3)1958年,麥卡錫研制出表處理程序設計語言LISP,它不僅可以處理數(shù)據(jù),而且可以方便的處理各種符號,成為了人工智能程序語言的重要里程碑。目前,LISP語言仍然是研究人工智能何開發(fā)智能系統(tǒng)的重要工具。 (4)1960年紐威爾、肖和西蒙等人通過心理學實驗,發(fā)現(xiàn)人在解題時的思維過程大致可以分為3個階段:1。首先想出大致的解題計劃;2。根據(jù)記憶中的公理、定理和解題規(guī)劃、按計劃實施解題過程;3.在實施解題過程中,不斷進行方法和目標分析,修改計劃。這是一個具有普遍意義的思維活動過程,其中主要是方法和目的的分析。(也就是人們在求解數(shù)學問題通常使用試湊的辦法進行的試湊是不一定列出所有的可能性,而是用邏輯推理來迅速縮小搜索范圍的辦法進行的),基于這一發(fā)現(xiàn),他們研制了“通用問題求解程序GPS”,用它來解決不定積分、三角函數(shù)、代數(shù)方程等11種不同類型的問題,并首次提出啟發(fā)式搜索概念,從而使啟發(fā)式程序具有較普遍的意義。 (5)1961年,明斯基發(fā)表了一篇名為《邁向人工智能的步驟》的論文,對當時人工智能的研究起了推動作用。 正是由于人工智能在20世紀50年代到60年代的迅速發(fā)展和取得的一系列的研究成果,使科學家們歡欣鼓舞,并對這一領域給予了過高的希望。紐威爾和西蒙在1958年曾作出以下預言: ①不出十年,計算機將成為世界象棋冠軍,除非規(guī)定不讓它參加比賽; ②.不出十年,計算機將發(fā)現(xiàn)并證明那時還沒有被證明的數(shù)學定理; ③.不出十年,計算機將譜寫出具有較高美學價值并得到評論家認可的樂曲; ④不出十年,大多數(shù)心理學家的理論將采用計算機程序來形成。 非常遺憾的是,到目前為止,這樣的預言還沒有一個得到完全的實現(xiàn),人工智能的研究狀況比紐威爾和西蒙等科學家的設想要復雜和艱難的多。事實上,到了20世紀70年代初,人工智能在經(jīng)歷一段比較快速的發(fā)展時期后,很快就遇到了許多問題。這些問題主要表現(xiàn)在: (1)1965年魯賓遜發(fā)明了歸結(消解)原理,曾被認為是一個重大的突破,可是很快這種歸結法能力有限,證明兩個連續(xù)函數(shù)之和還是連續(xù)函數(shù),推證了十萬步竟還沒有得證。 (2)塞繆爾的下棋程序,贏得了周冠軍后,沒能贏全國冠軍。 (3)機器翻譯出了荒謬的結論。如從英語→俄語→英語的翻譯中,又一句話:“The spirit is willing but the flesh is weak”(心有余而力不足),結果變成了”The wine is good but the meat is spoiled”(酒是好的,肉變質(zhì)了),鬧出了笑話。 (4)大腦約有10的15次方以上的記憶容量,此容量相當于存放幾億本書的容量,現(xiàn)有的技術條件下在機器的結構上模擬人腦是不大可能的。 (5)來自心理學、神經(jīng)生理學、應用數(shù)學、哲學等各界的科學家們對人工智能的本質(zhì)、基本原理、方法及機理等方面產(chǎn)生了質(zhì)疑和批評。 由于人工智能研究遇到了困難,使得人工智能在20世紀70年代初走向低落。但是,人工智能的科學家沒有被一時的困難所嚇倒,他們在認真總結經(jīng)驗教訓的基礎上,努力探索使人工智能走出實驗室,走向實用化的新路子,并取得了令人鼓舞的進展。特別是專家系統(tǒng)的出現(xiàn),實現(xiàn)了人工智能從理論研究走向實際應用,從一般思維規(guī)律探索走向專門知識應用的重大突破,是人工智能發(fā)展史上的重大轉折,將人工智能的研究推向了新高潮。下面是幾個又代表性的專家系統(tǒng): (1)1968年斯坦福大學費根鮑姆教授和幾位遺傳學家及物理學家合作研制了一個化學質(zhì)譜分析系統(tǒng)(DENDARL),該系統(tǒng)能根據(jù)質(zhì)譜儀的數(shù)據(jù)和核磁諧振的數(shù)據(jù),以及有關化學知識推斷有機化合物的分子結構,達到了幫助化學家推斷分子結構的作用。這是第一個專家系統(tǒng),標志著人工之能從實驗室走了出來,開始進入實際應用時代。 (2)繼DENDARAL系統(tǒng)之后,費根鮑姆領導的研究小組又研制了診斷和治療細菌感染性血液病的專家咨詢系統(tǒng)MYCIN。經(jīng)專家小組對醫(yī)學專家、實習醫(yī)師以及MYCIN行為進行正式測試評價,認為MYCIN的行為超過了其他所有人,尤其在診斷和治療菌血癥和腦膜炎方面,顯示了該系統(tǒng)作為臨床醫(yī)生實際助手的前途。從技術的角度來看,該系統(tǒng)的特點是:1。使用了經(jīng)驗性知識,用可信度表示,進行不精確推理。2.對推理結果具有解釋功能,時系統(tǒng)是透明的。3.第一次使用了知識庫的概念。正是由于MYCIN基本解決了知識表示、知識獲取、搜索策略、不精確推理以及專家系統(tǒng)的基本結構等重大問題(是怎樣解決的呢?),對以后的專家系統(tǒng)產(chǎn)生了很大的影響。 (3)1976年,斯坦福大學國際人工智能中心的杜達等人開始研制礦藏勘探專家系統(tǒng)PROSPECTOR,它能幫助地質(zhì)學家解釋地質(zhì)礦藏數(shù)據(jù),提供硬巖石礦物勘探方面的咨詢,包括勘探測評,區(qū)域資源估值,鉆井井位選擇等。該系統(tǒng)用語義網(wǎng)絡表示地質(zhì)知識,擁有15中礦藏知識,采用貝葉斯概率推理處理不確定的數(shù)據(jù)和知識。PROSPECTOR系統(tǒng)于1981年開始投入實際使用,取得了巨大的經(jīng)濟效益。例如1982年,美國利用該系統(tǒng)在華盛頓發(fā)現(xiàn)一處礦藏,據(jù)說實用價值可能超過1億美元。 (4)美國卡內(nèi)基—梅隆大學于20世紀70年代先后研制了語音理解系統(tǒng)HEARSAY-I加入HEARSAY-II,它完成從輸入的聲音信號轉換成字,組成單詞,合成句子,形成數(shù)據(jù)庫查詢語句,再到情報數(shù)據(jù)庫中去查詢資料。該系統(tǒng)的特點是采用“黑板結構”這種新結構形式,能組合協(xié)調(diào)專家的知識,進行不同抽象級的問題求解。 在這一時期,人工智能在新方法、程序設計語言、知識表示、推理方法等方面也取得了重大進展。例如70年代許多新方法被用于AI開發(fā),著名的如Minsky的構造理論.另外David Marr提出了機器視覺方面的新理論,例如,如何通過一副圖像的陰影,形狀,顏色,邊界和紋理等基本信息辨別圖像.通過分析這些信息,可以推斷出圖像可能是什么,法國馬賽大學的柯爾麥倫和他領導的研究小組于1972年研制成功的第一個PROLOG系統(tǒng),成為了繼LISP語言之后的另一種重要的人工智能程序語言;明斯基1974年提出的框架理論;紹特里夫于1975年提出并在MYCIN中應用的不精確推理;杜達于1976年提出并在PROSPECTOR中應用的貝葉斯方法;等等 人工智能的科學家們從各種不同類型的專家系統(tǒng)和知識處理系統(tǒng)中抽取共性,總結出一般原理與技術,使人工智能又從實際應用逐漸回到一般研究。圍繞知識這一核心問題,人們重新對人工智能的原理和方法進行了探索,并在知識獲取、知識表示以及知識在推理過程中的利用等方面開始出現(xiàn)一組新的原理、工具和技術。1977年,在第五屆國際人工智能聯(lián)合會(IJCAI)的會議上,費根鮑姆教授在一篇題為《人工智能的藝術:知識工程課題及實例研究》的特約文章中,系統(tǒng)的闡述了專家系統(tǒng)的思想,并提出了知識工程(KnowledgeEngineering)的概念。費根鮑姆認為,知識工程是研究知識信息處理的學科,它應用人工智能的原理和方法,對那些需要專家知識才能解決的應用難題提供了求解的途徑。恰當?shù)倪\用專家知識的獲取、表示、推理過程的構成與解釋,是設計基于知識的系統(tǒng)的重要技術問題。至此,圍繞著開發(fā)專家系統(tǒng)而開展的相關理論、方法、技術的研究形成了知識工程學科。知識工程的研究使人工智能的研究從理論轉向應用,從基于推理的模型轉向基于知識的模型。 為了適應人工智能和知識工程發(fā)展的需要,在政府的大力支持下,日本于1982年開始了為期10年的“第五代計算機的研制計劃”,即“知識信息處理計算機系統(tǒng)KIPS”,總共投資4.5億美元。它的目的是使邏輯推理達到數(shù)值運算那樣快。日本的這一計劃形成了一股熱潮,推動了世界各國的追趕浪潮。美國、英國、歐共體、蘇聯(lián)等都先后制訂了相應的發(fā)展計劃。隨著第五代計算機的研究開發(fā)和應用,人工智能進入一個興盛時期,人工智能界一派樂觀情緒。 然而,隨著專家系統(tǒng)應用的不斷深入,專家系統(tǒng)自身存在的知識獲取難、知識領域窄、推理能力弱、只能水平低、沒有分布式功能、實用性差等等問題逐步暴露出來。日本、美國、英國和歐洲所制訂對那些針對人工智能的大型計劃多數(shù)執(zhí)行到20世紀80年代中期就開始面臨重重困難,已經(jīng)看出達不到預想的目標。進一步分析便發(fā)現(xiàn),這些困難不只是個別項目的制訂又問題,而是涉及人工智能研究的根本性問題。總的來講是兩個問題:一是所謂的交互(Interaction)問題,即傳統(tǒng)方法只能模擬人類深思熟慮的行為,而不包括人與環(huán)境的交互行為。另一個問題是擴展(Scaling up)問題,即所謂的大規(guī)模的問題,傳統(tǒng)人工智能方法只適合于建造領域狹窄的專家系統(tǒng),不能把這種方法簡單的推廣到規(guī)模更大、領域更寬的復雜系統(tǒng)中去。這些計劃的失敗,對人工智能的發(fā)展是一個挫折。 盡管經(jīng)歷了這些受挫的事件,AI仍在慢慢恢復發(fā)展.新的技術在日本被開發(fā)出來,如在美國首創(chuàng)的模糊邏輯,它可以從不確定的條件作出決策;還有神經(jīng)網(wǎng)絡,被視為實現(xiàn)人工智能的可能途徑.1982年后,人工神經(jīng)網(wǎng)絡像雨后春筍一樣迅速發(fā)展起來,給人們帶來了新的希望。人工神經(jīng)網(wǎng)絡的主要特點是信息的分布存儲和信息處理的并行化,并具有自組織自學習能力,這使人們利用機器加工處理信息有了新的途徑和方法,解決了一些符號方法難以解決的問題,使人工智能的學術界興起了神經(jīng)網(wǎng)絡的熱潮。1987年美國召開了第一次神經(jīng)網(wǎng)絡國際會議,宣布新學科的誕生。1988年以后,日本和歐洲各國在神經(jīng)網(wǎng)絡方面的投資逐步增加,促進了該領域的研究。但是隨著應用的深入,人們又發(fā)現(xiàn)人工神經(jīng)元網(wǎng)絡模型和算法也存在問題。 20世紀80年代末,以美國麻省理工學院布魯克斯(R.A.Brooks)教授為代表的行為主義學派提出了“無須表示和推理”的智能,認為智能只在與環(huán)境的交互中表現(xiàn)出來,并認為研制可適應環(huán)境的“機器蟲”比空想智能機器人要好。以后,人工智能學術界充分認識到已有的人工智能方法僅限于在模擬人類智能活動中使用成功的經(jīng)驗知識處理簡單的問題,開始在符號機理與神經(jīng)網(wǎng)機理的結合及引入Agent系統(tǒng)等方面進一步開展研究工作。20世紀90年代,所謂的符號主義、連接主義和行動主義3種方法并存。對此,中國學者認為這3種方法各有優(yōu)缺點,他們提出了綜合集成的方法,即不同的問題用不同的方法來解決,或用聯(lián)合(混合、融合)的方法來解決,再加上人工智能系統(tǒng)引入交互機制,系統(tǒng)的智能水平將會大為提高。 總而言之,盡管人工智能的發(fā)展經(jīng)歷了曲折的過程,但它在自動推理、認知建模、機器學習、神經(jīng)元網(wǎng)絡、自然語言處理、專家系統(tǒng)、智能機器人等方面的理論和應用上都取得了稱得上具有“智能”的成果。許多領域將知識和智能思想引入到自己的領域,使一些問題得以較好的解決。應該說,人工智能的成就是巨大的,影響是深遠的。 讀書的好處 1、行萬里路,讀萬卷書。 2、書山有路勤為徑,學海無涯苦作舟。 3、讀書破萬卷,下筆如有神。 4、我所學到的任何有價值的知識都是由自學中得來的?!_爾文 5、少壯不努力,老大徒悲傷。 6、黑發(fā)不知勤學早,白首方悔讀書遲?!佌媲?/p> 7、寶劍鋒從磨礪出,梅花香自苦寒來。 8、讀書要三到:心到、眼到、口到 9、玉不琢、不成器,人不學、不知義。 10、一日無書,百事荒廢?!悏?/p> 11、書是人類進步的階梯。 12、一日不讀口生,一日不寫手生。 13、我撲在書上,就像饑餓的人撲在面包上?!郀柣?/p> 14、書到用時方恨少、事非經(jīng)過不知難?!懹?/p> 15、讀一本好書,就如同和一個高尚的人在交談——歌德 16、讀一切好書,就是和許多高尚的人談話?!芽▋?/p> 17、學習永遠不晚。——高爾基 18、少而好學,如日出之陽;壯而好學,如日中之光;志而好學,如炳燭之光。——劉向 19、學而不思則惘,思而不學則殆。——孔子 20、讀書給人以快樂、給人以光彩、給人以才干。——培根第四篇:回溯法之N皇后問題(C語言)
第五篇:人工智能發(fā)展史解讀