算法精粹
㈠ 遗传算法
根据问题的目标函数构造一个适值函数,对一个由多个解(每个解对应一个染色体)构成的种群进行评估、遗传、选择,经多代繁殖,获得适应值最好的个体作为问题的最优解。
1,产生一个初始种群
2,根据问题的目标函数构造适值函数
3,根据适应值的好坏不断选择和繁殖
4,若干代后得到适应值最好的个体即为最优解
1.种群和种群大小
一般越大越好,但是规模越大运算时间越大,一般设为100~1000
2. 编码方法 (基因表达方法
3. 遗传算子
包括交叉和变异,模拟了每一代中创造后代的繁殖过程。是遗传算法的精髓
交叉:性能在很大程度上取决于交叉运算的性能,交叉率Pc:各代中交叉产生的后与代数与种群中的个体数的比。Pc越高,解空间就越大,越耗时/
变异:Pm:种群中变异基因数在总基因数中的百分比。它控制着新基因导入种群的比例。太低,一些有用的基因就难以进入选择;太高,后代就可能失去从双亲继承下来的良好特性,也就失去了从过去中搜索的能力。
4.选择策略
适者生存,优胜劣汰
5.停止准则
最大迭代数
初始种群的产生:随机产生,具体依赖于编码方法
编码方法 :二进制编码法、浮点编码法、符号编码法。顺序编码,实数编码,整数编码。
适值函数 :根据目标函数设计
遗传运算 : 交叉 :单切点交叉,双切点交叉,均匀交叉,算术交叉
变异 :基本位变异(Simple Mutation):对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。
均匀变异(Uniform Mutation):分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因座上的原有基因值。(特别适用于在算法的初级运行阶段)
边界变异(Boundary Mutation):随机的取基因座上的两个对应边界基因值之一去替代原有基因值。特别适用于最优点位于或接近于可行解的边界时的一类问题。
非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一次轻微的变动。
高斯近似变异:进行变异操作时用符号均值为P的平均值,方差为P**2的正态分布的一个随机数来替换原有的基因值。
选择策略 :1.轮盘赌选择(Roulette Wheel Selection):是一种回放式随机采样方法。每个个体进入下一代的概率等于它的适应度值与整个种群中个体适应度值和的比例。选择误差较大。
2.随机竞争选择(Stochastic Tournament):每次按轮盘赌选择一对个体,然后让这两个个体进行竞争,适应度高的被选中,如此反复,直到选满为止。
3.最佳保留选择:首先按轮盘赌选择方法执行遗传算法的选择操作,然后将当前群体中适应度最高的个体结构完整地复制到下一代群体中。
4.无回放随机选择(也叫期望值选择Excepted Value Selection):根据每个个体在下一代群体中的生存期望来进行随机选择运算。方法如下:
(1) 计算群体中每个个体在下一代群体中的生存期望数目N。
(2) 若某一个体被选中参与交叉运算,则它在下一代中的生存期望数目减去0.5,若某一个体未 被选中参与交叉运算,则它在下一代中的生存期望数目减去1.0。
(3) 随着选择过程的进行,若某一个体的生存期望数目小于0时,则该个体就不再有机会被选中。
5.确定式选择:按照一种确定的方式来进行选择操作。具体操作过程如下:
(1) 计算群体中各个个体在下一代群体中的期望生存数目N。
(2) 用N的整数部分确定各个对应个体在下一代群体中的生存数目。
(3) 用N的小数部分对个体进行降序排列,顺序取前M个个体加入到下一代群体中。至此可完全确定出下一代群体中M个个体。
6.无回放余数随机选择:可确保适应度比平均适应度大的一些个体能够被遗传到下一代群体中,因而选择误差比较小。
7.均匀排序:对群体中的所有个体按期适应度大小进行排序,基于这个排序来分配各个个体被选中的概率。
8.最佳保存策略:当前群体中适应度最高的个体不参与交叉运算和变异运算,而是用它来代替掉本代群体中经过交叉、变异等操作后所产生的适应度最低的个体。
9.随机联赛选择:每次选取几个个体中适应度最高的一个个体遗传到下一代群体中。
10.排挤选择:新生成的子代将代替或排挤相似的旧父代个体,提高群体的多样性。
之前在网上看到的一个比方,觉得很有趣:
{
既然我们把函数曲线理解成一个一个山峰和山谷组成的山脉。那么我们可以设想所得到的每一个解就是一只袋鼠,我们希望它们不断的向着更高处跳去,直到跳到最高的山峰。所以求最大值的过程就转化成一个“袋鼠跳”的过程。
下面介绍介绍“袋鼠跳”的几种方式。
爬山算法:一只袋鼠朝着比现在高的地方跳去。它找到了不远处的最高的山峰。但是这座山不一定是最高峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。
模拟退火:袋鼠喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高峰跳去。这就是模拟退火算法。
遗传算法:有很多袋鼠,它们降落到喜玛拉雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠。于是,不断有袋鼠死于海拔较低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有机会生儿育女。就这样经过许多年,这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲。
}
(把那些总是爱走下坡路的袋鼠射杀,这就是遗传算法的精粹!)
遗传算法并不保证你能获得问题的最优解,但是使用遗传算法的最大优点在于你不必去了解和操心如何去“找”最优解。(你不必去指导袋鼠向那边跳,跳多远。)而只要简单的“否定”一些表现不好的个体就行了。(把那些总是爱走下坡路的袋鼠射杀,这就是遗传算法的精粹!)
改进与变形
编码方法:
㈡ vb程序设计论文
vb程序设计论文
在社会的各个领域,大家都跟论文打过交道吧,论文的类型很多,包括学年论文、毕业论文、学位论文、科技论文、成果论文等。如何写一篇有思想、有文采的论文呢?下面是我为大家收集的vb程序设计论文,希望能够帮助到大家。
Visual Basic(简称VB)是目前使用最广泛的一种程序设计语言,是在Basic语言的基础上发展起来的,它继承了Basic语言简单易用的优点,结合了可视化界面的设计方法,采用面向对象、事件驱动的编程机制,把Windows编程复杂性进行巧妙封装,使开发Windows环境下的各种应用软件变得更为容易。因此,目前国内很多高校都选择将《VB程序设计》这门课程作为理工科专业的一门基础课程。程序设计具有知识结构严谨、逻辑性强的特点,学生学习起来比较困难,教学效果也不尽如人意。如何提高本课程的教学质量和教学效果,是每位授课教师都会关注的课题。
1教学中存在的问题
就VB程序设计这门课程的教学现状而言,通常采用的还是以课本原有知识体系为脉络的传统讲授法,教学内容大多以线性方式展开,同时结合上机实践操作来巩固和熟悉课堂上所讲的每一章节的知识点。经过教学实践证明,这种教学模式能够让学生掌握Visual Basic的较多的理论知识,也可以阅读程序代码,但是让学生自己解决一些问题的时候,通常都会束手无策。经过分析总结出此课程在教学中存在的问题:
一是教学内容与教学目标不一致。VB程序设计课程的教学目标是培养学生程序设计的基本知识、思维方式以及基本的操作技能,而教师在实际授课时,大多单纯依照教材讲授理论基础知识,授课基本上是以语言自身的知识体系为脉络展开,过分注重语句、语法和结构的讲解,忽视对学生分析与解决问题能力的引导,不能很好的将编程环境、程序设计语言、算法、数据结构以及程序设计思想关联起来形成体系化教学。[1]导致学生只学会了语法概念而不会使用,能够读懂某一条语句,却无法理解一段代码的含义。
二是实验内容过于简单。上机实验大多都是属于基础与验证型实验,偏重于VB语言的基本语法和结构的练习,能够帮助学生更好的理解和掌握这些语法知识,但无法培养学生编程能力和解决实际问题的能力。实验内容普遍都是知识点案例,针对的是具体的一个或多个知识点,没有依托完整的实践项目,使学生对知识点的学习感到枯燥无味,而且很容易遗忘。
三是学生缺乏计算机的思维方式。学生在接触这门课程之前通常没有任何基础,学生普遍缺乏相应的知识背景和算法思想,对程序设计的思维方式还不适应,分析和解决问题的能力处于一个较低的水平。在学习过程中经常会出现这种情况,教师对程序进行分析讲解时学生能够听懂理解,代码也能够读懂,但是让学生自己编写时,就无处下手,久而久之学生对编程充满畏惧感,对学习本门课程缺乏兴趣。
如何改变目前教学中存在的问题,让学生能够更好地掌握VB语言,掌握程序设计的基本方法?需要对课程的教学进行改革和创新。
2课程教学改革
2.1拓展教学内容
本课程主要培养学生的程序设计思维方式和实际编程能力,而不是单纯的程序设计语言,因此必须打破固有的以“语法”和“结构”为中心的传统教学理念,以突出能力培养为主轴,围绕能力培养组织教学内容。教学内容的选择不能仅仅局限在一本教材上,要突破教材局限,将程序设计中所需要的众多知识点加以整合,包括VB语言的语法结构、可视化编程方法、常用的算法、数据结构以及程序的调试等,形成新的知识体系。在这里算法是程序设计的核心,而语言只是一种工具,在授课的过程中,特别是讲解实例时,需要剥开语言这层外壳,让学生掌握其中的精粹——算法,也就是如何利用计算机来解决某一具体问题。
当然,这并不是说语言不重要,语言是程序设计的工具,如果不掌握语言,程序设计就无从谈起。教材上的语法描述非常细致、系统,但大量的语法规则会使初学者感觉枯燥,这非常影响学生的学习兴趣。根据二八定律,在任何一组东西中,只有20%是最重要的,事实上VB语言也是如此,最常用、最重要的知识点并不是很多。因此在讲述语法时,只需提供给学生最基本的语法知识,其余的细枝末节可以由学生自学。
2.2优化教学方法和教学策略
在程序设计的教学中,传统讲课方式的缺陷已众所周知,因为这是一种以教师为主、学生为辅的一种授课形式,讲课中教师是积极的而学生是消极的,很难把学生吸引到学习进程之中。但这不是意味着要把这种授课方式抛弃,讲课是把大量知识传递给学生的一种常用模式,尤其在本课程的教学中,学生缺乏普遍缺乏知识背景,大量的理论知识需要传递给学生,这就需要教师进行详细地讲解。在讲解时应该采用多种策略,比如在讲述抽象概念时最好与实践相关联,或者与学生已有的知识联系起来,这样比较容易理解。在提到函数和数据类型的.时候,可以跟学生比较熟悉的Excel中的相关概念关联起来。在讲述面向对象的概念时,可以拿Windows操作系统作为例子,它就是依照面向对象的思想编制而成的,在桌面上的每个图标,可以理解成一个对象,当需要启动某个对象时,只需用鼠标点击它(消息驱动)。[2]不仅如此,在不同的情境下还需要灵活运用多种教学方法,如问题法、引导法、任务驱动和实例教学法等,这样有助于让学生从消极的学习者转变为积极的学习者。
2.3完善实验教学体系
VB程序设计是一门理论性和实验性都很强的课程,对实验环节有较高的要求。要学好这门课,学生只有经过大量的上机实验,才能掌握程序设计的技能和方法。因此,在教学过程中要给学生留出足够的上机时间,让学生在实验中理解VB语言的基本概念,掌握基本的编程方法。结合学生的专业方向,精心选择合适的案例、设计型与研究型课题,构建有助于培养学生动手能力和程序设计思维方式的实验教学平台。整个实验环节分为三个层次设计,基础验证型、设计开发型和研究创新型实验,每次实验课有多个基础验证型实验,帮助学生掌握相应的语法知识和算法设计,每一章精选1~2个设计开发型实验,与学生分析讨论解题思路,引导学生独立解决问题,培养学生的上机调试能力。学生以小组为单位,选择一个与其专业相关的研究题目,要求学生逐步完成研究分析与报告,写出个人的心得体会,并在学期末给出一定的时间完成课题。
2.4创建项目实例库
充分利用网络资源,搜集各类完整的VB程序实例,从中选取典型的、有实际意义的实例,作为程序设计的模板提供给学生。大多数学生基本上是初次接触计算机程序设计,习惯采用数学思维方式来分析问题,还没有真正掌握计算机编程的基本思路。在实验过程中,遇到一个新的题目,学生往往不知道从何下手,思路不清晰,此时就可以从项目实例库找出对应的实例,通过借鉴或修改相应的模板得到结果。“熟读唐诗三百首,不会做诗也会吟”,经常阅读这些实例,能够拓展学生的视野,促进学生对于程序设计思想的理解与认识,提高学生的编程能力。
在具体实施上,整理出40~50个典型项目实例,将它们分为五大类:基础类、算法类、图形类、文本类和应用类,供学生自主学习,另外从中选取6~8个典型的项目实例,要求学生必须理解掌握,这些实例基本上包含了这门课程的知识要点,理解了这些实例,对于课程的知识结构会有一个全面的了解。其中,学生最喜欢也最有兴趣的实例就是弹球游戏,通过对弹球游戏程序代码的阅读分析,学生能够更好地掌握定时器控件和控件坐标等相关的知识,学生也很有兴趣地去改写程序代码,以获得类似的动画效果,可见好的实例能够激发学生的求知欲望,提高学生的学习积极性,培养学生分析问题和解决问题的能力。
3结束语
VB程序设计课程对于理论知识和实际操作均有较高要求,教学时需要综合运用多种教学方法和教学策略,充分调动学生的学习积极性和主动性,将教学重点放在算法的分析和编程的训练上,注重实验教学环节,加强对学生程序设计思维方式和实际编程能力的培养,提高课程的教学效果。
;