文档库 最新最全的文档下载
当前位置:文档库 › 基于FPGA的递归最小二乘算法的研究与实现

基于FPGA的递归最小二乘算法的研究与实现

基于FPGA的递归最小二乘算法的研究与实现
基于FPGA的递归最小二乘算法的研究与实现

摘要

软件测试是保证软件质量和可靠性重要手段,在这方面发挥着其它方法不可替代的作用。然而,软件测试是一个复杂的过程,需要耗费巨大的人力、物力和时间,约占整个软件开发成本的40%~50%。因此,提高软件测试工具的自动化程度对于确保软件开发质量、降低软件开发成本非常重要。而提高测试用例生成的自动化程度又是提高测试工具乃至整个测试过程自动化程度的关键所在,本文主要针对这一问题进行了研究和设计。

本文在分析软件测试和算法基本概念的基础上,提出软件测试用例的设计是软件测试的难点之一。论文提出了基于算法的测试用例生成的内含是应用算法来求解一组优化的测试用例,其框架包括了测试环境构造、算法及测试运行环境三部分,论文给出了基于算法的测试用例生成的模型。最后以三角形分类程序为例应用算法进行测试用例生成的模拟,结果显示,应用算法进行测试用例生成可行。

关键词:软件测试测试用例算法

ABSTRACT

Software test is the important means that guarantee software quality and reliability,and in this respect,it plays the role that other method cannot replace. However software test is a complex process , it needs to consume huge manpower,material resources and time,which takes the 40%~50% of entire software development cost approximately . Therefore,raising the automation level of software test tool is very important for ensure software development quality and reduction software development cost . And then,the most important is raising the automation level of the test case generation for raising the automation level of test tool and even entire test process,so this paper study and design mainly according to this problem.

Based on the analysis of basic concepts of software testing and genetic algorithm, this article proposes that software test case design is one of the difficulties of software testing. Paper presents the inherent in software test case designing based on genetic algorithm is using genetic algorithm to solve a set of optimization test cases, and the framework includes three parts which are test environment construction, genetic algorithm and the environment for test . Paper presents the model of software test case generation based on genetic algorithm. Finally, we take the triangle categorizer as an example, simulate software test case generation based on genetic algorithm. The results display that software test case generation basing on genetic algorithm is possible.

KEY WORDS: software test , test case , genetic algorithm

目录

摘要 (1)

ABSTRACT (2)

目录 (3)

第一章绪论 (5)

1.1 问题的提出 (5)

1.2 国内外研究现状 (6)

1.3 论文研究内容 (8)

第二章软件测试及算法基本概念 (9)

2.1 软件测试基本概念 (9)

2.1.1 软件测试的目的 (9)

2.1.2 软件测试的原则 (9)

2.2 软件测试的难点 (10)

2.3 算法 (11)

2.3.1 算法的思想及流程 (11)

2.3.2 算法的特点 (13)

2.4本章小结 (14)

第三章基于算法的测试用例生成 (15)

3.1基于算法的测试用例生成基本内涵 (15)

3.1.1 软件测试用例的基本内涵 (15)

3.1.2 基于算法的测试用例生成的基本内涵 (16)

3.2 基于算法的测试用例生成框架 (16)

3.3 基于算法的测试用例生成算法实现 (18)

3.3.1 编码策略 (18)

3.3.2 适应度函数及程序插桩 (19)

3.3.3 策略 (20)

3.3.4 参数控制 (21)

3.4 本章小结 (22)

第四章实验及结果分析 (23)

4.1 待测程序分析 (23)

4.1.1 待测程序引入 (23)

4.1.2 程序流程分析 (23)

4.1.3 路径分析 (24)

4.2 程序插桩............................... 错误!未定义书签。

4.3 参数设定及程序实现 (24)

4.3.1 参数设定 (24)

4.3.2 部分程序实现 (25)

4.4 结果分析 (27)

4.5 本章小结 (29)

第五章总结与展望 (30)

致谢语 (31)

参考文献 (32)

第一章绪论

1.1 问题的提出

在信息化普及的今天,计算机在人们的生活和工作中占据着重要地位,使人们的工作效率提高,也使生活更丰富多彩。而作为计算机的重要组成部分,软件的重要性不言而喻。随着计算机技术的日益发展,计算机软件的规模越来越庞大,复杂性越来越高,这就为软件质量的保证带来了困难。因为软件的开发过程大部分是由人的智力活动构成,不可能完美无缺。而软件缺陷如果不能及时发现,带来的损失可能是巨大的,有的甚至会危及人的生命。在历史上臭名昭著的软件缺陷案例有[1]:1999年12月3日,美国航天局的火星基地登陆飞船在试图登陆火星表面时失踪,原因仅仅是一个数据位的意外更改;美国爱国者导弹防御系统曾在几次对抗导弹战役中失利,其中一次竟然误使28名美国士兵丧生,原因是一个很小的系统时钟错误导致系统累计拖延了100多个小时使跟踪系统失去准确度;还有就是大名鼎鼎的“千年虫”问题,起因是在20世纪70年代,为了节省硬盘空间,美国某位程序员在编写工资系统时将4位数日期(如1975)改成了2位数日期(如75),该缺陷一直拖到1995年都没有修复,最终给全球带来了高达数亿美元的损失等等。

作为提高软件质量的重要手段,软件测试越来越受到重视。在美国的微软公司,测试人员和开发人员的比例达到了2:1[2]。软件测试伴随着整个开发过程,是一个非常复杂的过程,其消耗的人力和资金一般占整个项目的一半左右。而在某些特别重要的软件开发过程中,为保证软件的质量,测试的费用甚至是其它各阶段之和的3到5倍[3]。测试过程中,测试人员通常需要分析、设计和执行大量的测试用例,从而耗费了大量资源,因此找出合理的测试用例生成方法可以有效缩短测试时间,减少损耗,一般可以有效降低整个项目的4%费用[4]。

然而,目前生成测试用例的方法主要是向前核查法和逆向回溯法,测试人员根据自己的项目经验手工为指定的程序路径生成测试数据[5]。向前核查法是指沿预期的路径向前检查,确定到每一个判断点时变量所能提供的最宽数值区间,然

后继续前行,从而将多个变量的可能取值范围逐渐缩小,到达程序出口后,就能找到覆盖这条路径所需的输入数据。逆向回溯法正好相反,是指从期望执行的程序位置出发,逆向回溯,在每个判断点处逐渐调整各变量取值,直到退到程序入口,即获得所需的输入数据。向前核查法和逆向回溯法的局限性是,对某些条件要求苛刻的路径使用时非常困难,同时由于大多数程序中包含的路径数非常多,如果按每条路径手工测试,显然带来的工作量是非常巨大的。

由于测试的工作量大、测试过程的重复性高等特点,自动化测试正逐渐得到广泛的应用。很多测试工具的使用大大提高了测试人员的工作效率,有效减少了项目开支。然而这些工具主要为测试的执行、管理和度量工具,在测试用例自动生成方面还不完善。而在软件测试过程中,动态测试作为测试的重要环节占了很大比例,动态测试的关键正是测试用例的生成问题。因此,寻找一种有效的测试用例生成方法是提高测试自动化的重中之重。

1.2 国内外研究现状

自上世纪60年代起,国内外的学者专家对测试用例的自动生成提出了很多方法,应用较为广泛的有随机法、静态法、动态法以及试探法[5] [6] [7] [8] [9] [10] [11] [12]。

D.Bird[13]等提出了采用随机法生成测试用例,其思想是不受限制地随机产生大量的测试用例。该方法产生测试用例的成本很低,在某些抽样测试中效果较好,但是该方法的针对性较弱,在输入空间为无穷大时产生的测试用例集非常庞大,测试效率低,现在的很多工具都是采用的该方法。

静态法的典型代表是符号执行法,由P.D.Coward[14]和C.Ramanmoorthy [15] [16]等人提出。该方法的主要思想是把符号值作为程序输入,静态“执行”指定路径的语句,从而得到变量的值。这里所谓的执行,是指按照程序执行的顺序将相应的变量用符号表达式代换。该方法的缺点为需要进行复杂的代数运算,难以处理依赖于输入变量的循环条件、数组元素下标和模块调用的情况,特别对于动态的面向对象程序不适合使用。

与静态法相对应的是动态法,该方法的基本思想是从输入空间中任取一个假设解作为初始输入,通过实际运行程序不断调整输入,使得程序实际执行路径向指定路径不断逼近,直到与指定路径完全一致。Korel[17]法是动态法的典型代表:

其采用的是步进的方式执行程序,即一次只前进一个分支谓词;Korel还提出了“谓词函数”的概念,用来度量分支谓词的接近满足程度。然而,由于Korel 法一次只考虑一个分支谓词,使用回溯技术,所以要进行大量的迭代,浪费了大量的资源。而且由于对于非线性路径约束,该方法只能找到局部极小值,当谓词函数有多个局部极小值时显然将难以找到目标路径的解。除此之外,动态法还包括程序插装的方法和迭代松弛法,M.Gallagher和Neelam Guptal[18]分别对这两种方法进行了全面的阐述。

第四种算法是试探法,该方法的基本思想是从输入数据空间中选择输入数据,运行程序,将运行结果结合概率论的思想产生新的数据继续进行试探。其受搜索空间限制条件的约束小,且不需要其它辅助性信息,对于很多高复杂度问题(如大空间、多峰、非线性、全局优化等)具有独特的优势和高效性。试探法主要包括算法、模拟退火算法、禁忌搜索算法、混合策略的算法等。

自20世纪90年代起,算法因其独特的优点而开始被广泛的用于测试用例的生成领域,并取得了良好的研究成果。算法模拟生物学中的变异原理,采用编码技术将待求数据映射到基因空间,并通过选择、交叉、变异等操作和优胜劣汰的自然选择确定搜索方向,从而找到最优解。实验证明,该算法具有隐性并行性和全局寻优能力,可以自动获取搜索过程中的有关信息并用于指导优化。

Jones 等人[19]的实验表明,为使三角形分类等程序达到分支覆盖,算法生成的测试数据比随机法小一到两个数量级。

Jin-Cherng Lin等人 [20]等人对适应度函数进行了研究,提出了使用广义海明距离来构建适应度函数。

荚伟[21]分析了算法在测试用例产生这一问题上的可行性,提出了要有效解决该问题,必须从以下几个角度进行研究:参数的编码方法、适应度函数的构造、算子的设计以及算法参数的选择等。

Berndt等人 [22]将输入空间划分成多个区间,根据待选输入的多种特性创建了一个最小化函数,使用简单算法进行求解,并使用了求解过程中的化石记录来指导求解过程。

景志远[23]则从数学的角度分析了将MGA和K均值等改进的算法应用于测试用例的自动生成。

蔡立志等人[24]提出了一种基于算法的成对测试生成方法,该方法用于选择当前局部优化覆盖的测试用例,以此构建满足成对测试基准的测试用例套,有效降低了相同覆盖率下的测试用例数量。

陈雨等人[25]将自适应算子和禁忌搜索思想融入到算法中,充分发挥算法的全局搜索和禁忌搜索算法局部搜索优势, 提高了测试数据的生成能力。

全君林等人[26]提出了一种应用于软件回归测试过程中的基于算法的最小化测试用例集算法模型,该算法较一般的优化算法具有更高算法性能与效率。

1.3 论文研究内容

本文主要做了以下方面的研究:

(1)广泛阅读了国内外相关文献资料,对软件测试和算法的应用现状进行了概述,认为使用算法进行测试用例生成可行。

(2)分析了使用算法进行测试用例生成的基本内涵,提出了算法框架及对算法进行实现的具体策略。

(3)以三角形分类程序为例进行试验,分析了试验结果,证实了算法的优越性。

第二章软件测试及算法基本概念

2.1 软件测试基本概念

2.1.1 软件测试的目的

1983年IEEE在“软件工程标准术语”中将软件测试定义为:“使用人工或自动手段来运行或测定某个软件系统的过程,其目的在于检验该被测软件是否满足规定的需求或是衡量预期结果和实际结果之间的差别。”

定义中指出软件测试的目的是“检验该被测软件是否满足规定的需求或是衡量预期结果和实际结果之间的差别”

Grenford. J. Myers在其著作《The Art Of Software Testing》中提出了与软件测试相关的三个重要观点,指明了软件测试的目的为:

○1软件测试是程序的执行过程,目的在于发现错误;

○2一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例;

○3一个成功的测试是指发现了迄今为止尚未发现的错误的测试。

由此可见,软件测试的目的可以概括为:

首先,软件测试要以最少的人力、物力,尽快找出软件中潜在的各种缺陷,通过修正这些缺陷,提高软件产品质量,尽量减少软件产品发布后由潜在的软件缺陷带来的可能的商业风险。其次,通过分析软件缺陷产生的原因,可以帮助发现当前开发开发过程中的软件过程缺陷,以便进行软件过程的改进。同时,通过对测试结果的分析整理,还可以修正软件开发规则,并为软件可靠性分析提供依据。

2.1.2 软件测试的原则

软件测试作为一门独立的计算机软件技术,在执行过程中必须遵守一定的原则,以保证测试效果。软件测试的专家们经过长期的实践,总结出了软件测试的原则应如下:

○1应把“尽早和不断地进行软件测试”作为软件开发者的座右铭。

实践证明单元测试能够尽早发现问题,减少后期测试的错误量。单元测试过程中可以使用相应白盒测试工具(如Junit,Jtest等)进行辅助测试,以提高测试效率。

○2测试用例应由测试输入数据、测试执行步骤和与之对应的预期输出结果三部分组成。

○3应当避免由程序员检查自己的程序。

特别在后期的性能测试及系统测试中,应避免程序员测试自己的程序。这其中除了某些心理因素外,该原则还可避免由于程序员个人的惯性思维而导致的某些理解错误。

○4测试用例的设计要确保能覆盖所有可能路径。

在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。不合理的输入条件是指异常的、临界的、可能引起问题的输入条件。

○5充分注意测试中的群集现象。

经验表明,测试后程序残存的错误数目与该程序中已发现的错误数目或检错率成正比。应该对错误群集的程序段进行重点测试。

○6严格执行测试计划,排除测试的随意性。

软件测试是有组织、有计划、有步骤的活动。测试计划应包括:所测软件的功能,输入和输出,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制方法和过程,系统的配置方式,跟踪规则,调试规则,以及回归测试的规定等等以及评价标准。

○7应当对每一个测试结果做全面的检查。

○8妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。

2.2 软件测试的难点

(1)测试用例设计

测试用例及测试例程是其设计者对被测对象实现原理和外部需求的理解,能否正确反映对被测对象的质量要求,很大程度上取决于其设计者的分析、理解和

设计能力。这是一种缺乏指导性方法的、不易制订标准或规范的、需要“技巧”的设计活动。

(2)测试管理

目前缺乏测试管理方面的资料,几乎没有可供参考的、已实现的、完整的测试管理与测试实施模式。

(3)测试的组织

软件测试的有效实施需要开发组织与测试组织充分配合。虽然测试活动看似是对开发人员劳动成果的不断“挑剔”,但测试工作的出发点是:确保开发人员的劳动成果成为可被接收的、更高品质的软件产品。因此,测试人员应向开发人员谦虚求教,在测试工作中真正发挥作用,为保证软件产品的高质量起尽可能大的作用。测试的组织者应在促进上级组织协调各组织工作方面发挥作用。

(4)测试的估计

有效的测试工作需要投入足够的人力和物力,需要对工作的难度和消耗有充分的估计。测试的组织者也应在促进上级组织对资源的统一调度方面发挥作用。

2.3 算法

2.3.1 算法的思想及流程

算法(genetic algorithm)是模拟达尔文的选择和自然淘汰的生物进化过程的计算模型。该算法最先于1975年由美国的J.Holland教授提出。其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。算法作为一种不依赖具体问题的直接搜索方法受到广泛关注,它是现代有关智能计算的关键技术之一。

算法的思想源于生物学和适者生存的自然选择规律,因此是具有“生存+检测”的迭代过程的搜索算法。它以一个群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。算法将问题的解空间映射为空间,对解空间进行编码,即将每个可能的解用一串二进制或十进制数字串表示,

称为一个染色体,解的每个分量称为一个基因。算法开始时先随机给出一群染色体,即候选解,由预先设定的某个评价指标计算每个染色体的适应值,将适应度低的染色体淘汰掉,而保留适应度高的优良染色体,然后对这些染色体进行选择复制、交叉和变异等操作,从而产生新的一代染色体群体。这样一代一代的“进化”,直至找到算法的最优解,即适应值满足条件的解。由于算法产生的“后代”是由优秀的“父代”和“母代”产生的,因此继承了上代的优良性态而优于上代,从而使算法向着最优解的方向进行,直到满足预先设定的条件。

算法过程包括了编码、产生初始群体、计算适应值、选择、交叉、变异等操作。其一般流程图如图2-1所示:

图2-1 算法流程图

2.3.2 算法的特点

算法是一类可用于复杂系统优化计算的搜索算法,与其他一些优化算法相比,它的主要特点有如下几点[27]:

(1)算法以决策变量的编码作为运算对象,而传统优化算法往往直接利用变量的实际值来进行优化计算。这种对决策变量的编码处理方式,使得我们在优化计算过程中可以借鉴生物学中染色体和基因等概念以及和进化机理。特别是对—些无数值概念或很难有数值概念,而只有代码概念的优化问题,编码处理方式

更显示出了其独待的优越性。

(2)算法直接以目标函数值作为搜索信息,而不需要目标函数的导数值等其他辅助信息。这个特性对很多目标函数难以求导的优化问题,以及组合优化问题等,应用算法时就显得比较方便。而且,直接利用目标函数值或个体适应度,也可使得我们可以把搜索范围集中到适应度较高的部分搜索空间中,从而提高了搜索效率。

(3)算法同时使用多个搜索点的搜索信息,而传统的优化算法往往是从解空间中的一个初始点开始最优解的迭代搜索过程。单个搜索点的搜索效率不高,甚至可能使搜索过程陷于局部最优解而停滞不前。算法通过对个体组成的群体进行操作运算,产生新的群体,其中包含的群体信息可以避免搜索一些不必搜索的点,所以实际上相当于搜索了更多的点,这是算法所特有的一种隐性并行性。

(4)算法使用概率搜索技术,而很多传统的优化算法往往使用的是确定性的搜索方法。确定性的方法由于固定了点与点之间的转移方法和转移关系,往往可能使得搜索永远达不到最优点,因而也限制了算法的应用范围。而算法属于一种自适应的概率搜索技术,其选择、交叉、变异等运算都是以一种概率的方式来进行的,从而增加了算法搜索过程的灵活性和搜索效率。

2.4本章小结

本章首先介绍了软件测试的一些基本概念,对软件测试的知识做了系统的介绍,包括软件测试的目的、原则、过程,介绍了了软件测试的主要技术难点,其中包括了测试用例的设计。本章后半部分介绍了算法的基本概念,包括算法的思想、流程及特点。

第三章基于算法的测试用例生成

3.1基于算法的测试用例生成基本内涵

3.1.1 软件测试用例的基本内涵

测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求,包含输入和输出两部分。

构造测试用例的目的是为了检查被测软件的操作结果是否与预期的需求相吻合,确定应用程序的某些特性是否正常的工作等。测试用例的质量可以用以下四个标准来描述:

(1)有效性:是否能够发现缺陷,或者至少可能发现缺陷;

(2)仿效性:可仿效的测试用例能够测试多项内容,从而减少测试用例的数量;

(3)经济性:测试用例的执行、分析和调试是否经济;

(4)修改性:软件修改后测试用例的维护成本。

实践中,设计测试用例需遵守一定的原则,这些原则主要有:

(1)全面性

包括:应尽可能覆盖程序的各种路径;应考虑存在跨年、跨月的数据;大量数据并发测试的准备等。

(2)正确性

输入界面后的数据应与测试文档所记录的数据一致且预期结果应与测试数据发生的业务吻合。

(3)符合正常业务惯例

测试数据应符合用户实际工作业务流程且兼顾各种业务变化的可能。

(4)仿真性

人名、地名、电话号码等应具有模拟功能,符合一般的命名惯例;不允许出现与知名人士、小说中人物名等雷同情况。

(5)可操作性

测试用例中应写清测试的操作步骤,不同的操作步骤相对应的操作结果。

3.1.2 基于算法的测试用例生成的基本内涵

使用算法实现测试用例的自动生成可描述为[12]:应用算法来求解一组优化的测试用例。在每一步进化计算过程中,测试用例自动生成器使用当前群体(测试用例)驱动被测试程序的执行,每一个测试用例的执行路径被跟踪和记录,以最大化程序执行路径的覆盖为适应性目标函数进行计算,产生出下一代群体。在多代进化之后,得到最优种群或超过特定的循环限制条件而结束。

因为测试用例的自动生成是在一个数据域中寻找满足给定的测试标准的一组测试输入数据的过程,所以近年来出现了把测试用例的生成问题转化成路径搜索问题的思想。由于一般情况下,测试数据的产生是一个不可判定性问题,再加上被测程序的规模和复杂性,一般的搜索算法受到了极大的限制。算法在处理不确定搜索问题时有着非常明显的优势。

算法能针对程序路径生成大量有效测试用例,因此符合测试用例设计的全面性、正确性等原则。生成的测试用例符合上节中的测试用例设计标准,特别是有效性和经济性等,由此可见算法应用于测试用例生成是可行的。

3.2 基于算法的测试用例生成框架

本文基于算法的测试用例生成基本流程如下所示:

(1)分析源程序代码,获得程序控制流程图;

(2)由程序控制流程图得到程序分支路径集合,选择目标路径;

(3)根据各谓词条件给程序插桩并制定适应度函数;

(4)设定算法参数,包括群体大小、变异率等,随机产生初始测试数据集合;

(5)使用测试数据执行经过插装的源代码,获得适应度值,根据适应度值判断,若满足程序终止条件则输出结果并退出程序,若不满足条件则进入步骤(6);

(6)根据得到的适应度值,使用算法的选择、交叉、变异等操作,生成新的测试数据,并回到步骤(5),重复执行;

程序框架如图3-1所示,包含测试环境构造、算法和测试运行环境三部分。

图3-1 程序框架图

桩模块

测试环境构造部分是整个系统的基础,它主要利用静态分析提供的基本信息并借助于各种插装技术来构造相应的测试运行环境。

算法部分是系统的核心,它主要按照第一部分生成的编码参数格式构造相应的染色体串,并生成初始种群,然后通过对该种群进行反复的GA运算(选择、交叉和变异)从而引导种群不断地向目标值进化直到最终找到解或达到限定的运行代数为止。

最后部分是测试运行环境。算法第二部分需要对种群中每一个个体的优劣进行评估,它主要是通过实时地调用并运行插装后的测试系统来返回适应度值,从而来指导算法的搜索。

3.3 基于算法的测试用例生成算法实现

3.3.1 编码策略

使用算法求解问题时,必须将目标问题的实际表示与算法的染色体位串结构之间建立映射关系,这一过程即为编码。编码就是将目标问题的解用一种特定字符串来表示,从而将问题的解空间(有效的候选解,即表现型个体)与算法的码空间(基因型个体)相对应。编码过程是算法的基础,编码方法除了决定了个体的染色体排列形式之外,还决定了个体从GA空间的基因型变换到问题空间的表现型时的解码方法(即为编码方法的逆方法)。同时,编码方法也影响到交叉算子、变异算子等算子的运算方法。

由此可见,编码方法的好坏是影响算法性能及效率的重要因素。一个好的编码方法,有可能会使得交叉运算、变异运算等操作可以简单地实现和执行。相反,选择了不当的编码方法有可能会使得交叉运算、变异运算等操作难以实现,甚至可能会产生很多不属于可行解集合内的无效解。因此Goldberg提出了三条编码评估规范:

①完备性(Completeness):问题空间中的所有点都能作为GA空间中的点(染色体)表现。

②健全性(Soundness):GA空间中的染色体能对应所有问题空间中的候选解。

③非冗余性(Nonredundancy):染色体和候选解一一对应。

常见的编码方法有二进制编码方法、格雷码编码方法、浮点数编码方法、符号编码方法等,在应用中具体使用何种编码方法应根据问题的实际情况而定,这里我们使用二进制编码方法。

二进制编码方法是算法中使用最多的编码方法,不光是由于其编码解码操作简单,便于实现交叉、变异等操作,而且该编码方法符合最小字符集编码原则,能使染色体与候选解一一对应。

使用二进制编码方法进行编码时,先根据问题所要求的求解精度确定符号串

的长度,假设某一参数的取值范围为[X

min ,X

max

],可用长度为L的二进制编码符号

来表示该参数,则能产生2L 个不同的编码,设编码精度为δ,则:

X min 表示为 0000...000=0

X max 表示为 1111...111=2L -1

δ=max min 21

L X X -- (3-1) 若某个体编码为X :a L a L-1a L-2...a 2a 1 ,则其解码公式为:

x= max min 1min 1X (2)21

L i i L i X X a -=-+??

-∑ (3-2) 3.3.2 适应度函数及程序插桩

(1)适应度函数

在算法中,不需要用到搜索空间的知识,而使用适应度函数对染色体进行评价,一般来说,适应度高的染色体的评价较高,适应度低的染色体评价较低而可能被淘汰,因此,适应度函数直接决定了种群的进化方向,对算法的好坏具有很大影响。同时,适应度函数的复杂度是算法复杂度的主要组成部分,因此适应度函数要求尽可能简单。

适应度函数通常可以从目标函数转化而来。一般来说,要求适应度的取值越大越好。但在实际问题中,有的目标函数是求最大值(如利润问题),也有的目标函数是求最小值(如费用问题)。因此在很多场合需要将目标函数转换为最大值形式并且函数值为非负的适应度函数。

(2)程序插桩

在程序流程图中,每个分支都可以用一个判断表达式来表示,该判断表达式称为分支谓词,其作用是描述了程序遍历该分支的条件,如判断语句

“if(a>b)...”中分支谓词为“a>b ”。

分支谓词的一般形式为:E1 op E2,E1和E2是算数表达式,关系运算符{},,,,,!op ∈<<=>>====。每个分支谓词都可以转换成等价形式为:F rel 0,其中F 为分支函数,其构造方法如表3-1所示。

由表可知,当分支谓词为假时,分支函数为正;当分支谓词为真时,分支函数为负。而要使某条路径被覆盖时,该路径上的所有分支谓词应取真值,则分支函数应为负。由于分支函数直接构成了适应度函数,不能为负值,故而将分支函数修改为:当分支谓词为真时,分支函数取0;当分支谓词取假时,分支函数依然取真值。因此如果某条路径的所有分支函数都为0时表示该路径被全部覆盖。在本文中,使用的适应度函数为:

123111().....1()1()1()

fit x f x f x f x =++++++ (3-3) 其中,f(x i )为各分支插桩后的分支函数值。

3.3.3 策略

(1)选择策略

选择运算也叫复制运算,模拟了生物界优胜劣汰的自然选择现象。通过选择将优胜的个体直接到下一代或通过配对交叉产生新一代个体再到下一代。选择运算的依据是个体的适应度,适应度高的个体被选择到下一代的概率就大,甚至可能被多次复制,而适应度低的个体则可能一次都没被选中而淘汰。选择的概率一般取P s 为0.1至0.2 。

常用的选择运算的方法有轮盘赌转法、随机遍历抽样、锦标赛选择等,其中以轮盘赌转法最为常用。该算法将所有染色体的适应度总和看做一个轮子的圆周,而各染色体按其适应度占适应度总和的比例值大小占据一个扇区。每次进行选择时相当于轮盘的一次转动,转到哪个扇区则该扇区的染色体被选中。这样适应度越高的染色体被选中的概率就越大。若某染色体的适应度为f(x i ),则被选

中的概率为:

()()

i s i f x P f x =∑ (3-4)

基于FPGA的递归最小二乘算法的研究与实现

摘要 软件测试是保证软件质量和可靠性重要手段,在这方面发挥着其它方法不可替代的作用。然而,软件测试是一个复杂的过程,需要耗费巨大的人力、物力和时间,约占整个软件开发成本的40%~50%。因此,提高软件测试工具的自动化程度对于确保软件开发质量、降低软件开发成本非常重要。而提高测试用例生成的自动化程度又是提高测试工具乃至整个测试过程自动化程度的关键所在,本文主要针对这一问题进行了研究和设计。 本文在分析软件测试和算法基本概念的基础上,提出软件测试用例的设计是软件测试的难点之一。论文提出了基于算法的测试用例生成的内含是应用算法来求解一组优化的测试用例,其框架包括了测试环境构造、算法及测试运行环境三部分,论文给出了基于算法的测试用例生成的模型。最后以三角形分类程序为例应用算法进行测试用例生成的模拟,结果显示,应用算法进行测试用例生成可行。 关键词:软件测试测试用例算法

ABSTRACT Software test is the important means that guarantee software quality and reliability,and in this respect,it plays the role that other method cannot replace. However software test is a complex process , it needs to consume huge manpower,material resources and time,which takes the 40%~50% of entire software development cost approximately . Therefore,raising the automation level of software test tool is very important for ensure software development quality and reduction software development cost . And then,the most important is raising the automation level of the test case generation for raising the automation level of test tool and even entire test process,so this paper study and design mainly according to this problem. Based on the analysis of basic concepts of software testing and genetic algorithm, this article proposes that software test case design is one of the difficulties of software testing. Paper presents the inherent in software test case designing based on genetic algorithm is using genetic algorithm to solve a set of optimization test cases, and the framework includes three parts which are test environment construction, genetic algorithm and the environment for test . Paper presents the model of software test case generation based on genetic algorithm. Finally, we take the triangle categorizer as an example, simulate software test case generation based on genetic algorithm. The results display that software test case generation basing on genetic algorithm is possible. KEY WORDS: software test , test case , genetic algorithm

算法设计及分析递归算法典型例题

算法递归典型例题 实验一:递归策略运用练习 三、实验项目 1.运用递归策略设计算法实现下述题目的求解过程。 题目列表如下: (1)运动会开了N天,一共发出金牌M枚。第一天发金牌1枚加剩下的七分之一枚,第二天发金牌2枚加剩下的七分之一枚,第3天发金牌3枚加剩下的七分之一枚,以后每天都照此办理。到了第N天刚好还有金牌N枚,到此金牌全部发完。编程求N和M。 (2)国王分财产。某国王临终前给儿子们分财产。他把财产分为若干份,然后给第一个儿子一份,再加上剩余财产的1/10;给第二个儿子两份,再加上剩余财产的1/10;……;给第i 个儿子i份,再加上剩余财产的1/10。每个儿子都窃窃自喜。以为得到了父王的偏爱,孰不知国王是“一碗水端平”的。请用程序回答,老国王共有几个儿子?财产共分成了多少份? 源程序: (3)出售金鱼问题:第一次卖出全部金鱼的一半加二分之一条金鱼;第二次卖出乘余金鱼的三分之一加三分之一条金鱼;第三次卖出剩余金鱼的四分之一加四分之一条金鱼;第四次卖出剩余金鱼的五分之一加五分之一条金鱼;现在还剩下11条金鱼,在出售金鱼时不能把金鱼切开或者有任何破损的。问这鱼缸里原有多少条金鱼? (4)某路公共汽车,总共有八站,从一号站发轩时车上已有n位乘客,到了第二站先下一半乘客,再上来了六位乘客;到了第三站也先下一半乘客,再上来了五位乘客,以后每到一站都先下车上已有的一半乘客,再上来了乘客比前一站少一个……,到了终点站车上还有乘客六人,问发车时车上的乘客有多少? (5)猴子吃桃。有一群猴子摘来了一批桃子,猴王规定每天只准吃一半加一只(即第二天吃剩下的一半加一只,以此类推),第九天正好吃完,问猴子们摘来了多少桃子? (6)小华读书。第一天读了全书的一半加二页,第二天读了剩下的一半加二页,以后天天如此……,第六天读完了最后的三页,问全书有多少页? (7)日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子? 四、实验过程 (一)题目一:…… 1.题目分析 由已知可得,运动会最后一天剩余的金牌数gold等于运动会举行的天数由此可倒推每一 天的金牌剩余数,且每天的金牌数应为6的倍数。 2.算法构造 设运动会举行了N天, If(i==N)Gold[i]=N; Else gold[i]=gold[i+1]*7/6+i;

递归算法的优缺点

○1优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 ○2缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 边界条件与递归方程是递归函数的二个要素 应用分治法的两个前提是问题的可分性和解的可归并性 以比较为基础的排序算法的最坏倩况时间复杂性下界为0(n·log2n)。 回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。 舍伍德算法设计的基本思想: 设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为 这显然不能排除存在x∈Xn使得的可能性。希望获得一个随机化算法B,使得对问题的输入规模为n的每一个实例均有 拉斯维加斯( Las Vegas )算法的基本思想: 设p(x)是对输入x调用拉斯维加斯算法获得问题的一个解的概率。一个正确的拉斯维加斯算法应该对所有输入x均有p(x)>0。 设t(x)是算法obstinate找到具体实例x的一个解所需的平均时间 ,s(x)和e(x)分别是算法对于具体实例x求解成功或求解失败所需的平均时间,则有: 解此方程可得:

蒙特卡罗(Monte Carlo)算法的基本思想: 设p是一个实数,且1/2

递归算法的优缺点

递归算法的优缺点: ○ 1优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 ○2缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 边界条件与递归方程是递归函数的二个要素 应用分治法的两个前提是问题的可分性和解的可归并性 以比较为基础的排序算法的最坏倩况时间复杂性下界为0(n·log2n)。 回溯法以深度优先的方式搜索解空间树T ,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T 。 舍伍德算法设计的基本思想: 设A 是一个确定性算法,当它的输入实例为x 时所需的计算时间记为tA(x)。设Xn 是算法A 的输入规模为n 的实例的全体,则当问题的输入规模为n 时,算法A 所需的平均时间为 这显然不能排除存在x ∈Xn B ,使得对问题的输入规模为n 拉斯维加斯( Las Vegas )算法的基本思想: 设p(x) 是对输入x 调用拉斯维加斯算法获得问题的一个解的概率。一个正确的拉斯维加斯算法应该对所有输入x 均有p(x)>0。 设t(x)是算法obstinate 找到具体实例x 的一个解所需的平均时间 ,s(x)和e(x)分别是算法对于具体实例x 蒙特卡罗(Monte Carlo)算法的基本思想: 设p 是一个实数,且1/2

递归算法工作栈的变化详解

通常,一个函数在调用另一个函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数的入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控制转移到调用函数.所有的这些,不论是变量还是地址,本质上来说都是"数据",都是保存在系统所分配的栈中的. ok,到这里已经解决了第一个问题:递归调用时数据都是保存在栈中的,有多少个数据需要保存就要设置多少个栈,而且最重要的一点是:控制所有这些栈的栈顶指针都是相同的,否则无法实现同步. 下面来解决第二个问题:在非递归中,程序如何知道到底要转移到哪个部分继续执行?回到上面说的树的三种遍历方式,抽象出来只有三种操作:访问当前结点,访问左子树,访问右子树.这三种操作的顺序不同,遍历方式也不同.如果我们再抽象一点,对这三种操作再进行一个概括,可以得到:a)访问当前结点:对目前的数据进行一些处理;b)访问左子树:变换当前的数据以进行下一次处理;c)访问右子树:再次变换当前的数据以进行下一次处理(与访问左子树所不同的方式). 下面以先序遍历来说明: void preorder_recursive(Bitree T) /* 先序遍历二叉树的递归算法*/ { if (T) { visit(T); /* 访问当前结点*/ preorder_recursive(T->lchild); /* 访问左子树*/ preorder_recursive(T->rchild); /* 访问右子树*/ } } visit(T)这个操作就是对当前数据进行的处理, preorder_recursive(T->lchild)就是把当前数据变换为它的左子树,访问右子树的操作可以同样理解了. 现在回到我们提出的第二个问题:如何确定转移到哪里继续执行?关键在于一下三个地方:a)确定对当前数据的访问顺序,简单一点说就是确定这个递归程序可以转换为哪种方式遍历的树结构;b)确定这个递归函数转换为递归调用树时的分支是如何划分的,即确定什么是这个递归调用树的"左子树"和"右子树"c)确定这个递归调用树何时返回,即确定什么结点是这个递归调用树的"叶子结点".

递归最小二(RLS)自适应均衡算法

第三章 递归最小二乘(RLS)自适应均衡算法 §3.1 引言 在自适应滤波系统中,最陡梯度(LMS )法由于其简单获得了广泛的应用。但各种LMS 算法均有收敛速度较慢(收敛所需码元数多),对非平稳信号的适应性差(且其中有些调整延时较大)的缺点。究其原因主要是LMS 算法只是用以各时刻的抽头参量等作该时刻数据块估计时平方误差均最小的准则,而未用现时刻的抽头参量等来对以往各时刻的数据块均作重新估计后的累积平方误差最小的原则(即所谓的最小平方(LS )准则)。 为了克服收敛速度慢,信号非平稳适应性差的缺点,根据上述内容,可采用新的准则,即在每时刻对所有已输入信号而言重估的平方误差和最小的准则(即LS 准则)。从物理概念上可见,这是个在现有的约束条件下利用了最多可利用信息的准则,即在一定意义上最有效,信号非平稳的适应性能也应最好的准则。这样建立起来的迭代方法就是递归最小二乘(RLS :Recursive Least Square )算法,又称为广义Kalman 自适应算法。 用矩阵的形式表示RLS 算法非常方便,因此我们首先定义一些向量和矩阵。假定在时刻t ,均衡器的输入信号为t r ,线性均衡器对于信息符号的估计可以表示为 ∑-=--=K K j j t j r t c t I )1()(? 式(3-1) 让)1(-t c j 的下标j 从0=j 到1-=N j ,同时定义K t v t y +=)(,则)(?t I 变为 ∑-=--=1 )()1()(?N j j j t y t c t I )()1(t Y t C N N -'= 式(3-2) 其中)1(-t C N 和)(t Y N 分别为均衡器系数)1(-t c j ,1,,1,0-=N j Λ和输入信号 )(j t y -,1,,1,0-=N j Λ的列向量。 类似的,在DFE 均衡器结构中,均衡器系数)(t c j ,1,,1,0-=N j Λ的前11+K 个系数为前向滤波器系数,剩下的112--=K N K 为反馈滤波器系数。用来预测 )(?t I 的数据为21~,~,,,11K t t t K t I I r r --++Λ,其中21,~K j I j t ≤≤-为判决器先前作出判决的数 据。这里,我们忽略判决器判错的情况,因而21,~ K j I I j t j t ≤≤=--。同时为方便起见定义

RLS递归最小二乘

实验二:实现自适应的递归最小二乘法(RLS) 一、实验目的 利用matlab实现自适应的递归最小二乘法(RLS) 二、实验过程 首先掌握RLS算法原理;然后利用matlab实现;最后得出结果; 三、实验程序 %RLS算法 randn(‘seed’,0):%seed相当于知名了产生随机数的一个起始点 rand(‘seed’,0); NoOfData=8000;%设定训练数列点的个数 Order=32;%设置自适应滤波器 Lambda=0.98;%设置遗忘因子 Delta=0.001;%对于Delta的初始化 x=randn(NoOfData,1);%假设输入为白噪声 h=rand(Order,1);%系统随机选择 d=filter(h,1,x);%产生输出 %RLS初始化 P=Delta*eye(Order,Order); w=zeros(Order,1); %RLS自适应 for n=Order:NoOfData; u=x(n:-1:n-Order+1); pi_=u’*P; k=lambda+pi_*u; K=pi_’/k; e(n)=d(n)-w’*u; w=w+K*e(n); PPrime=K*pi_; P=(P-PPrime)/Lambda; w_err(n)=norm(h-w); end %画出结果 figure(1) plot(20*log10(abs(e))); title(‘Learning Curve’); xlabel(‘Itergation Number’);%迭代次数 ylabel(‘Output Estimation Error in dB’);

相关文档
相关文档 最新文档