人工智能课程设计报告完整版.docx

上传人:b****7 文档编号:26619522 上传时间:2023-06-20 格式:DOCX 页数:23 大小:155.96KB
下载 相关 举报
人工智能课程设计报告完整版.docx_第1页
第1页 / 共23页
人工智能课程设计报告完整版.docx_第2页
第2页 / 共23页
人工智能课程设计报告完整版.docx_第3页
第3页 / 共23页
人工智能课程设计报告完整版.docx_第4页
第4页 / 共23页
人工智能课程设计报告完整版.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

人工智能课程设计报告完整版.docx

《人工智能课程设计报告完整版.docx》由会员分享,可在线阅读,更多相关《人工智能课程设计报告完整版.docx(23页珍藏版)》请在冰豆网上搜索。

人工智能课程设计报告完整版.docx

人工智能课程设计报告完整版

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1