程序设计论文范文

时间:2023-02-21 18:28:01 版权声明

程序设计论文

程序设计论文篇1

对于引用的定义可以归纳为符号的类型和符号的使用方式,在符号的类型中就符号的使用标示:标示符号&+引用名称=代码的名称;例如:printc;if&chart=if;标示出不同的定义,if就是标示符号的引用,也就是所谓的名称改变。符号的分析图为(图1)所示。在这里必须要以下的说明:&符号在标示中只是以标示名称的形式存在,不作为任何的含义;&符号在引用的过程中,对于初始的代码变化不会起到改变的作用,也不会促使代码发生任何性质上的变化;在引用过程中,对于引用前和引用后&符号使用的两个名称在作用上是相同的,也就是说名称只是一个代号,在程序使用中也是为了区分代码改变的标准,这就不能再进行代码的改名;代码的重新命名不是定义上发生任何的变化,所以在数据库当中的代码性质不会进行更新,只有在程序顺利运行后以及程序出现了调试过程后,新定义的使用&符号的代码才能被列入新的程序数据库当中。

2、程序设计中&符号的使用

C++程序中&符号出现的情况是标示为引用,对于函数的变化中会起到一定的作用,虽然不改变代码的性质,但是对于函数的定义还是会出现一定的影响。&符号改变的数学函数的参数变化,对于参数的定义域起到了重要的作用。在C语言中的函数值的变化,其中关于main函数的变化之最多,也是在程序研究中使用&符号最多、最为关键的因素之一。在对于main函数的&符号使用中,首先要弄清楚函数的最初原型,对于函数的表达意义要有初步的了解,并且能够合理的使用程序的改变方程式,对于main中的函数参数中&符号也有着不同的规范要求。在main可编辑函数中,agent是表示函数中参数的含义,&符号是表示为函数的变化地址,同时&符号也表达出函数中参数的个数,把agent最为函数参数的指导性参数值进行分析判断,统计&符号可以得到函数相关数组的即时数组信息。在操作系统中,函数中&符号的配置启动中,完全取决于操作系统的函数变化,对于操作中函数的初始变化值有着严格的要求,并在运行初始阶段进行函数的归零处理,后期在每个不同函数变换的模块当中,提取出不同数值的数据参数,来指导计算机程序的有效运行状态。通过改变符号的方式可以对于程序的效率有一定的提升。由上述例子看出,在函数中传引用和传指针的效果是相同的。这样,被调函数中的形参实际上就是主调函数中的实参或目标变量的别名,因此被调函数中所有对形参的操作实际上就是对相应的主调函数中目标变量的操作,一般传递的数据较多时,采用引用时程序的效率较高。虽然使用指针传递地址也能达到相同的效果,但因为在被调函数中还要为形参分配存储单元,而且在主调函数的实参必须使用变量的地址,这种方式必将导致程序阅读性较差,而使用引用便显得简单易懂,而且程序结构也更清晰。常引用声明方式:const类型标识符&引用名=目标变量名;在这种引用方式中,由于目标变量的值的修改不能通过引用来间接修改,因此可以很好地保护目标变量的值,使得引用有了很好的安全性,即相当于目标为const型的变量。当参数需要定义为引用型是,如果实际需要容许尽可能定义为const,这样可以保证代码的健壮性,同时也能带来其它的好处。在函数的定义过程中对于代码的变量指标在初始定义之后,在对变量的变化值进行记录,该代码指针变量便指向初始化指针变量的目标变量。通常情况下规定,具体操作过程时,对代码的指针的操作实际是对其所指向变量的间接操作。程序设计过程中使用指针可以让系统的程序的可读性降低,在操作起来也相对的困难。而由于引用本身就是目标变量的别名,编程中对引用的操作就是对目标变量的直接操作。引用其实也是一种指针,只不过其操作方式与指针不相同,指针可以一对多进行映射,而引用却只能一对一的进行,也就是一个参数对应一个代码指针数值,即&符号中的数字不能被改变,因此在对于符号的使用中,鉴于引用比指针更容易进行操控和编辑。

3、结语

C++程序当中由于不同的编程要求,现实出的具体含义就会有所不同,有些程序代码的不同是通过性质的改变,有些代码的变化是存在于不同符号发生的变化,对于符号的重要性我们在文章之中详细的介绍了,也通过举例的方式来对符号的作用和程序语言中对于符号的检测做出了详细的分析。对于使用&符号中的优劣也提出了相关的意见,对于&符号在C语言中的定义和使用方法上有这不同的介绍,如何使得符号的完整和正确性对于编程的作用提出了具体的操作方案,充分发挥出&符号在使用中的作用,尽量降低程序语言给操作人员带来的麻烦,更好的适应计算机编程,进一步完善C++程序设计中的方案设计。

程序设计论文篇2

本节课的教学对象为我校大专班学生。他们有一定的应用软件的操作基础,但对于编程语言,绝大多数都是初次接触,缺乏系统的、理性的认识,基础知识薄弱。在学习过程中,学生普遍专注力差,面对满堂灌式的理论教学很容易思想抛锚,但对于自己感兴趣的知识,却接受的很快,领悟力比较强。所以,在教学过程中应采用灵活多样的教学方法,调动学生学习积极性,帮助他们更好地理解并掌握所学知识。

二、教法学法

1、教法:本节课的教学,贯彻了启发式教学原则。通过游戏引入新课,由教师引导学生进行观察思考和归纳总结,同时充分发挥多媒体的功能,通过课件演示、具体实例的分析,使抽象的事物形象化,尽可能的通俗易懂,再配以恰当的课堂提问与练习,让学生分析、探究,更进一步的加深理解。因此本节课采用的教学方法有:游戏、引导、演示、问答、练习等。2、学法:为了充分发挥学生的主观能动作用,在上述教学方法的指导下,引导学生运用“观察”、“讨论”、“练习”、“展示”等方法,彻底掌握if语句的使用,能够自己分析问题,认真思考,耐心实践。让学生不但要学会知识,更要会学知识,会用知识。

三、教学过程

1、新课引入:采用提问的方式,复习已学习过的知识,如选择结构的概念。并通过创设情境,引入新课内容。先编写一个程序引导学生参与游戏,游戏内容是随机抽取一个学生的学号作为当天的幸运星,程序会根据输入号码的大小,给出不同的提示。在学生被激发出兴趣后立刻提出问题:为什么程序会根据输入数据的大小,显示出不同的提示信息?由此引入了新课:If语句。在这一环节中,主要应用了游戏法、问答法等教学方法。不但引入了新课,更激发了学生的学习兴趣。

2、新课讲解:课程第一部分就是本节课的重点,if语句的语法格式。为了突出重点,加深学生的印象,讲解前,首先用举例法,通过表格显示几个常用的自然语言中进行分支选择的表达方法,如:如果明天是晴天,那么出去郊游,否则延期出行。然后引导学生对比几个不同的示例仔细观察,查找出语句中的共同点和不同点,并通过课件中的动画引导他们进行思考分析,逐步归纳出这种句型的表达方式:如果条件成立,那么执行动作1,否则执行动作2。由此实现了由特定的自然语言表述,到通用的自然语言格式的过渡。再通过提问的方式引导学生说出if、then、else等单词,用英文替换中文表述,结合VB命令格式中的符号约定,让学生自己写出VB中if语句的基本表示方式,if条件表达式then语句序列1else语句序列2,实现自然语言到vb语言的过渡。但这个格式并不完整,可再次让学生思考,哪些项是必需的哪些是可以省略的。这里还是用表格对比法,让学生看到,在自然语言中表述分支选择时,比较口语化的时候,有些语句是可以省略的。对应到VB中,也是一样,这样就得出了最终的if语句语法格式,If<条件表达式>Then[<语句序列1>][Else<语句序列2>]。随后,再对一些要注意的地方进行讲解说明。到此,本节课的重点部分也讲述完毕,在这个过程中,主要采用了举例、比较、类推、提问、讲授、动画等教学方法,整个过程采用了“自然语言表述实例自然语言通用句型VB语法格式”的教学顺序,层层深入,符合特殊到一般、具体到抽象,由浅入深,由易到难的认知规律,由此实现了重点的突出。If语句的用法是本节课的难点,这里主要利用流程图作为突破点的。首先,给学生讲解如何根据语法格式绘制它的流程图,通过PPT动画,将语法构造与流程图一一对应起来,使程序的执行过程更加直观,让学生对程序代码与流程图的关系的理解更直白,更透彻。然后,通过举例法,让学生了解,如何将实际问题进行分解,转换为相应的流程图,再根据前面所学,将流程图转换为具体代码。课程进行到这里,部分学生的注意力可能已经开始分散,此时可进行游戏的第一步解密,不但再次激发起学生的兴趣,也进一步帮学生理解如何分解问题,由问题到流程图,再由流程图到程序代码。在难点的讲解中,主要采用了动画、对比、举例等教学方法,通过由语法流程图,构建了语法与流程图之间的对应关系,再根据实际问题绘制流程图,反推代码,实现难点的突破。

3、课堂练习:为了检验学生对这部分知识点的掌握情况,通过布置习题,让学生思考解答,针对学生的完成情况做出点评,纠正学生易犯的错误,达到巩固新知的目的。在这一环节中,主要采用练习法和纠错法等教学方法。

4、课后小结:与学生一起回顾本节所学内容,加深记忆和理解,完成知识的建构。并告诉学生,将在第二学时继续对游戏解密,完成整个程序的设计,让他们抱着期待的心情迎接下一节课。

四、结束语

目前许多学校都已将说课作为一项必不可少的教研活动,并成为教师素质评估工作中衡量教师教学能力与教学水平的重要指标之一。但是,不能仅重视说课,更要重视实际教学,二者相结合,才能避免纸上谈兵,真正提高教师的能力与水平。

程序设计论文篇3

上机实验课是《Java程序设计》课程教学环节中不可或缺的一部分,然而,在实际教学过程中,上机实验课应有的作用并没有被充分发挥出来。一项针对计算机专业学生的调查问卷结果显示,学生即便将理论知识学的扎实透彻,但遇到实际的编程问题时却很被动,不知道从何处下手。导致这种现象发生的原因就是高职院校对实验的重视度和关注度不高,没有给予学生充足的实验机会及指导,这样一来,学生的动手能力就相对较差。传统的教学模式下上机实验课的流程就是学生上机编程来完成教师预先布置的编程任务,教师则会呆在机房内随时解决学生在实际操作过程中提出的问题。这种实验方式没有给学生设定明确的上机目标,致使学生没有完成任务的紧迫感,甚至有的学生在教师看不到的时候肆意玩乐,这样一来,非常不利于培养学生的动手能力及解决问题的能力。由此不难看出,按照传统的教学模式来培养学生,学生不能够很好地具备解决实际问题的能力,因此,传统教学模式下的高职Java程序设计课程教学不能满足社会对高素质、高能力技术型人才的需求。

2高职Java程序设计课程教学的改革

2.1教学内容的改革

高职教育更侧重于将学生培养成能够满足工作岗位或职业需求、掌握相应技能的应用型人才,因此,改革教学内容是非常有必要的。改革教学内容就是改变传统的理论教学,引入适量的案例,将基本理论的讲授穿插于案例教学中。需要特别注意的是,选择恰当合理的案例是非常重要的,它的质量能够直接影响到最终的教学效果。因此,教师要根据学生认知的特点选择具有适用性及代表性的案例,而且这些被选择的案例必须能够包含Java程序设计中的大部分知识,这些案例既区别于课堂上的举例,但又和它们具有一定的联系。为了能够很好地展开案例教学,教师在课前需要对案例教学进行周密详细的安排,主要包括四个方面,它们分别是发放案例素材、组织案例实施、区分案例分析中的理论分析以及操作分析、安排处理案例教学中涉及到的外延知识。案例教学能够在课堂上很好的结合理论与实践,促进学生综合能力的提升。学生带着问题去分析案例,在这个过程中教师对涉及到的相关理论知识进行讲授,这种方式能够帮助学生更好地理解知识。对案例进行分析的过程不仅能够使学生拓宽知识面,掌握分析问题的技巧,还能够帮助学生将理论运用于实践,更好地消化吸收所学知识。因此,相比传统的理论教学,案例教学这种教学方法更够满足当今社会对应用型人才的需求。

2.2教学方法的改革

当今社会团队协作能力是非常重要的,因此,改革教学方法最主要的一个途径就是实行小组教学。所谓小组教学就是很据自愿或者协商的原则,将全班学生平均划分成几个小组,由小组成员共同推选出一个成员作为组长。在课堂上,首先教师需要在对典型案例进行讲解的过程中穿插对Java语言的介绍,帮助学生更好地理解进而接受理论知识,并且深入了解Java语言面向对象的特性。然后教师通过为每个学习小组安排编程的任务来使学生对案例进行分析,并且分析讨论后每个小组都要确定出最终的解决方案,由教师来点评这些方案。为了能够使学生高效率的完成规定任务,教师要在分析讨论过程中对学生提出相应的技术要求及纪律要求,并设定一个恰当的完成期限。这种教学模式充分体现了学生学习的自主性,彰显了学生课堂的主体地位以及突出了教师协助引导的作用。小组教学的教学模式可以使学生进行不同的思想交流,擦出智慧的火花,正如萧伯纳所说“如果我有一个苹果,你有一个苹果,互相交换,还是你有一个苹果,我有一个苹果。但是我有一种想法,你有一种想法,交换一下,双方就都有了两种思想。”这就说明了通过小组交流,学生思维会更加活跃,从而产生更优的思想。通过小组教学,不仅可以提升学生对理论知识的认知度,培养团队合作的能力,还能够提升学生分析、处理、解决问题的能力。此外,在小组教学的过程中,教师能够迅速接收到来源于学生的反馈信息,比如反馈分析案例过程中遇到的问题等信息,通过这些反馈信息,教师能够及时的采取相应措施来解决问题,从而实现教学相长。

2.3考核方式的改革

对教学成果进行考核对无论是教还是学都能做出恰当的评价,目前我国高职院校中通常采取考核这一手段来对教学的效果进行检验。在传统的教学模式下,通常采取卷面考试来进行考核,而且最终结果往往是由一次考试的成绩来评定的,也就是说,无论学生平日里表现多好,但如果在作为最终考核的那次考试中发挥失常,那么就会在一定程度上否认这个学生的学习能力。而且这种考核方式并不能够对学生的能力、知识以及技能做到真实的反映。由此看来,为了能够对学生的学习做出恰当合理的评价,改革考核方式是非常有必要的。这就要求高职院校要制定一个科学的评价标准,重点突出对学生知识应用能力的培养。在对高职Java程序设计课程学习进行考核时,可以通过两个方面来展开考核工作,相应地,学生总成绩也由两部分组成,一部分是综合能力考核成绩,另一部分是平时课堂表现成绩。具体来讲,一方面,通过案例教学,教师要求每个小组在对案例分析完成之后,做出案例的分析报告,在此基础上,综合小组成员的意见和建议,为假定的任意一个应用领域或虚拟企业设计一个信息管理系统,然后模拟其运行环境,最后进行编码或者程序设计。总之,就是给予学生一个展示自我知识、技能、操作等综合能力的机会,这种考核方式能够使学生更加牢固、系统的掌握所学的理论知识,这方面的考核成绩占据较大的比重,在总成绩中通常占据60%的比例。另一方面,也就是占据总成绩40%的平时成绩,具体来讲,就是在平时教学过程中,教师要密切关注课堂小组讨论中每位学生的表现,并且加以记录,给出相应的分数。此外,在本门学科结束学习后,教师需要组织每个小组进行小组内成员间的彼此评价,相互打分。最后,教师通过对这两小部分的成绩进行综合的评定,给出每个学生最终的平时课堂表现成绩。

3总结

随着社会的不断发展与进步,社会对应用型人才的需求越来越大,因此,高等职业技术教育必须要以“职业能力”作为人才培养的目标。Java程序设计这门课程要求学生具备较高的理论学习能力及实践能力,通过改革教学模式,引入案例教学以及分组教学,不仅能够激发学生的学习兴趣,还能够促使学生综合能力的提升,满足社会的人才需求,为社会培养出大批高素质的应用型人才。

程序设计论文篇4

教学中立足具体实例,渗透基本概念;分散难点,逐步渗透;设置问题情境,分析解决问题的方法。教学实例按照学生的认知规律,遵循先易后难、先具体后抽象的原则,从基础层次、应用层次、提高层次三个阶段进行实例教学。基础层次的实例应该把对象的用法渗透到一个个程序实例中,由浅入深逐渐介绍,让学生在编写程序的过程中总结对象的用法。应用层次的实例重点介绍对象的什么属性、方法和事件可以解决什么实际问题。如对象PasswordChar的属性,解决口令保密的问题;对象Alignment的属性,解决界面信息显示的对齐方式;程序运行目录的获取,解决程序文件处理采用绝对路径的弊病;程序同时运行的限制,解决同一程序同机同时运行的资源冲突;对象Change事件(对象内容发生改变触发该事件),解决程序设计的操作安全性、数据完整性验证、数据关连计算的自动同步等问题。。。。。。通过实例的分析、讲解,让学生观看、模仿、理解,启发学生程序设计思路、体悟这些知识点。提高层次的实例从选择对象的角度,分析、讲解、比较解决什么实际问题,不同对象的优点和缺点。在程序流程控制中,实例不但要体现不同流程控制的用途,更要分析流程控制分支的设计对程序效率的影响;在列表框、菜单、工具栏的实例,可以分析应用程序解决操作权限的问题;在ActiveX控件方面,实例重点分析如何利用树状控件、电子表格控件、图象控件,利用控件的MOVE方法,把隐藏的编辑对象移动到相应的电子表格的单元格,通过对象的Visable属性使其可见,并接收用户的编辑输入,设计出界面简洁、操作方便,具有视觉美感的程序界面;数组和数字字典的应用区别,数字字典解决数据量大的查询速度问题;使用数据环境(DataEnvironment)对象和SQLServer的存储过程(接受输入参数并以输出参数的形式将多个值返回至调用过程或批处理;包含执行数据库操作;的编程语句;向调用过程或批处理返回状态值,以表明成功或失败,存储过程优势有允许模块化程序设计;减少网络流量;执行更快)进行数据库应用系统开发,使数据库应用系统的开发更加直观、简洁、高效,不但提高程序运行速度,同时增强程序的可读性、可理解性和可维护性。Windows操作系统同时是一个很大的服务中心,调用其中的各种服务,可以帮应用程序达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序,所以便称之为ApplicationProgrammingInterface,简称API函数。API说到底就是一系列的底层函数,是系统提供给用户用于进入操作系统核心,进行高级编程的途径。通过在VisualBasic应用程序中声明外部过程就能够访问WindowsAPI函数(以及其它的外部DLLs)。在声明了过程之后,调用它的方法与调用VisualBasic自己的过程相同。所以教学实例必不可少的要体现出调用API的步骤、使用API应注意的参数类型、数据类型和数据结构、声明使用范围等,以及当编程算法较复杂、或用标准的语句难以实现功能设计时,如何通过查询API函数功能,合理选择API函数解决问题。

下面以窗体及基本控件为例,与大家共同探讨这种教学方法教学内容:单选框和复选按钮、列表框、命令按钮。目的要求:掌握控件的常用属性(Name、Caption、Value、BackColor、ForeColor、FontName、FontSize、ListCount、ListIndex、List、Selected);方法(AddItem、RemoveItem、Clear);事件(Click);控件数组;IIF()函数、Choose()函数的用法;流程控制用法的复习和提高。教学重点与难点:列表框选项删除,循环流程控制的Step用法。实例设计:准备好实例设计思路,设计过程在教学中边设计边讲解。教学过程:第一步、新建一个窗体,设置一些常用的影响窗体外观(BackColor背景颜色)的属性,运行程序,讲解让学生理解这些属性。第二步、往窗体添加一个单选框,设置Name属性为OPFontName(讲解让学生理解该属性),拷贝该控件,粘贴该控件(讲解让学生理解创建控件数组的方法)。这两个控件将用来控制字体,OPFontName(0)的Caption设置为宋体、OPFontName(1)的Caption设置为黑体。重复第二步操作新增两个单选框(OPFontSize),用来控制字号,OPFontSize(0)的Caption设置为12号字、OPFontSize(1)的Caption设置为14号字。这时可以设置控件的BackColor背景颜色和ForeColor前景颜色,FontName字体、FontSize字号等改变位置、外观的属性,运行程序让学生理解这些属性的作用。点击单选框(讲解让学生理解单选框每次只能选取一个)。第三步、往窗体添加一个框架,剪切窗体中OPFontName(0)、OPFontName(1),把它们粘贴到框架中,这样OPFontName与OPFontSize就相互独立。第四步、往窗体添加两个复选框。Check1的Caption设置为加粗、Check2的Caption设置为斜体第五步、往窗体添加两个命令按钮和列表框。设置列表框的Style属性为复选,设置列表框的List选项为"项目1"、"项目2"。。。"项目9"(讲解让学生理解设置时往列表框添加选项的方法),设置控件的对齐。第六步、运行讲解:(1)分析代码,讲解采用控件数组的作用在于复用过程。(2)点击单选框“12号字”、“14号字”、“宋体”、“黑体”,讲解让学生理解单选框每次只能选取一个。如果需要多选,应该用Frame框架或图片框将单选框分组进行。(3)点击复选框,讲解让学生理解复选框可以多选。(4)选择列表框选项,点击命令按钮,讲解让学生理解点击事件(Click)的触发时机;运行时列表框添加选项的方法(AddItem)、删除一个选项的方法(RemoveItem)、删除所有选项的方法(Clear)、检测选项选中状态的属性(Selected)、选项内容的属性(List)、选项数量的属性(ListCount)、列表框其他常用属性(5)注释掉语句Fori=List1.ListCount-1To0Step–1,启用语句Fori=0ToList1.ListCount–1,运行程序,选择列表框选项,点击命令按钮,程序提示找不到列表框选项的错误。讲解让学生理解列表框ListCount、ListIndex属性的动态改变,采用递增的循环流程控制,造成当删除一个选项找不到列表框选项的错误,采用递减的循环流程控制可以解决问题。

2课程实验

要求学生以VB为开发语言、以SQL为数据库,独立完成一个功能较简单的程序设计。良好的编程风格有助增强程序的可读性、可理解性和可维护性,保证程序的质量。查阅学生的课程实验时,不但要掌握学生对知识点、对象的属性、方法和事件的理解和应用情况,同时要分析学生的编程算法、编程风格,帮助学生总结其编程风格和编程算法的优点和缺点,提高学生的编程能力和良好的编程风格。根据学生的差异,做到有的放矢,充分调动每个学生的学习积极性。激发学生的学习兴趣。

3交流答疑

以课程实验实例为交流对象,模拟毕业答辩的方式与学生进行交流,帮助学生归纳小结,理解知识、融会贯通,同时讲解一些概念性题目,以帮助学生顺利通过期末考试。鼓励优秀的学生帮助其他学生,这不但减轻教师的负担,也培养学生团结合作的精神。总结以上是个人在学习和教授VB这门课程中的一点心得,请各位同行指正、交流。

程序设计论文篇5

关键词:VB;程序设计;改革;实践

Abstract:VisualBasicprogrammingasapublicnon-professionalcomputer-basedlessons,theoryandpracticestrong,andteachingdifficult.Thearticleonhowtoimprovethequalityofteachingandtrainingstudentsinanintegratedapplicationdevelopmentcapabilitiesandexplorereformsweremade.

Keywords:VB;programming;reform;practice

1引言

VisualBasic(下面简称VB)程序设计是我校非计算机专业学生的必修课,然而VB语言枯燥、难以理解,学生缺乏相应的知识背景,导致学生对这门课有恐惧心理,缺乏兴趣。这就要求我们教师在教学中分析、摸索出一些较为行之有效的教学方法,才有可能培养学生程序设计能力,掌握一门技能,激发学生对程序设计的兴趣。笔者在近几年的教学实践中进行了如下改革探索,取得了良好的教学效果。

2教学改革与实施

2.1对课本原有知识进行整合,激发学生的学习兴趣

大部分的教材总是先讲VB语言的基本语法,然后再讲VB中对象的使用。但在讲授时不宜将两者分开,要把VB面向对象的程序设计方法,事件驱动的编程机制贯穿于整个教学过程中。VB中的对象主要用于构建界面,而具体程序功能的实现则要编写代码行,因此任何一个完整的应用程序都不可能只用对象或只用语法。这两块内容可进行穿插讲解。这样就避免了让学生在毫无知识背景的情况下去理解抽象难懂的概念,挫伤他们编程的积极性。在教学过程中,我始终坚持以学生已有的知识程度为基础,打破原有的以课本知识的逻辑结构为顺序组织课堂教学的模式,先不讲基本概念,改用从简单的实例人手,通过让学生观看、模仿,在实际操作中去探究和领悟这些概念,并适时地加以归纳总结,让学生在轻松愉快的气氛中接受新知识。比如,在讲到循环结构中DO——LOOP语句和FOR——NEXT语句的用法时,我用DO——LOOP语句的4种形式和FOR——NEXT语句实现求解N!的过程,让学生去观察、领悟它们的异同。

2.2教学方法多样化

笔者在教学实践中,除了采用传统的教学方法如:提问法、小组讨论法外,主要采用以下教学方法:

1)错例分析法

学生对变量、类型、运算符、表达式这些基本概念和语言规则的掌握需要一个过程,对算法和数据结构的知识需要不断积累。学习过程中,能听懂老师授课的内容,但自己编制的程序往往错误百出。课堂上,我经常将容易出错的概念以反例形式展示给学生,让他们找错误,通过运行。比如错误使用逻辑运算符。

假设a、b和c是三个变量。如果已知a<c,要判断b的值是否在a与c之间,可以使用以下表达式:a<bAndb<c

不能写成:a<b<c。

很多学生会错误延用数学上的概念,写成后一种形式。

例OptionExplicit

PrivateSubCommand1_Click()

DimaAsInteger,bAsInteger,cAsInteger

a=-3:b=-2:c=-1

Printa<bAndb<c’显示True

Printa<b<c’显示False

EndSub

为什么a<b<c会得False?因为,VB在计算这个表达式时,先计算“a<b”部分,得True;再计算“True<c”,并将True转换为一1,-1<-1?最终得False。

通过诸如此类的反例教学,使学生豁然开朗,印象深刻。

2)零散实例和核心实例结合

零散实例教学法,对每个知识点的运用和理解是非常行之有效的,但对前后知识的贯穿缺乏说服力。笔者在教学改革实践中体会到,除经典的零散实例外,将一个规模较大的、典型的、有实用价值的、学生感兴趣的核心实例贯穿于教学全过程,对提高学生的编程能力非常帮助。所谓核心实例是指,实例从小到大、随章节的展开而逐步成长,呈现为逐步进化的多个版本。比如引入一个贯串全书的问题:设计一个“图书管理系统”。首先,用最基本的概念和最简单的结构,给出该系统的第一个(也是最简单的)版本,以后的每一次课,都对该系统提出新的功能和结构上的要求,并用本次课介绍的新概念和新方法对它进行功能上的扩充和结构上的改进。每次得到该系统的一个增强的新版本。为达到设计目标,学生随着教学的进程,可以积极投入到对实例系统的调试、改进的实践中,逐渐掌握了所学的基本知识,同时也提高了编程能力。

2.3重视实践教学,培养学生综合应用程序开发能力

VB是一门实践性很强的课程,如果只纸上谈兵,不上机练习,是不可能真正掌握VB程序开发的。实践教学主要注意抓住以下几点:

(1)模仿阶段,对课堂核心实例系统的调试、改进。核心实例的每次增强版是全面反映教学内容的,学生通过模仿、知识再现达到在实践中领悟知识,开拓编程思路。

(2)分层次阶段,在教学过程实施的开始,和核心实例同步,我就给出了几个类似核心实例的课程设计内容,供学生选择。对核心实例的调试比较成功的,可以同步实施自己所学的课程设计内容,达到培养学生分析问题和解决问题的能力。对掌握核心实例有困难的学生,针对教学内容重新布置实验,强化知识巩固。课程设计内容课后上机完成。

要掌握上面两个阶段的具体情况,教师应亲自指导,与学生一起上机实验,随时监控学生实验过程。对学生提出的问题及时予以指导,而发现学生常犯的共性错误,可在理论课上进行点评。

2.4培养学生使用标准编码,养成良好编程习惯

在程序设计过程中,使用标准编码可以避免一些不必要的错误。笔者在授课过程当中使用标准编码的实例,在讲解实例过程中对学生进行适当地引导,让学生养成一个良好的编程习惯。

程序书写规范是非常重要问题,不仅书写格式应该结构层次分明,而且程序里面应添加起码的注释。不按照标准书写程序会增加别人查看程序的难度,同时也不利于自己以后上机调试修改。强调学生避免使用VisualBasic中的隐式操作,养成显式编码的习惯。比如永远使用OptionExplicit,严格执行变量先定义后使用的原则。避免使用缺省属性,明确指出是在引用对象还是在引用对象属性。

3结束语

一门课程的教学是一个复杂的系统工程,笔者将以上一些改革和探索用在课堂教学和实践教学中,取得了一些效果,但教学有法,教无定法,只要教学得法。在教学实践中,合理运用多种教学方法,灵活地、创造性地掌握教学过程,激发学生的兴趣,培养学生的创造性思维和综合应用程序开发能力。

参考文献

[1]王栋.VisualBasic程序设计实用教程(第3版).北京:清华大学出版社2007

[2]袁锋谈.《VB程序设计》教学方法改革的五个转变.中国成人教育2004(1)

程序设计论文篇6

(1)误差方程式的组成

控制网中的观测值一般有边长、方向(角度观测值因定权问题一般采用方向值进行平差)、方位角,可以发现,这些观测值的误差方程式的非零项一般最多为4个,即在两个点均为待定点的情况下。消除定向角后的“和误差方程”的非零系数为2n+2个(n为测站方向观测个数)。若按照误差方程的格式,其系数矩阵为n行和2*dd列(dd为网中未知点个数),这样,系数矩阵将会有很多零元素存在,浪费了大量的存储空间并影响计算效率,所以,误差方程系数矩阵应采用压缩格式进行存储[3]。可采用以下方法:A(m,n)-A(m,9)其中,m为观测值个数,n为未知点个数的两倍。改进后的A阵格式为:AI=(编号1,系数1,编号2,系数2,…,编号4,系数4,常数项)共9列。这样,就得到了改进后的误差方程系数和权阵。

(2)平差值计算与精度评定

该程序是平面控制网平差计算的主程序,通过迭代计算,达到获得精确平差结果的目的。该程序调用了误差方程与法方程的组成、求逆、坐标改正数计算、观测值平差值计算以及精度评定等函数3]。

(3)点位误差椭圆和相对点位误差椭圆

误差椭圆表示了网中点或选点之间的分布情况。在测量工作中,常用误差椭圆对布网方案作精度分析。绘制误差椭圆只需三个数据:椭圆的长半轴a、短半轴b和主轴方向。

2平面控制网近似坐标推算

讨论平面控制网平差计算过程中重要的一环———近似坐标的推算,介绍算法及简单介绍一下整个近似坐标计算的程序框架。

(1)计算参数近似值的必要性

对间接平差(又称参数平差)而言,一般都需要计算参数的近似值。但并不是说在任何情况下都必须计算参数的近似值,倘若观测值与所设参数之间建立的是一种线形的函数关系,则不给出参数近似值也可平差,只是给出参数近似值后,在列误差方程或是解算法方程的过程中会使得计算变得更加简便和方便[4]。当观测值和参数之间建立的关系为线形函数时,平差前可以不给参数的近似值。但对于测角网、边角网和侧边网等平面控制网,观测的是方向值、角度值或是边长,选取的参数又通常为待定点的坐标,观测值与参数之间的建立的关系均为非线性函数,如果不给出近似坐标,误差方程就无法列出,因为误差方程的系数均由近似坐标求得,故计算近似坐标对平面控制网而言是十分重要的一步。由于实际观测数据的个数多于必要观测的个数,近似值中还含有误差,因此还需近一步对观测值进行平差,以对近似值加以改正,得到最或然坐标值[5]。

(2)计算近似坐标程序的总体框架及具体算法

根据计算待定点坐标常用的方法,编写了相应的近似坐标推算程序。该程序的目的就是让用户尽量不提供不需提供的信息,尽可能自动完成所有待定点近似坐标的计算。本节先从总体上介绍整个程序的思路,然后针对几种常见的观测条件介绍极坐标的计算方法,并详细说明该方法在程序中实现的思路。程序的总体框架如图1所示,框架中用到的变量和函数说明如下:Xyknow———已知点点号数组;xyun-know———未知点点号数组;Point———总点号数组;ed———已知点个数;Dd———未知点个数;length———MATLAB内部函数,对数组求长度。该程序总体上采用循环结构,直到所有未知点的近似坐标计算完毕,程序终止循环。如果所有方法都采用过,但仍有部分点的近似坐标无法计算出,程序亦会自动中止,退出程序,以避免死循环的产生,程序中考虑的方法是极坐标法。基本思路是:最外层采用while循环,当未知点点号数组长度大于零,即还存在未知点未解算出来时循环运行,里层在采用FOR循环逐一对每一个未知点进行搜索,搜索到某一个未知点满足某一种条件后即时解算出来,接着马上退出for循环并对已知点点号数组和未知点点号数组进行更新,再由while判断未知点点号数组的长度,进入对未知点点号数组的下一轮for循环,如此反复,直到未知点点号数组为空。

(3)极坐标计算

这是所有方法中最简单的一种,适合于求附和导线、闭合导线、支导线及边角网。它要求具备两个已知点或是一个点的坐标和一个已知方位角且改点是方位角的起点。本程序采用的是极坐标的方法进行编写,其基本思路是:如果存在已知方位角,首先判断该方位角的起点是否是已知点A,重点是否是所求的待定点P,如果是,搜索边长AP即可按极坐标公式计算坐标;若没有一直方位角或其终点不是P,则搜索与P有方向观测的已知点A,再由A搜索到另一个已知点B,且A和B有方向观测值,于是可求出AP的方位角,再搜索AP的边长观测值,由极坐标公式即可计算P的坐标。点的坐标按此方法求出后,设置way的值为1,P点就变成了已知点。其他待定点只要满足此类条件,便可由这种方法求出。其程序框图见图2。

3水准网平差程序设计

水准网平差程序设计一共有三种方法,一维压缩存储法方程平差程序、上三角存储法方程平差程序、利用MATLAB矩阵运算平差程序以及利用平差结果的相互转换变换基准的程序[6]。(1)观测数据的组织与近似高程计算数据文件的组织下面给出一个水准网输入数据文件的例子:336(已知点个数、未知点个数、观测值个数)101102103104105106(点号)34.78835.25937.825(已知点高程)1041011.6524.5(起点点号、终点点号、高差观测值、距离观测值)其中编号数组未知点在前,已知点在后。(2)数据读入与近似高程计算程序程序中包含了近似高程计算,即进行循环,程序中设置了一个变量ie,每计算出一个点的高程,其值加1,当其值等于未知点的个数时停止循环。

4结论(程序界面)

运行函数,生成主界面如图3所示,主界面上有两个单选按钮,分别表示水准网和平面网平差,选定其中一个,进入水准网解算界面或平面网解算界面。点击“退出”按钮,结束程序。本文介绍了MATLAB程序设计基础、数据文件的输入与输出、二维绘图以及图形用户界面设计等。同时设计了平面控制网平差计算,平面控制网近似坐标推算,水准网平差程序设计三项界面。,希望更加方便的使用。

程序设计论文篇7

DSP芯片是专门为实现各种数字信号处理算法而设计的、具有特殊结构的微处理器,其卓越的性能、不断上升的性价比、日渐完善的开发方式使它的应用越来越广泛。将计算机网络技术引入以DSP为核心的嵌入式系统,使其成为数字化、网络化相结合,集通信、计算机和视听功能于一体的电子产品,必须大大提升DSP系统的应用价值和市场前景。将DSP技术与网络技术相结合,必须解决两个关键问题:一是实现DSP与网卡的硬件接口技术,二是基于DSP的网络通信程序设计。DSP与网卡的硬件接口技术参考文献[1]有比较详尽的论述,以下主要讨论基于DSP的网络通信程序设计。

1通信协议的制定

协议是用来管理通信的法规,是网络系统功能实现的基础。由于DSP可以实现对网卡的直接操作,对应于OSI网络模型,网卡包含了物理层和数据链路层的全部内容,因此,规定了数据链路层上数据帧封装格式,就可以为基于DSP的局域网络中任意站点之间的通信提供具体规范。因为以太网是当今最受欢迎的局域网之一,在以太网中,网卡用于实现802.3规程,其典型代表是Novell公司的NE2000和3COM公司的3C503等网卡,所以研究工作中的具体试验平台是以DSP为核心构成的以太局域网,主要用于语音的实时通信,所使用的网卡为Novell公司的NE2000网卡。NE2000网卡的基本组成请见参考文献[2],其核心器件是网络接口控制器(NIC)DP8390。该器件有三部分功能:第一是IEEE802.3MAC(媒体访问控制)子层协议逻辑,实现数据帧的封装和解封,CSMA/CA(带碰撞检测功能的载波侦听多址接入)协议以及CRC校验等功能;第二是寄存器堆,用户对NE2000网卡通信过程的控制主要通过对这些寄存器堆中各种命令寄存器编程实现;第三是对网卡上缓冲RAM的读写控制逻辑。DP8390发送和接收采用标准的IEEE802.3帧格式。IEEE802.3参考了以太网的协议和技术规范,但对数据包的基本结构进行了修改,主要是类型字段变成了长度字段。所以,以DSP为核心的局域网内通信数据包基本格式如图1所示。

DSP读出数据包和打包从目的地址开始。目的地址用来指明一个数据帧在网络中被传送的目的节点地址。NE2000支持3种目的地址:单地址、组地址及广播地址。单地址表示只有1个节点可以接收该帧信息;组地址表示最多可以有64个字节接收同一帧信息;而广播地址则表示它可以被同一网络中的所有节接收。源地址是发送帧节点的物理地址,它只能是单地址。目的地址和源地址指网卡的硬件地址,又称物理地址。

在源地址之后的2个字节表示该帧的数据长度,只表示数据部分的长度,由用户自己填入。数据字段由46~1500字节组成。大于1500字节的数据应分为多个帧来发送;小于46字节时,必须填充至46字节。原因有两个:一是保证从目的地址字段到帧校验字段长度为64字节的最短帧长,以便区分信道中的有效帧和无用信息;二是为了防止一个站发送短帧时,在第一个比特尚未到达总线的最远端时就完成帧发送,因而在可能发生碰撞时检测不到冲突信号。NE2000对接收到的从目的地址字段后小于64字节的帧均认为是“碎片”,并予以删除。在数据字段,根据系统的具体功能要求,用户可以预留出若干个字节以规定相应的协议,以便通信双方依据这些字节中包含的信息实现不同的功能。

2基于DSP的网络通信程序设计

如果基于网络操作系统,用户可以利用一些软件对网络操作系统的支持,很容易地编写出优秀的网络通信程序,但这些程序必须依附于网络操作系统。而在DSP环境下,必须深入了解网络接口控制器(NIC)的工作原理[2],通过对网络直接编程,实现局域网内任意站点之间的通信而完全抛开网络操作系统。

DSP对网卡的通信过程控制就是DSP对DP8390中各种寄存器进行编程控制,完成数据分组的正确发送和接收。DP8390的所有内部寄存器都是8位,映像到4个页面。每个页面有16个可供读写的寄存器地址(RA=00H~0fH)。页面的选择由命令寄存器CA控制。第0页寄存器用于收发过程,第1页寄存器主要用于DP8390的初始化,第2页寄存器则用于环路诊断。DSP对寄存器的操作是将寄存器作为DSP的端口设备,其实际物理端口地址(PPA)为网卡基本I/O端口地址(BIOA)与寄存器地址(RA)之和(即PPA=BIOA+RA)。应注意的是,PPA与寄存器间并不存在一一对应关系,对PPA的读操作与写操作并不一定是对同一寄存器进行的,这种情况在第0页尤其明显。用户数据分组在DSP和网卡交互是通过网卡的数据端口实现的,既可以用DMA方式也可以用PIO方式读入数据分组或将数据分组送至网卡RAM缓冲区。在本系统中,DSP采用DMA方式对网卡进行数据读写。网卡的数据端口地址(NDPA)为网卡基本I/O地址(BIOA)加偏移地址10H(即NDPA=BIOA+10H)。

网卡通信过程控制可分为网卡初始化、接收控制和发送控制。下面分别予以讨论。

2.1网卡初始化

网卡初始化的主要任务是设置所需的寄存器状态,确定发送和接收条件,并对网卡缓冲区RAM进行划分,建立接收和发送缓冲环。具体过程请参阅参考文献[2]。需要说明的是,每一块网卡被赋予一个物理地址,以便通信站点的标识。这个物理地址存在网卡的PROM(存储地址为0000~0005H)六个单元中,在网卡初始化时,通过远程DMA读入DSP内存中,并送入网卡物理地址寄存器。在一步的意义在于:一方面,如果能正确读出网卡的物理地址,则说明网卡硬件基本没有问题,网卡的上电复位和DSP对网卡的初始化顺利通过;另一方面,这个物理地址可以用于DSP网络系统中的点名、包的过滤丢弃等服务,也就是说,在链路层根据数据帧携带的源地址和目的地址确定数据报从哪里来,是否接收或丢弃。网卡初始化时另一个重要的工作就是接收缓冲环的设置,为了有效利用缓冲区,NIC将接收缓冲区RAM构成环形缓冲结构,如图2所示。

接收缓冲区RAM分成多个256字节的缓冲区,N个(N最大为256)这样的缓冲区通过指针控制链接成一条逻辑上的缓冲环。缓冲环的开始页面地址存入PSTART寄存器,环页面结束地址存入PSTOP寄存器。PSTART和PSTOP确定了接收缓冲环的大小和边界。为便于缓冲环读写操作,还需要2个指针:当前页面指针CURR和边界指针BNRY。CURR确定下一包放在何处,起着缓冲环写页面指针作用;BNRY指向未经DSP取走处理最早到达的数据包起始页面,新接收的数据包不可将其覆盖,起着缓冲环读页面指针的作用。也就是说,CURR可以告诉用户网卡接收的数据分组当前放到了什么位置,而BNRY则用于确定DSP读缓冲环到了什么地方。由于接收缓冲区为环形结构,BNRY和CURR相等时,环缓冲区可能满也可能空。为了使NIC能辨别这两种状态,规定当BNRY等于CURR时,才认为环缓冲区满;当缓冲区空时,CURR比BNRY指针值大1。因此,初始化时设置:BNRY=PSTART,CURR=PSTART+1。这时读写指针不一致,为了保证正确的读写操作,引入一软件指针NEXTPK指示下一包起始页面。显然,初始化时NEXTPK=CURR。这时,缓冲环的读指针对NEXTPK,而BNRY只是存储分组缓冲区的起始页面边界指示,其值为NEXTPK-1。

2.2接收控制过程

DSP完成对DP8390的初始化后,网卡就处于接收状态,一旦收到分组,就自动执行本地DMA,将NIC中FIFO数据送入接收缓冲环,然后向主机申请“数据分组接收到”中断请求。DSP如果响应中断,则启动网卡远程DMA读,将网卡缓冲区中的数据分组读入学生机存储区,然后对接收缓冲环CURR、NEXTPK、BNRY指针内容进行修改,以便网卡能从网上正确接收后续分组。DSP响应网卡接收中断后,接收控制过程如下:

①设置远程DMA的起始地址;RSAR0=00H,RSAR1=Nextpk。

②设置远程DMA操作的字节数,这个长度在46~1500字节范围内根据具体要求自己确定。

③0AH送命令寄存器CR,启动远程DMA读。

④从网卡数据端口依序读入数据分组,注意,最先读入的4字节非数据分组内容,第1字节为接收状态,第2字节为下一包页地址指针,3与4字节为接收字节数。第2字节内容应该送入Nextpk,其它字节根据用户要求处理。

⑤修改边界指针BNRY=Nextpk-1。

⑥清除远程DMA字节数寄存器RBCR0和RBCR1。

2.3发送控制过程

DSP先执行远程DMA写操作,将内存中的数据分组传至网卡发送缓冲区,然后启动发送命令进行数据分组发送。发送控制过程如下:

①设置远程DMA的起始地址为网卡发送缓冲区起始地址;

②设置远程DMA操作的字节数;

③12H送命令寄存器CR,启动远程DMA写;

④依序送出数据分组至网卡发送缓冲区;

⑤清除远程DMA字节数寄存器;

⑥设置发送字节数寄存器TBCR0和TBCR1;

⑦12H送命令寄存器CR,启动数据分组发送。

3发送方发送频率的控制

发送方发送频率的正确控制主要保护两点:一是有一个最小发送时间间隔,否则会因为接收方不能及时接收而导致系统瘫痪;二是发送频率能够足具体的功能实现要求。譬如在语音的实时通信中,发送频率就取决于声卡的采样频率。在8kHz采样频率时,声卡每秒钟采样8000字节,采用1024字节需用时128ms,如果通信协议规定发送1次传送1024字节有效数据,则必须每128ms发送一次才能保证缓冲区有新数据待发送,也才能保证接收方有新数据播放。128ms是一个理论计算数值,在实际的操作中采样速度和发送频率之间总是不能完全匹配,而存放数据的缓冲区大小是有限的,如果没有良好的控制技巧来实现正确发送,就会造成声音抖动和延时。解决的办法是双缓冲技术和双指针控制,并且根据采样速度和发送频率之间的匹配情况送入不同的发送通信进行处理后发送。正确发送的含义有两方面,一是每次发送的都是新数据,二是能满足接收方总在播放新数据的需求。

4接收方防止数据包的丢失

由于DSP通过中断请求判断是否有数据分组到来,如果中断繁忙而两个数据包到来时间相差非常短,DSP有可能只响应一次中断,从而导致丢包的发生。分析网卡接收数据过程,当网卡收到数据分组时,首先执行本地DMA,将NIC中FIFO数据送入接收缓冲环,并将本地DMA操作的起始地址存放在当前页寄存器(CURR)和当前本地DMA寄存器(CLDA0、CLDA1)中,DSP从网卡接收缓冲环读出数据到存储器则称远程DMA操作,用软件指针Nextpk来指示远程DMA的起始页面。因此通过比较网卡本地DMA和远程DMA的当前地址,即在中断服务子程序中比较CURR和Nextpk指针,或比较CLDA0、CLDA1和Nextpk指针,就可以保证当前数据分组放到了哪里就读出到哪里,从而防止丢包的发生。

5结论

程序设计论文篇8

关键词遗传算法;TSP;交叉算子

1引言

遗传算法是模拟生物在自然环境中的遗传和进化过程而形成的一种自适应全局优化概率搜索算法。总的说来,遗传算法是按不依赖于问题本身的方式去求解问题。它的目标是搜索这个多维、高度非线性空间以找到具有最优适应值(即最小费用的)的点[1]。

基本遗传算法是一个迭代过程,它模仿生物在自然环境中的遗传和进化机理,反复将选择算子、交叉算子和变异算子作用于种群,最终可得到问题的最优解和近似最优解。

2遗传算法程序设计改进比较

2.1基本遗传算法对TSP问题解的影响

本文研究的遗传算法及改进算法的实现是以C++语言为基础,在Windows2000的版本上运行,其实现程序是在MicrosoftVisualStadio6.0上编写及运行调试的。

1)遗传算法的执行代码

m_Tsp.Initpop();//种群的初始化

for(inti=0;i<m_Tsp.ReturnPop();i++)

m_Tsp.calculatefitness(i);//计算各个个体的适应值

m_Tsp.statistics();//统计最优个体

while(entropy>decen||variance>decvar)//m_Tsp.m_gen<100)

{

//将新种群更迭为旧种群,并进行遗传操作

m_Tsp.alternate();//将新种群付给旧种群

m_Tsp.generation();//对旧种群进行遗传操作,产生新种群

m_Tsp.m_gen++;

m_Tsp.statistics();//对新产生的种群进行统计

}

2)简单的遗传算法与分支定界法对TSP问题求解结果的对比

遗传算法在解决NPC问题的领域内具有寻找最优解的能力。但随着城市个数的增加,已没有精确解,无法确定遗传算法求解的精度有多高。一般情况下,当迭代代数增大时,解的精度可能高,但是时间开销也会增大。因此可以通过改进遗传算法来提高搜索能力,提高解的精度。

2.2初始化时的启发信息对TSP问题解的影响

1)初始化启发信息

在上述实验算法的基础上,对每一个初始化的个体的每五个相邻城市用分支界定法寻找最优子路径,然后执行遗传算法。

2)遗传算法与含有启发信息的遗传算法求解结果的对比

当城市数增至20个时,用分支定界法已经不可能在可以接受的时间内得到精确的解了,只能通过近似算法获得其可接受的解。试验设计中算法的截止条件:固定迭代1000代。表2中的平均最优解为经过多次试验(10次以上)得到的最优解的平均值,最优解的出现时间为最优解出现的平均时间,交叉操作次数为最优解出现时交叉次数的平均值。

表220个城市的TSP问题求解结果数据

算法交叉操作

次数最优解

出现时间平均

最优解

简单遗传算法80244.479.4s1641.8

含初始化启发信息的GA79000.237.4s1398.9

从表2中可以看出,当初始种群时引入启发信息将提高遗传算法的寻优能力。同时缩短了遗传算法的寻优时间和问题的求解精度。

2.3交叉算子对TSP问题解的影响

1)循环贪心交叉算子的核心代码

for(i=1;i<m_Chrom;i++)

{

flag=0;

city=m_newpop[first].chrom[i-1];//确定当前城市

j=0;

while(flag==0&&j<4)

{

sign=adjcity[city][j];//adjcity数组的数据为当前城市按顺序排列的邻接城市

flag=judge(first,i,sign);//判断此邻接城市是否已经存在待形成的个体中

j++;

}

if(flag==0)//如果所有邻接城市皆在待扩展的个体中

{

while(flag==0)

{

sign=(int)rand()/(RAND_MAX/(m_Chrom-1));//随机选择一城市

flag=judge(first,i,sign);

}

}

if(flag==1)

m_newpop[first].chrom[i]=sign;

}

2)问题描述与结果比较

下面笔者用经典的测试遗传算法效率的OliverTSP问题来测试循环贪心交叉算子的解的精度和解效率。OliverTSP问题的30个城市位置坐标如表3所示[2]。

从表4、图1中可以看到,贪心交叉算子大大提高了遗传算法的寻优能力,同时也降低了交叉操作次数。在多次试验中,贪心交叉算子找到的最优解与目前记载的最佳数据的误差率为2.7%。而部分匹配交叉算子找到的最优解与目前记载的最佳数据的误差率高达7%。从而可以得到交叉算子对于遗传算法

2.4并行遗传算法消息传递实现的核心代码

1)主程序代码

//接收各个从程序的最优个体

for(i=0;i<slave;i++)

{

MPI_Recv(Rchrom[i],chrom,MPI_UNSIGNED,MPI_ANY_SOURCE,gen,MPI_COMM_WORLD,&status);

}

//计算接收各个从程序的最优个体的回路距离

for(i=0;i<slave;i++)

{

fitness[i]=0.0;

for(intj=0;j<chrom-1;j++)

fitness[i]=fitness[i]+distance[Rchrom[i][j]][Rchrom[i][j+1]];

fitness[i]=fitness[i]+distance[Rchrom[i][0]][Rchrom[i][chrom-1]];

}

//找到最优的个体并把它记录到文件里

for(i=0;i<slave;i++)

{

if(1/fitness[i]>min)

{

sign=i;

min=1/fitness[i];

}

}

fwrite(&gen,sizeof(int),1,out);

for(i=0;i<chrom;i++)

fwrite(&Rchrom[sign][i],sizeof(unsigned),1,out);

fwrite(&fitness[sign],sizeof(double),1,out);

//每九代向从程序发送一个最优个体

if(gen%9==0)

MPI_Bcast(Rchrom[sign],chrom,MPI_UNSIGNED,0,MPI_COMM_WORLD);

2)从程序代码

//将上一代的最优个体传回主程序

MPI_Send(Rchrom1,chrom,MPI_UNSIGNED,0,gen,MPI_COMM_WORLD);

//每九代接收一个最优个体并将其加入种群中替换掉最差个体

if(gen%9==0)

{

PI_Bcast(Rchrom2,chrom,MPI_UNSIGNED,0,MPI_COMM_WORLD);

Tsp.IndiAlternate(Rchrom2);

}

//进行下一代的计算

Tsp.Aternate();

Tsp.Generation();

Tsp.Statistics();

3)并行遗传算法的性能

笔者在MPI并行环境下,用C++语言实现了一个解决TSP问题的粗粒度模型的并行遗传算法。该程序采用的是主从式的MPI程序设计,通过从硬盘的文件中读取数据来设置染色体长度、种群的规模、交叉概率和变异概率等参数。试验环境为曙光TC1700机,测试的对象是OliverTSP问题的30个城市的TSP问题。

正如在测试串行遗传算法所提到的数据结果,并行遗传算法也没有达到目前所记录的最好解,但是它提高了算法的收敛性,并行遗传算法的收敛趋势如图2所示[4]。

图2遗传算法的收敛过程

3结束语

本文通过对基本遗传算法的不断改进,证明了添加启发信息、改进遗传算子和利用遗传算法固有的并行性都可以提高遗传算法的收敛性,其中对遗传算法交叉算子的改进可以大大提高遗传算法的寻优能力。

参考文献

[1]刘勇、康立山,陈毓屏著.非数值并行算法-遗传算法.北京:科学出版社1995.1

[2]IMOliverDJSmithandJRCHolland,Astudyofpermutationcrossoveroperatorsonthetravelingsalesman[C]//ProblemofthesecondInternationalConferenceonGeneticAlgorithmsandTheirApplication,Erlbaum1897:224-230

[3]于海斌,王浩波,徐心和.两代竞争遗传算法及其应用研究.信息与控制,2000Vol.29,No.4:309-314

注:本文为网友上传,不代表本站观点,与本站立场无关。

上一篇:广告创意设计论文范文 下一篇:听力教学论文范文

免责声明