tceic.com
简单学习网 让学习变简单
当前位置:首页 >> 学科竞赛 >>

15.人工智能---宁波效实中学 任立椋


图形计算器之人工智能
宁波效实中学 任立椋 指导老师 梁 毅
在接触 CASIO 公司的图形计算器 Classpad 330 的三个月里,我们通过研究发现 Classpad 的编程功能真的很强大, 简直就是一个可以随身携带的 Visual Basic 语言编程器, 同时,也是因为一次偶然的机会,在了解到 iphone4s 的 siri 语音控制功能给人们所带来

的 便利之后,我便有了编一个人工智能对话程序的想法。 【探究目的】 利用图形计算器的编程功能, 在机器上实现一个便利的人工智能对话程序, 从而对计算 机算法以及相关知识有一个深入的认识。 【探究过程】 说起人机智能对话,我最先想到的是这样一个简单的程序: Lbl r Inputstr x, "Hello!" If x=m Then Print n Ifend Inputstr x,"next talk? ","next talk" Goto r (其中 m 为预设问题,n 为预设回答) 通过判断输入问题是否与预设问题等价,来进行回答。有了这个基础,我便有了信心, 开始扩大这个数据库的容量,而 dt()这个子程序就是那个时期的产物。可是很快,我就遇到 ‘前往循环点 r ‘输出变量 n ‘设置循环点 r ‘输入语句,保存至 x 变量

了困难, 如果要实现日常的对话, 这个数据库将会变得无比巨大, 因为一旦有一个字符不同, 系统便会无法判别,就连大小写甚至句末的空格、句号、问号等都要加以区分,实在是很麻 烦,所以我便开发了如下的筛选化归程序段: Strlwr x,x Strlen x,xl Chrtonum x,ui,xl If ui=32 or ui=44 or ui=46 or ui=33 or ui=63 ‘将字符串 x 全部改成小写字母 ‘测量字长保存至 xl 变量 ‘ui 取得末位字符对应的机内码 ‘32 代表“空格”的机内码,44 代表“句号”的机内码,以此 类推… Then Strleft x,xl-1,x Ifend 于是乎,当你输入“how are you ”或“how are you?”或“How are you?”时, 对于机内变量 x,都是同一个问题“how are you” ,这样就有效地节约了数据库的空间。 然而随后,在使用的过程中,我又发现,数据库再大,也还是有无法识别的问题,所以,我 便想让它具有学习的功能,程序段如下: z=0 If x=m Then z=z+1 Print n Ifend ‘z 变量起标志作用 ‘x 取得左起至 xl-1 的字符串

If x=m2 …… If x=m3 …… ………… If z=0 Then lp() Ifend ‘运行学习子程序(learning part) ‘以此类推就可以扩大数据库容量

子程序段如下: q=0 If q=1 Then m1=x Inputstr n1 q=q+1 Return Ifend If q=2 Then m2=x ‘返回主程序 ‘q 变量起标志作用

Inputstr n2 q=q+1 Return Ifend If q=3 …… ……… ‘以此类推就可以扩大数据库容量

这样,它就具有了学习的功能。此时的程序已经趋于完善,可当我通过看说明书知道了 Strleft 这个函数的作用之后,顿时有了新的想法——给对话程序加上“调用其他程序“的 功能,程序段如下: 计算: Strleft x,4,xt If at=“calc” Then Strmid x,6,xy te=StrtoExp(xy) ExptoStr te,ter Print ter Ifend 绘图: If xt=“draw” Then ‘xy 取得左起第 6 个字符之后的字符串 ‘将 xy 转换为表达式并计算 ‘将 te 转换为字符串 ‘xt 取得左起第 4 个字符之前的字符串

Strmid x,6,xy DelVar f Define f(x)=StrtoExp(xy) Clrgraph Drawgraph f(x) Pause Ifend 调用其他自制程序: Strleft x,5,xtt If xtt=“solve” Then Fc() ifend 控制程序自身: If x=“bye”or “goodbye”…… Then Stop Ifend If x=“pause” …… If x=“clear text” …… ‘程序结束 ‘解一元二次方程程序 ‘画出 f(x)的函数图象 ‘删除变量 f ‘定义变量 f 为函数 f(x)

至此,程序的主体已经完成,再加上心情和体力这两项富有人性化的模块,和富有人性 化的提示语,整个程序就算是完成了, 程序段大致如下: 心情模块: a=Rand(1,100) Lbl r a=a-1 If 75<a<100 Then 显示好的回答 Elseif 25<a<=75 Then 显示一般的回答 Elseif a<=25 显示差的回答 Ifend Goto r 体力模块: c=rand(1,50) Lbl r b=rand (0, 1) c=c-1 If c<0

Then Print "I am tired... " Pause Input v,"Want to talk more? (Input 1/0)" if v≠b 束程序 Then Print "Sorry, I am really tired." Print “TALK END” Stop Ifend Ifend Goto r 【探究步骤】 1. 开机后,按 Menu 键进入主菜单,如图: ‘体力耗尽后,每次都有 50%的几率结

2. 找到 Program 模块,通过触摸笔单击的方式进入该模块,如图:

3. 单击左上角的下拉菜单,选择 Variable Manager 项,如图;

4. 单击左上角的 Edit 菜单,选择 Create Folder 项,如图:

5. 输入文件夹名称,单击 OK,如图:

6. 关闭 Variable Manager,Folder 下拉菜单中选择新建的文件夹进入,如图:

7. 单击上方左起第二个图标,输入主程序名称,单击 OK,如图:

8. 单击上方左起第一个图标,输入主程序代码如下: DispText ‘显示文本框

SetDecimal rand(1,100)?a rand(1,50)?c InputStr x,"Hello!" print "Hello!" Lbl r rand(0,1)?b StrJoin "- ",x,y print y if c≤0 then print "I am tired... " pause

‘设置为十进制

input v,"Want to talk more? (input 1/0)" if v≠b then print "Sorry,I am really tired." print " TALK END " stop ifend ifend StrLwr x,x

StrLen x,xl if xl=0 then Print "What do you want to say?" goto rt ifend ChrToNum x,ui,xl if ui=32 or ui=44 or ui=46 or ui=33 or ui=63 then strleft x,xl-1,x IfEnd StrLeft x,4,xt if xt="calc" then StrMid x,6,xy strToExp(xy)?te ExpToStr te,ter strjoin "The answer is ",ter,strr print strr goto rt ifend StrLeft x,6,xt

if xt="draw2d" then StrMid x,8,xy DelVar f define f(x)=strToExp(xy) Print "I am drawing it..." DrawGraph f(x) print "Done!" pause goto rt ifend StrLeft x,5,xtt if xtt="solve" then print "I am solving..." fc() print "Done!" ExpToStr ua,ua ExpToStr ub,ub StrJoin "x?=",ua,strr1 StrJoin "x?=",ub,strr2 Print strr1

Print strr2 goto rt ifend StrLeft x,6,xt if xt="draw3d" then StrMid x,8,xy DelVar z14 define z14(x,y)=strToExp(xy) Print "I am drawing it..." SelOn3D 14 draw3d print "Done!" pause goto rt ifend lp() dt() lp2() lbl rt a-1?a c-1?c ‘3D 绘图

inputstr x,"next talk? ","next talk" Goto r 注意 1: fc(),lp() , dt() , lp2()都为子程序,分别起学习数据库(输入) ,原始数据库,学习数 据库(输出)的功能,代码中所涉及的所有语句都可以通过手动输入的方式“依样画葫芦”得 到,也可以在上方的“Misc” 、 “I/O” 、 “Ctrl”菜单中找到。 注意 2: 计算器中赋值语句为“?”而不是“=” 。 9. 同理,新建子程序 fc,dt , lp, lp2 及辅助程序 pp,输入代码如下: dt: if x="i do not want to say anything" or x="886" or x="goodbye" or x="byebye" or x="bye" Then print "So,goodbye!" print " TALK END " Message "Goodbye!" Stop IfEnd if a≥75 and x="how are you" or x="how're you" then print "I'm fine ,thank you." 1?k

ElseIf 25≤a<75 and x="how are you" or x="how're you" Then print "I'm just so so." 1?k ElseIf a<25 and x="how are you" or x="how're you" then print "I don't feel very nice..." 1?k IfEnd if x="show your data" then print "Here's my mood:" print a print "Here's my power:" print c 1?k ifend if x=" " then print "??" 1?k ifend

‘心情模块的体现

If x="hello" or x="hi" then print "Hi!" 1?k ifend if x="what is your name" then print "My name is Casio." 1?k ifend if x="pause" then print "Ok,I have been paused." pause 1?k ifend if x="good job" or x="how kind of you" then print "Thank you." print "It is my pleasure." a+2?a 1?k

ifend if x="clear text" then print "Ok,I will clear it..." wait 1 ClrText 1?k ifend if x="clear graph" then print "Ok,I will clear it..." wait 1 ClrGraph print "Done!" 1?k ifend Return

fc: Input ua,"ax?+bx+c=0,a?" Input ub,"b?" Input uc,"c?"

ub^2-4×ua×uc?ud if ud>0 Then (-b+√(ud))/(2ua)?ux (-b-√(ud))/(2ua)?uy message "liang jie" PrintNatural ux,"x1=" PrintNatural uy,"x2=" IfEnd If ud=0 Then (-ub)/(2ua)?uz message "chong gen" PrintNatural uz,"x1=x2=" IfEnd If ud<0 then (-ub+√(ud))/(2ua)?ua (-ub-√(ud))/(2ua)?ub message "xv gen" PrintNatural ua,"x1=" PrintNatural ub,"x2="

ifend return

lp: 0?k if x=m1 then print n1 1?k ifend if x=m2 then print n2 1?k ifend if x=m3 then print n3 1?k ifend if x=m4 then

print n4 1?k ifend if x=m5 then print n5 1?k ifend if x=m6 then print n6 1?k ifend …… if x=m100 then print n100 1?k ifend Return ‘以此类推,程序便获得了 100 句的记忆力

Lp2:

if k=0 then print "I cannot understand..." print "Please teach me..." If q=1 then x?m1 inputstr n1,"Please teach me.The answer?" q+1?q Return ifend If q=2 then x?m2 inputstr n2,"Please teach me.The answer?" q+1?q Return ifend If q=3 then x?m3 inputstr n3,"Please teach me.The answer?"

q+1?q Return ifend If q=4 then x?m4 inputstr n4,"Please teach me.The answer?" q+1?q Return ifend If q=5 then x?m5 inputstr n5,"Please teach me.The answer?" q+1?q Return Ifend …… If q=100 then x?m100 inputstr n100,"Please teach me.The answer?" ‘以此类推,程序便获得了 100 句的记忆力

1?q Return ifend IfEnd return

pp: "0"?m1 "0"?m2 "0"?m3 "0"?m4 "0"?m5 …… "0"?m96 "0"?m97 "0"?m98 "0"?m99 "0"?m100 "0"?n1 "0"?n2 "0"?n3 "0"?n4 ‘以此类推

"0"?n5 …… "0"?n97 "0"?n98 "0"?n99 "0"?n100 1?q 0?a 0?b 0?c ‘以此类推

10. 运行辅助程序 pp,如图:

11. 运行主程序,就可以实现智能对话以及各种各样的调用功能了,如图:

【探究反思&总结】 1. classpad330 没有数组变量功能,这是最大的遗憾。因为如果有了数组变量,就可 以利用 For to 语句,以空格为标志,分割各个单词,过滤掉“please”之类无意义 的词汇,抓关键词回答问题,甚至还可以具有统计词频的功能,从而实现更加高级的

人工智能,达到目前市面上成熟的人机对话程序的水平。然而,终究没有数组变量, 所以只能成为泡影。 2. classpad330 不支持中文,这也是一种缺憾,所以对使用者的英语水平有一定要求 (当然要求也不高) 。不过,中文复杂的语言结构也是很难被计算器所驾驭的。 3. 对于第一次接触计算器编程的我来说, 能编出这样的程序, 确实让我自己感到很惊讶。 回想起以前那些为了寻找程序中的 bug(漏洞)而绞尽脑汁的日子,现在也觉得挺 有成就感的。感谢老师给予我们的帮助,也感谢那些一起研究计算器编程的同学,正 是通过我们之间相互的交流学习,才有了今天的思想火花。


推荐相关:

15.人工智能---宁波效实中学 任立椋

图形计算器之人工智能宁波效实中学 任立椋 指导老师 梁毅 在接触 CASIO 公司的图形计算器 Classpad 330 的三个月里,我们通过研究发现 Classpad 的编程功能真的很...

网站首页 | 网站地图
All rights reserved Powered by 简单学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com