人工智能课程设计报告完整版.docx
- 文档编号:26619522
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:23
- 大小:155.96KB
人工智能课程设计报告完整版.docx
《人工智能课程设计报告完整版.docx》由会员分享,可在线阅读,更多相关《人工智能课程设计报告完整版.docx(23页珍藏版)》请在冰豆网上搜索。
人工智能课程设计报告完整版
HENsystemofficeroom【HEN16H-HENS2AHENS8Q8-HENH1688】
人工智能课程设计报告
人工智能课程设计报告
----设计三:
八皇后
学院:
信息科学与工程学院
班级:
自动化0703班
******
学号:
指导教师:
陈白帆陈学
2010年6月10日
一、概述
、设计题目………………………………………………………………
、系统主要内容与功能…………………………………………………
二、设计流程及描述
、设计流程图……………………………………………………………
、设计思路简介…………………………………………………………
三、运行界面简介
、游戏模式界面演示……………………………………………………
、解答界面演示…………………………………………………………
四、源程序代码
、游戏模式代码…………………………………………………………
、解答代码………………………………………………………………
五、课程设计体会
设计体会…………………………………………………………………
附录
参考文献……………………………………………………………………………
(一)概述
设计题目:
问题是一个古老而着名的问题,是回溯算法的典型例题。
该问题是十九世纪着名的数学家高斯1850年提出:
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。
1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
系统主要内容与功能
设计内容:
在8*8的国际象棋棋盘上,放置8个皇后后,使8个棋子不能被相互对方吃掉。
设计要求:
(1)较好的人机操作界面,登陆界面应有系统的各种功能信息。
(2)能够进行基本的游戏操作,用不同的颜色在棋盘上表示能占用的格子和不能占用的。
(3)当程序出错后应能可以重新开始进行游戏
(4)此系统应包括答案解答功能,其中答案解答功能应包括各种答案的游戏界面共有92种情况。
(二)设计流程及描述
设计流程图:
算法基本流程图
主函数:
2.2设计思路简介:
由于这是一个平面上的棋子布局处理问题,因此我们可以将问题堪称一个2维数组问题,不妨设这个8*8数组A,并假定第一行是为后一位置的位置,第二行为后卫放置的位置,依次类推,8行分别存放8个后的位置,为了简便处理,我们先将A(8,8)的初值设为1,一旦一个位置存放一个后,则其他后不能处于同一行,同一列,同一个斜线,将这些位置的数组元素的值设为0。
1.1在其中一个位置上有一后的数据处理
设第m行,n列有一个后,则根据原则,分别从八个不同的方向将对应的元素置为0。
第K个后的位置设定
假定前面:
k-1个后的位置已经确定,则第:
K个后只能放置在第K行中元素不为0的位置上。
因此只需找到这个不为0的元素A(K,J),J就是第K个后的位置。
最后一个后的位置确定
如果第8行中有元素不为0,则表明你已经找到了一种摆法,可以通过文本框text1输将文本框的ScrollBar的属性设为2-Vertivcal,Multiline属性设为true。
但是输出后还要寻找是否有其它的摆法?
如果第8行中元素均为0,则表明你的这种摆法不行,还得要尝试其它的方法,看看是否能行?
但是,如何尝试其它的摆法呢?
这就是问题的关键所在,需要我们回溯到以前的状态,重新摆放!
回溯处理
回溯到以前的状态可以用下面的算法来实现:
(1)寻找到第:
个后的位置。
(2)将当前数组6的值全部保存到另外一个数组"中,以便回溯时用到。
(3)进行%7%的数据处理。
(4)寻找下一个后的位置。
(5)不管是否找到正确摆放方法,都应当去尝试其它方法。
因此,必须再将B中的数据还原到数组A中进行回溯处理。
至此,八皇后问题的算法已基本解决,用户可以从第一个后开始,通过多重循环逐个处理,完成设计,最终得到的92种不同的算法。
2、算法改进
由于通过多重循环进行处理,8个后就需要8重循环处理,使得程序就显得很长,效率不是很高,能否通过改进程序来提高效率?
值得我们去探讨。
对数据处理的改进
根据问题的实际情况,由于后是按顺序进行处理的,因此当你处理到第K个后时,前面K-1个的位置已经确立,也就是说前面K-1行数据已经处理完毕,所以没有必要在中对向左上,向上,向右上三个方向的数据进行处理,只需要处理中其它5个方向即可。
保存数据的改进
将数组A的当前状态存放到B数组中去,以便将来回溯时使用。
由于回溯并不是回到初始状态,因此没有必要将整个数组全部保存,只需部分保存即可。
例如,你在处理第K个后时,只要将第K行到第8行数组A中的数据保存。
回溯时,只要将第K行之后的元素还原即可。
多重循环的改进
8个后,使用8重循环,而且处理的方法类同,使得我们的程序冗长,用户可以使用递归算法来缩短程序的长度。
算法如下:
(1)寻找第K个后
(2)确定第K个后的位置
(3)保存K行之后的数($7$)
(4)进行第K个后位置确定后的数据处理
(5)K=K+1;
(6)如果K不大于8,重复
(1),进行递归处理。
如果等于8,进行
(7)处理
(7)如果找到摆法,在文本框中输出。
(8)K=K-1
(9)还原第K行后的数据,处理第K个后的其它摆法。
3、算法比较
通过改进程序算法,运行效率明显提高,其中实际运算时间提高%50,程序长度缩短%40。
三、运行界面简介
游戏开始界面:
此部分包括两部分:
(1)当游戏失败后可以进行重新开始游戏,
(2)游戏帮助信息
游戏运行界面:
很明显此游戏完成失败!
成功的完成游戏!
!
答案解答界面:
此部分包含两个模块:
运算和显示模块
此为其计算的结果,共有92中不同的结果。
选择自己希望的答案组数
以上为对应的显示的答案,从中可以看出游戏成功!
四、源程序代码
、游戏模式代码
OptionExplicit
DimSd(63)AsInteger
DimCntAsInteger
PrivateSubForm_Load()
="八皇后游戏"
=5000
=5500
DimmAsInteger,nAsInteger
WithPicture1(0)
.Left=500
.Top=500
.Width=500
.Height=500
.BackColor=vbWhite
EndWith
'初始化,载入8*8个格
Form=0To7
Forn=0To7
Ifm=0Andn=0Thenn=1
LoadPicture1(m*8+n)
WithPicture1(m*8+n)
.Left=(n+1)*500
.Top=(m+1)*500
.Width=500
.Height=500
.BackColor=vbWhite
.Visible=True
EndWith
Next
Next
EndSub
PrivateSubhp_Click()
MsgBox"请在下面8*8共64个方格中填入8个绿色方格"&vbCrLf&"要求这8个绿色方格两两之间不能共行或共列,也不能共斜线"&vbCrLf&Space(60)&"---xinfresh编写",vbInformation,"游戏帮助"
EndSub
PrivateSubPicture1_Click(IndexAsInteger)
IfPicture1(Index).BackColor=vbWhiteThen'未用
Picture1(Index).BackColor=vbGreen'该格标绿,说明已选中
Cnt=Cnt+1
=Left,5)&"已放入"&CStr(Cnt)&"个皇后"
IfCnt=8Then
MsgBox"恭喜您成功完成!
!
强人!
!
",vbInformation,"强烈恭喜!
"
CallReSt_Click
ExitSub
EndIf
ElseIfPicture1(Index).BackColor=vbGreenThen'已选用,撤销
Picture1(Index).BackColor=vbWhite'该格标白,说明未用
Cnt=Cnt-1
=Left,5)&"已放入"&CStr(Cnt)&"个皇后"
Else
ExitSub
EndIf
DimmAsInteger,nAsInteger,pAsInteger,qAsInteger
m=Index\8'获得当前行
n=IndexMod8'获得当前列
DimfcAsColorConstants
DimtmpaddAsInteger
IfPicture1(Index).BackColor=vbWhiteThen
fc=vbWhite
tmpadd=-1
EndIf
IfPicture1(Index).BackColor=vbGreenThen
fc=vbRed
tmpadd=1
EndIf
'同行变色
p=m-1
DoWhilep>=0
WithPicture1(p*8+n)
.BackColor=fc
Sd(p*8+n)=Sd(p*8+n)+tmpadd
IfSd(p*8+n)>0Then
.BackColor=vbRed
ElseIfSd(p*8+n)<0Then
Sd(p*8+n)=0
EndIf
EndWith
p=p-1
Loop
p=m+1
DoWhilep<=7
WithPicture1(p*8+n)
.BackColor=fc
Sd(p*8+n)=Sd(p*8+n)+tmpadd
IfSd(p*8+n)>0Then
.BackColor=vbRed
ElseIfSd(p*8+n)<0Then
Sd(p*8+n)=0
EndIf
EndWith
p=p+1
Loop
'同列变色
q=n-1
DoWhileq>=0
WithPicture1(m*8+q)
.BackColor=fc
Sd(m*8+q)=Sd(m*8+q)+tmpadd
IfSd(m*8+q)>0Then
.BackColor=vbRed
ElseIfSd(m*8+q)<0Then
Sd(m*8+q)=0
EndIf
EndWith
q=q-1
Loop
q=n+1
DoWhileq<=7
WithPicture1(m*8+q)
.BackColor=fc
Sd(m*8+q)=Sd(m*8+q)+tmpadd
IfSd(m*8+q)>0Then
.BackColor=vbRed
ElseIfSd(m*8+q)<0Then
Sd(m*8+q)=0
EndIf
EndWith
q=q+1
Loop
'左斜变色
p=m-1:
q=n+1
DoWhilep>=0Andq<=7
WithPicture1(p*8+q)
.BackColor=fc
Sd(p*8+q)=Sd(p*8+q)+tmpadd
IfSd(p*8+q)>0Then
.BackColor=vbRed
ElseIfSd(p*8+q)<0Then
Sd(p*8+q)=0
EndIf
EndWith
p=p-1:
q=q+1
Loop
p=m+1:
q=n-1
DoWhilep<=7Andq>=0
WithPicture1(p*8+q)
.BackColor=fc
Sd(p*8+q)=Sd(p*8+q)+tmpadd
IfSd(p*8+q)>0Then
.BackColor=vbRed
ElseIfSd(p*8+q)<0Then
Sd(p*8+q)=0
EndIf
EndWith
p=p+1:
q=q-1
Loop
'左斜变色
p=m-1:
q=n-1
DoWhilep>=0Andq>=0
WithPicture1(p*8+q)
.BackColor=fc
Sd(p*8+q)=Sd(p*8+q)+tmpadd
IfSd(p*8+q)>0Then
.BackColor=vbRed
ElseIfSd(p*8+q)<0Then
Sd(p*8+q)=0
EndIf
EndWith
p=p-1:
q=q-1
Loop
p=m+1:
q=n+1
DoWhilep<=7Andq<=7
WithPicture1(p*8+q)
.BackColor=fc
Sd(p*8+q)=Sd(p*8+q)+tmpadd
IfSd(p*8+q)>0Then
.BackColor=vbRed
ElseIfSd(p*8+q)<0Then
Sd(p*8+q)=0
EndIf
EndWith
p=p+1:
q=q+1
Loop
EndSub
PrivateSubReSt_Click()
DimmAsInteger
Form=0To63
Picture1(m).BackColor=vbWhite
Sd(m)=0
Next
Cnt=0
=Left,5)&"已放入"&CStr(Cnt)&"个皇后"
EndSub
、解答代码
OptionExplicit
DimCountAAsInteger
DimAnsw()AsInteger
PrivateSubForm_Load()
="八皇后求解"
=5000
=5500
DimmAsInteger,nAsInteger
WithPicture1(0)
.Left=500
.Top=500
.Width=500
.Height=500
.BackColor=vbWhite
EndWith
'初始化,载入8*8个格
Form=0To7
Forn=0To7
Ifm=0Andn=0Thenn=1
LoadPicture1(m*8+n)
WithPicture1(m*8+n)
.Left=(n+1)*500
.Top=(m+1)*500
.Width=500
.Height=500
.BackColor=vbWhite
.Visible=True
EndWith
Next
Next
EndSub
PrivateSubForm_Unload(CancelAsInteger)
Close
Kill&"\答案数据.txt"
EndSub
PrivateSubPicture1_Click(IndexAsInteger)
EndSub
PrivateSubStart_Click()
'以第0行起始,起始时皇后数Cnt为0
DimCurRowAsInteger
DimCntAsInteger
DimkAsInteger,mAsInteger,nAsInteger
DimStas(7,7)AsBoolean'表示该位是否可用
CurRow=0
Cnt=0
'初始化各格状态,均为可用
Form=0To7
Forn=0To7
Stas(m,n)=True
Next
Next
CallEp(Stas,CurRow,Cnt)
ReDimAnsw(1,7,CountA-1)
'读入答案数据
Open&"\答案数据.txt"ForInputAs#1
Fork=0ToCountA-1
Form=0To7
Forn=0To1
Input#1,Answ(n,m,k)
Next
Next
Next
MsgBox"共有"&CStr(CountA)&"组答案",vbInformation,"解题完成"
EndSub
PrivateSubEp(ByRefSts()AsBoolean,ByValSubRowAsInteger,ByValSubCntAsInteger)
DimmAsInteger,nAsInteger,kAsInteger
DimSubSts(7,7)AsBoolean
Fork=0To7
IfSts(SubRow,k)Then
IfSubCnt+1=8Then
CallOts(Sts)'已填完八个皇后,输出
CountA=CountA+1
ExitSub
EndIf
IfSubRow+1=8Then
ExitSub
EndIf
'复制状态数组
Form=0To7
Forn=0To7
SubSts(m,n)=Sts(m,n)
Next
Next
CallChgSt(SubSts,SubRow,k)'放入皇后,依皇后位置调整状态数组
CallEp(SubSts,SubRow+1,SubCnt+1)
EndIf
Next
EndSub
PrivateSubChgSt(ByRefSbsts()AsBoolean,ByValRowAsInteger,ByValColAsInteger)'由皇后位置(Row,Col),改变状态
DimmAsInteger,nAsInteger
'行变
m=Row
DoWhilem-1>=0
m=m-1
Sbsts(m,Col)=False
Loop
m=Row
DoWhilem+1<=7
m=m+1
Sbsts(m,Col)=False
Loop
'列变
n=Col
DoWhilen-1>=0
n=n-1
Sbsts(Row,n)=False
Loop
n=Col
DoWhilen+1<=7
n=n+1
Sbsts(Row,n)=False
Loop
'左上右下斜
m=Row:
n=Col
DoWhilem-1>=0Andn-1>=0
m=m-1:
n=n-1
Sbsts(m,n)=False
Loop
m=Row:
n=Col
DoWhilem+1<=7Andn+1<=7
m=m+1:
n=n+1
Sbsts(m,n)=False
Loop
'左下右上斜
m=Row:
n=Col
DoWhilem-1>=0Andn+1<=7
m=m-1:
n=n+1
Sbsts(m,n)=False
Loop
m=Row:
n=Col
DoWhilem+1<=7Andn-1>=0
m=m+1:
n=n-1
Sbsts(m,n)=False
Loop
EndSub
PrivateSubOts(ByRefGetSts()AsBoolean)
DimmAsInteger,nAsInteger
Open&"\答案数据.txt"ForAppendAs#1
Form=0To7
Forn=0To7
IfGetSts(m,n)Then
Write#1,m,n
EndIf
Next
Next
Close#1
EndSub
PrivateSubSw_Click()
DimkAsInteger,mAsInteger,nAsInteger
k=Val(InputBox("显示第几组答案?
(1~92)","选择答案号","1"))
Ifk<1Ork>92OrInt(k)<>kThen
MsgBox"组号不对!
",vbCritical,"Error"
ExitSub
EndIf
Form=0To7
Forn=0To7
Picture1(m*8+n).BackColor=vbRed
Next
Next
Forn=0To7
Picture1(Answ(0,n,k-1)*8+Answ(1,n,k-1)).BackColor=vbGreen
N
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 课程设计 报告 完整版