文档库 最新最全的文档下载
当前位置:文档库 › 基于HDevelop的形状匹配算法参数的优化研究

基于HDevelop的形状匹配算法参数的优化研究

基于HDevelop的形状匹配算法参数的优化研究
基于HDevelop的形状匹配算法参数的优化研究

模式匹配的KMP算法详解

模式匹配的KMP算法详解 模式匹配的KMP算法详解 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KMP算法。大概学过信息学的都知道,是个比较难理解的算法,今天特把它搞个彻彻底底明明白白。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?回溯,没错,注意到(1)句,为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 为什么会发生这样的情况?这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为abcdef这样的,大没有回溯的必要。

基于蚁群算法的PID控制参数优化Matlab源码

基于蚁群算法的PID控制参数优化Matlab源码 (2009-07-26 12:31:02) 除了蚁群算法,可用于PID参数优化的智能算法还有很多,比如遗传算法、模拟退火算法、粒子群算法、人工鱼群算法,等等。 function [BESTX,BESTY,ALLX,ALLY]=ACOUCP

(K,N,Rho,Q,Lambda,LB,UB,Num,Den,Delay,ts,StepNum,SigType,PIDLB,PIDUB) %% 此函数实现蚁群算法,用于PID控制参数优化 % GreenSim团队原创作品,转载请注明 % Email:greensim@https://www.wendangku.net/doc/2318280877.html, % GreenSim团队主页:https://www.wendangku.net/doc/2318280877.html,/greensim % [color=red]欢迎访问GreenSim——算法仿真团队→[url=https://www.wendangku.net/doc/2318280877.html,/greensim] https://www.wendangku.net/doc/2318280877.html,/greensim[/url][/color] %% 输入参数列表 % K 迭代次数 % N 蚁群规模 % Rho 信息素蒸发系数,取值0~1之间,推荐取值0.7~0.95 % Q 信息素增加强度,大于0,推荐取值1左右 % Lambda 蚂蚁爬行速度,取值0~1之间,推荐取值0.1~0.5 % LB 决策变量的下界,M×1的向量 % UB 决策变量的上界,M×1的向量 % Num 被控制对象传递函数的分子系数向量 % Den 被控制对象传递函数的分母系数向量 % Delay 时间延迟 % ts 仿真时间步长 % StepNum 仿真总步数 % SigType 信号类型,1为阶跃信号,2为方波信号,3为正弦波信号 % PIDLB PID控制输出信号限幅的下限 % PIDUB PID控制输出信号限幅的上限 %% 输出参数列表 % BESTX K×1细胞结构,每一个元素是M×1向量,记录每一代的最优蚂蚁 % BESTY K×1矩阵,记录每一代的最优蚂蚁的评价函数值 % ALLX K×1细胞结构,每一个元素是M×N矩阵,记录每一代蚂蚁的位置 % ALLY K×N矩阵,记录每一代蚂蚁的评价函数值

关于快速高效的模式匹配算法的剖析与改进

关于快速高效的模式匹配算法的剖析与改进 摘要:模式匹配算法是现代化网络入侵检测中的关键环节,本文主要介绍了几种常用的模式匹配算法,并在此基础上,提出一种更快捷、更高效的改进方法,以提高模式匹配的效率与质量,确保网络安全。 关键词:模式匹配入侵检测改进 随着我国计算机与网络技术的飞速发展,网络应用已涉及到人们生产、生活的各个领域,其重要性日益凸显。随之而来的网络攻击问题也备受关注,给网络安全性带来挑战。传统的网络防御模式,主要采取身份认证、防火墙、数据加密等技术,但是与当前网络发展不适应。在此背景下,入侵检测技术营运而生,并建立在模式匹配基础上,确保检测的快捷性、准确性,应用越来越广泛。 1、模式匹配原理概述 模式匹配是入侵检测领域的重要概念,源自入侵信号的层次性。结合网络入侵检测的底层审计事件,从中提取更高层次的内容。通过高层事件形成的入侵信号,遵循一定的结构关系,将入侵信号的抽象层次进行具体划分。入侵领域大师kumar将这种入侵信号划分为四大层次,并将每一个层次与匹配模式相对应。以下将分别对四大层次进行分析: (1)存在。只要存在审计事项,就可以证明入侵行为的发生,并深层次挖掘入侵企图。存在主要对应的匹配模式就是“存在模式”。可以说,存在模式就是在固定的时间内,检查系统中的特定状态,

同时判断系统状态。 (2)序列。一些入侵的发生,是遵循一定的顺序,而组成的各种行为。具体表现在一组事件的秩序上。序列对应的是“序列模式”,在应用序列模式检测入侵时,主要关注间隔的时间与持续的时间。 (3)规则。规则表示的是一种可以扩展的表达方式,主要通过and 逻辑表达来连接一系列的描述事件规则。一般适用于这种模式的攻击信号由相关活动组成,这些活动之间往往不存在事件的顺序关系。 (4)其他。其他模式是不包含前面几种方法的攻击,在具体应用过程中,难以与其他入侵信号进行模式匹配,大多为部分实现方式。 2、几种常用的模式匹配算法 2.1 ac算法 ac算法(aho-corasick)是一种可以同时搜索若干个模式的匹配算法,最早时期在图书馆书目查询系统中应用,效果良好。通过使用ac算法,实现了利用有限状态自动机结构对所有字符串的接收过程。自动机具有结构性特征,且每一个前缀都利用唯一状态显示,甚至可同时应用于多个模式的前缀中。如果文本中的某一个字符不属于模式中预期的下一个字符范围内,或者可能出现错误链接的指向状态等,那么最长模式的前缀同时也可作为当前状态相对应的后缀。ac算法的复杂性在于o(n),预处理阶段的复杂性则在于o(m)。在采取ac算法的有限状态自动机中,应该在每一个字符的模式串中分别建立节点,提高该算法的使用效率与质量。目前,应用有限

字符串的模式匹配算法

在前面的图文中,我们讲了“串”这种数据结构,其中有求“子串在主串中的位置”(字符串的模式匹配)这样的算法。解决这类问题,通常我们的方法是枚举从A串(主串)的什么位置起开始与B串(子串)匹配,然后验证是否匹配。假设A串长度为n,B串长度为m,那么这种方法的复杂度是O(m*n)的。虽然很多时候复杂度达不到m*n(验证时只看头一两个字母就发现不匹配了),但是我们有许多“最坏情况”,比如: A=“aaaaaaaaaaaaaaaaaaaaaaaaab”,B=“aaaaaaaab”。 大家可以忍受朴素模式匹配算法(前缀暴力匹配算法)的低效吗?也许可以,也许无所谓。 有三位前辈D.E.Knuth、J.H.Morris、V.R.Pratt发表一个模式匹配算法,最坏情况下是O(m+n),可以大大避免重复遍历的情况,我们把它称之为克努特-莫里斯-普拉特算法,简称KMP算法。 假如,A=“abababaababacb”,B=“ababacb”,我们来看看KMP是怎样工作的。我们用两个指针i和j分别表示,。也就是说,i是不断增加的,随着i 的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。 例子: S=“abcdefgab” T=“abcdex” 对于要匹配的子串T来说,“abcdex”首字符“a”与后面的串“bcdex”中任意一个字符都不相等。也就是说,既然“a”不与自己后面的子串中任何一字符相等,那么对于主串S来说,前5位字符分别相等,意味着子串T的首字符“a”不可能与S串的第2到第5位的字符相等。朴素算法步骤2,3,4,5的判断都是多余,下次的起始位置就是第6个字符。 例子: S=“abcabcabc” T=“abcabx”

模式匹配算法的设计与实现

五、详细设计 #include #include #include #include using namespace std; #define MAX 100000 #define M 69 class String { private: int n; char *str; int *count; //记录子串在主串中出现的位置 int Find(int i,String &P); // 简单匹配算法找到最近的匹配串后立即停止,而不向下继续且缺乏一个数组记录位置 int *f ; //记录失败函数 void Fail(); int KMPFind(int i,String &P); //改进的失败函数 void ImproveFail(); int KMPFindImprove(int i,String &P); public: String(); //建立一个空串 String(const char *p); String(const String &p); //拷贝函数 ~String(); int Length() {return n;}; //返回当前串对象长度 void Output() {cout<

int KMPFindImprove(String &P); //改进的KMP匹配算法 void Output2(); //输出子串在主串中出现的位置 }; int String::KMPFindImprove(String &P) { int sum=0; int j=KMPFindImprove(0,P); while(j!=-1) { count[sum++]=j; if(j<=n-P.n) j=KMPFindImprove(j+P.n,P); } return sum; } void String::Output2() //输出子串在主串中的位置 { int i=0; while(count[i]!=count[i+1] && i

基于粒子群算法的控制系统PID参数优化设计

基于粒子群算法的控制系统 PID 参数优化设计 摘 要 本文主要研究基于粒子群算法控制系统PID 参数优化设计方法以及对PID 控制的 改进。PID 参数的寻优方法有很多种,各种方法的都有各自的特点,应按实际的系统特点选择适当的方法。本文采用粒子群算法进行参数优化,主要做了如下工作:其一,选择控制系统的目标函数,本控制系统选用时间乘以误差的绝对值,通过对控制系统的逐步仿真,对结果进行分析。由于选取的这个目标函数的解析式不能直接写出,故采用逐步仿真来实现;其二,本文先采用工程上的整定方法(临界比例度法)粗略的确定其初始的三个参数p K ,i K ,d K ,再利用粒子群算法进行寻优,得到更好的PID 参数;其三,采用SIMULINK 的仿真工具对PID 参数优化系统进行仿真,得出系统的响应曲线。从中发现它的性能指标,都比原来有了很大的改进。因此,采用粒子群算法的优越性是显而易见的。 关键词 目标函数;PID 参数;粒子群算法;优化设计;SIMULINK

Optimal design of PID parameter of the control system based on Particle Swarm Optimization Abstract The main purpose of this paper is to study the optimal design of PID parameter of the control system based on Particle Swarm Optimization and find a way to improve the PID control. There are a lot of methods of optimization for the parameters of PID, and each of them has its own characteristics. The proper methods need to be selected according to the actual characteristics of the system. In this paper we adopt the Particle Swarm Optimization to tune the parameters. To finish it, the following tasks should be done. First, select the target function of the control system. The target function of the control system should be chosen as the absolute value of the error multiplied by time. Then we simulate the control system gradually, and analyze the results of the process. Because the solution of the target function cannot be worked out directly, this design adopts simulation gradually. Second, this paper adopts the engineering method (the critical ratio method) to determine its initial parameters p K ,i K ,d K , then uses the Particle Swarm Optimization to get a series better PID parameters. Third, this paper uses the tool of SIMULINK to optimize the parameters of PID and gets the response curve of the system. By contrast with the two response curves, it is clearly that the performance has improved a lot than the former one. Therefore, it is obviously to find the advantages in using the Particle Swarm Optimization. Key word : target function; PID parameters; Particle Swarm Optimization; optimal design; SIMULINK

实验三____串的模式匹配

实验三串的模式匹配 一、实验目的 1.利用顺序结构存储串,并实现串的匹配算法。 2.掌握简单模式匹配思想,熟悉KMP算法。 二、实验要求 1.认真理解简单模式匹配思想,高效实现简单模式匹配; 2.结合参考程序调试KMP算法,努力算法思想; 3.保存程序的运行结果,并结合程序进行分析。 三、实验内容 1、通过键盘初始化目标串和模式串,通过简单模式匹配算法实现串的模式匹配,匹配成功后要求输出模式串在目标串中的位置; 2、参考程序给出了两种不同形式的next数组的计算方法,请完善程序从键盘初始化一目标串并设计匹配算法完整调试KMP算法,并与简单模式匹配算法进行比较。 参考程序: #include "stdio.h" void GetNext1(char *t,int next[])/*求模式t的next值并寸入next数组中*/ { int i=1,j=0; next[1]=0; while(i<=9)//t[0] { if(j==0||t[i]==t[j]) {++i; ++j; next[i]=j; } else j=next[j]; } } void GetNext2(char *t , int next[])/* 求模式t 的next值并放入数组next中 */ { int i=1, j = 0; next[1]= 0; /* 初始化 */ while (i<=9) /* 计算next[i+1] t[0]*/ { while (j>=1 && t[i] != t[j] ) j = next[j]; i++; j++;

if(t[i]==t[j]) next[i] = next[j]; else next[i] = j; } } void main() { char *p="abcaababc"; int i,str[10]; GetNext1(p,str); printf("\n"); for(i=1;i<10;i++) printf("%d",str[i]); GetNext2(p,str); printf("\n"); for(i=1;i<10;i++) printf("%d",str[i]); printf("\n\n"); }

模式匹配KMP算法实验报告

实验四:KMP算法实验报告 一、问题描述 模式匹配两个串。 二、设计思想 这种由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现的改进的模式匹配算法简称为KM P算法。 注意到这是一个改进的算法,所以有必要把原来的模式匹配算法拿出来,其实理解的关键就在这里,一般的匹配算法: int Index(String S,String T,int pos)//参考《数据结构》中的程序 { i=pos;j=1;//这里的串的第1个元素下标是1 while(i<=S.Length && j<=T.Length) { if(S[i]==T[j]){++i;++j;} else{i=i-j+2;j=1;}//**************(1) } if(j>T.Length) return i-T.Length;//匹配成功 else return 0; } 匹配的过程非常清晰,关键是当‘失配’的时候程序是如何处理的?为什么要回溯,看下面的例子: S:aaaaabababcaaa T:ababc aaaaabababcaaa ababc.(.表示前一个已经失配) 回溯的结果就是 aaaaabababcaaa a.(babc) 如果不回溯就是 aaaaabababcaaa aba.bc 这样就漏了一个可能匹配成功的情况 aaaaabababcaaa ababc 这是由T串本身的性质决定的,是因为T串本身有前后'部分匹配'的性质。如果T为a bcdef这样的,大没有回溯的必要。 改进的地方也就是这里,我们从T串本身出发,事先就找准了T自身前后部分匹配的位置,那就可以改进算法。 如果不用回溯,那T串下一个位置从哪里开始呢? 还是上面那个例子,T为ababc,如果c失配,那就可以往前移到aba最后一个a的位置,像这样:

基于遗传算法的参数优化估算模型

基于遗传算法的参数优化估算模型 【摘要】支持向量机中参数的设置是模型是否精确和稳定的关键。固定的参数设置往往不能满足优化模型的要求,同时使得学习算法过于死板,不能体现出来算法的智能化优点,因此利用遗传算法(Genetic Algorithm,简称GA)对估算模型的参数进行优化,使得估算模型灵活、智能,更加符合实际工程建模的需求。 【关键词】遗传算法;参数优化;估算模型 1.引言 随着支持向量机估算模型在工程应用的不断深入。研究发现,支持向量机算法(包括LS-SVM算法)存在着一些本身不可避免的缺陷,最为突出的是参数的选取和优化问题,以往在参数选取方面,一般依靠专家系统或者设定初始值盲目搜寻等等,在实际应用必然会影响模型的精准度,造成一定影响。如何选取合理的参数成为支持向量机算法应用过程中应用中关注的问题,同时也是目前应用研究的重点。而常用的交叉验证试算的方法,不仅耗时,且搜索目的不清,使得资源浪费,耗时耗力。不能有效的对参数进行优化。 针对参选取的问题,本文使用GA算法对模型中的参数设置进行优化。 2.遗传算法 2.1 遗传算法的实施过程 遗传算法的实施过程中包括了编码、产生群体、计算适应度、复制、交换、变异等操作。图1详细的描述了遗传算法的流程。 其中,变量GEN是当前进化代数;N是群体规模;M是算法执行的最大次数。 遗传算法在参数寻优过程中,基于生物遗传学的基本原理,模拟自然界生物种群的“物竞天则,适者生存”的自然规律。把自变量看作生物体,把它转化成由基因构成的染色体(个体),把寻优的目标函数定义为适应度,未知函数视为生存环境,通过基因操作(如复制、交换和变异等),最终求出全局最优解。 2.2 GA算法的基本步骤 遗传算法操作的实施过程就是对群体的个体按照自然进化原则(适应度评估)施加一定的操作,从而实现模型中数据的优胜劣汰,使得进化过程趋于完美。从优化搜索角度出发,遗传算法可使问题的解,一代一代地进行优化,并逼近最优解。 通常采用的遗传算法的工作流程和结果形式有Goldberg提出的,常用的GA 算法基本步骤如下: ①选择编码策略,把参数集合X和域转换为位串结构空间S。常用的编码方法有二进制编码和浮点数编码。 ②定义合适的适应度函数,保证适应度函数非负。 ③确定遗传策略,包括选择群体大小,选择、交叉、变异方法,以及确定交叉概率、变异概率等其它参数。 ④随机初始化生成群体N,常用的群体规模:N=20~200。 ⑤计算群体中个体位串解码后的适应值。 ⑥按照遗传策略,运用选择、交叉和变异算子作用于群体,形成下一代群体。 ⑦判断群体性能是否满足某一个指标,或者以完成预订迭代次数,若满足则

基于自适应果蝇优化算法的PID参数优化

2018年10月 第46卷第20期 机床与液压 MACHINETOOL&HYDRAULICS Oct 2018 Vol 46No 20 DOI:10.3969/j issn 1001-3881 2018 20 033 收稿日期:2017-05-09 基金项目:陕西省重点研发计划资助项目(2018GY?042);咸阳市科技局资助项目(2017K02?05) 作者简介:李明辉(1972 ),男,博士,教授,主要从事智能及高级过程控制的研究三E-mail:60334@sust edu cn三 基于自适应果蝇优化算法的PID参数优化 李明辉1,曹泽1,王玉洁2 (1 陕西科技大学机电工程学院,陕西西安710021;2 上海亚太计算机信息系统有限公司,上海200040) 摘要:针对基本果蝇优化算法(FOA)控制精度不高且易陷入局部最优的缺陷,提出一种自适应果蝇优化算法 (IFOA)的PID参数优化方案三该算法以控制偏差绝对值和输入平方项的时间积分作为适应度函数,经过迭代寻优得到最优的PID参数值三通过二阶时滞系统测试并与基本果蝇优化算法比较,结果表明:该算法控制精度高二响应速度快二鲁棒性好,为PID参数优化提供了参考三 关键词:自适应果蝇优化算法(IFOA);适应度函数;PID;参数优化 中图分类号:TP273一一文献标志码:A一一文章编号:1001-3881(2018)20-144-4 OptimizationofPIDParametersBasedonImprovedFruit?flyOptimizationAlgorithm LIMinghui1,CAOZe1,WANGYujie2 (1 CollegeofMechanicalandElectricalEngineering,ShaanxiUniversityofScience&Technology,Xi anShaanxi710021,China;2 ShanghaiAsia&PacificComputerInformationSystemCo.,Ltd.,Shanghai200040,China) Abstract:Aimingatthedefectsofthebasicfruit?flyoptimizationalgorithm(FOA),thecontrolaccuracywasnothighandeasy tofallintolocaloptimum,amethodforparameteroptimizationofPIDcontrollerbasedonimprovedfruit?flyoptimizationalgorithm(IFOA)wasproposed,inwhichabsoluteerrorandthesquareofcontrolinputwereusedasfitnessfunctionandtheoptimalPIDparametervaluewasobtainedthroughiterativeoptimization.Comparedwiththebasicfruit?flyoptimizationalgorithm,thesimulationresultsshowthatthealgorithmhashighcontrolprecision,fastresponseandrobustnessthroughtwoorderdelaysystemtest.ItprovidesareferenceforPIDparameteroptimization. Keywords:Improvedfruit?flyoptimizationalgorithm(IFOA);Fitnessfunction;PID;Parameteroptimization 0一前言 PID控制器由于其算法简单二鲁棒性好二可靠性 高,被广泛应用于工业过程控制中[1]三传统的PID 控制器参数整定采用人工经验,很难得到理想的最优值三目前,随着人工智能技术的发展,不少学者针对PID参数整定提出新的算法,如遗传算法二粒子群算法等得到了一定的效果[2]三这些算法灵活二简单二易理解,在解决工业过程控制的实际问题中具有非常广阔的应用前景[3]三然而,遗传算法编程复杂,参数较多;粒子群算法在进化后期收敛速度减慢,同时陷入局部最优的可能性加大三 果蝇优化算法(Fruit?flyOptimizationAlgorithm,FOA)是2011年台湾学者潘文超提出的一种新的全局优化进化算法[4]三该算法由于程序代码简单二易于 理解二参数较少,且全局寻优能力强二收敛速度快等优点,在近几年来引起广泛关注[5]三JHAN等[6]采用果蝇优化算法进行PID参数整定,得到FOA避免早熟的结论;YLIU等[7 -8] 采用混沌搜索的FOA算法整 定PID参数,减少了适应度波动;宋娟[9]采用FOA与PSO相结合的混合寻优来优化PID整定参数,使得控制器有较好的控制效果和收敛特性三 作者针对基本果蝇优化算法(FOA)寻优精度不高二容易陷入局部最优的缺陷,提出一种自适应果蝇优化算法[10]的PID参数优化方案三通过在果蝇搜索过程中引入半径调节系数以及选择合适的适应度函数,对PID的3个参数进行了优化三结果表明该算法能够快速高效地寻找到最优参数,有效提高了PID控制器的控制精度三 1一PID控制器基本原理 PID控制器是通过对偏差信号进行比例二积分二微分3个参数的控制,使得系统表现较好性能三PID控制原理如图1所示 三 图1一PID控制系统框图

串的模式匹配算法实验报告

竭诚为您提供优质文档/双击可除串的模式匹配算法实验报告 篇一:串的模式匹配算法 串的匹配算法——bruteForce(bF)算法 匹配模式的定义 设有主串s和子串T,子串T的定位就是要在主串s中找到一个与子串T相等的子串。通常把主串s称为目标串,把子串T称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串T;不成功则指目标串s中不存在模式串T。bF算法 brute-Force算法简称为bF算法,其基本思路是:从目标串s的第一个字符开始和模式串T中的第一个字符比较,若相等,则继续逐个比较后续的字符;否则从目标串s的第二个字符开始重新与模式串T的第一个字符进行比较。以此类推,若从模式串T的第i个字符开始,每个字符依次和目标串s中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,算法返回0。 实现代码如下:

/*返回子串T在主串s中第pos个字符之后的位置。若不存在,则函数返回值为0./*T非空。 intindex(strings,stringT,intpos) { inti=pos;//用于主串s中当前位置下标,若pos不为1则从pos位置开始匹配intj=1;//j用于子串T中当前位置下标值while(i j=1; } if(j>T[0]) returni-T[0]; else return0; } } bF算法的时间复杂度 若n为主串长度,m为子串长度则 最好的情况是:一配就中,只比较了m次。 最坏的情况是:主串前面n-m个位置都部分匹配到子串的最后一位,即这n-m位比较了m次,最后m位也各比较了一次,还要加上m,所以总次数为:(n-m)*m+m=(n-m+1)*m从最好到最坏情况统计总的比较次数,然后取平均,得到一般情况是o(n+m).

高效的多模式匹配算法

东方企业文化·百家论坛 2011年9月 163 高效的多模式匹配算法 马 力 (重庆青年职业技术学院,重庆,400712) 摘 要:本文提出一种新的多模式匹配算法,以提高匹配检测的执行速度和效率。该算法采用了基于集合的多模式匹配思想,重新构造了HASH 函数以便在处理大规模模式集时执行时间能比传统的匹配算法的执行时间要少。经过实验证明,运用该算法不仅具有时间复杂度较低的优点,且与传统算法相比具有更为优越的性能,同时在实际工作状态下的检测能力也更强大。 关键词:多模式匹配 HASH 函数 中图分类号:TP393 文献标识码:A 文章编号:1672—7355(2011)09—0163—01 一、算法描述 通常在自然文本中,经常会发生所谓的坏字符移动。此时会极大提高Boyer-Moore 算法的检测效率。但是当文本与多个模式进行匹配时,文本中的多数字符都可能与某些模式的最后一个字符相匹配(即匹配冲突),这时发生坏字符移动的可能性就非常小了。本文提出的算法解决了如何在上述情况下继续保持Boyer-Moore 算法的实质与效率的问题,采用散列(Hash )技术和高效过滤等方法,减小了匹配冲突对算法执行效率的影响。算法描述如下: 首先,算法需要计算出模式的最小长度,设其值为m ,为简化算法描述,假定所有模式均具有相同的长度,同时保证最小长度合理以免影响匹配效率。 假设P 为模式的集合,P={P 1P 2……P K },K=|P|,P 中所有模式的长度均为m 。T 为网络数据包,T=t 1t 2……t n (n ≧m )。 选取Q 为足够大空间的常数,定义长度为m 的支字符串R=r 1r 2……r m ,则构造出R 的Hash 函数:∑=?=m i i m i S r Q R Hash 1mod )(,其中S 为上文所提的模式的P 集合。 二、算法流程设计 1. 预处理阶段 首先需要对模式进行排序,形成有序模式链表;然后主要完成三张表(SHIFT 表、HASH 表和PREFIX 表)的创建。SHIFT 表主要用于确定扫描文本时可移动的字符数。根据SHIFT 表中的取值分为两种处理情况:SHIFT[i ]≠0:直接根据SHIFT[i ]中的取值,确定移动的字符数。SHIFT[i ]=0:即前面提到的匹配冲突。此时需要根据HASH 表和PREFIX 表确定匹配的候选模式并最终核实该模式。 (1)SHIFT 表的创建在此处起到与Boyer-Moore 算法中相同的移动指示作用,只不过移动字符的数目基于长度为B 的字符块。假设SHIFT 表中包含了每个大小为B 的字符串的入口,那么它的大小为|∑|B 。为了减少表存储空间,采用了散列函数,将每个长度为B 的字符串映像为一个索引SHIFT 表的整数。设X=x 1x 2……x b 为文本中的b 个字符串,并假设X 已经被映像为SHIFT 表中的一个入口,则过程SHIFT Table Set Value ()有以下两种情况: X 不属于substring (P ) :SHIFT[i]=m-B+I ; X 属于substring (P ) :SHIFT[i]=m-q ; (q 为P i 中X 发生匹配的最右端位置)。 SHIFT 表中的所有初始值均为m-B+1,考虑每个模式 P=P 1P 2……P K ,将每个大小为i j B j B j P p p p B )(21"+?+?的子 串映像到SHIFT 表中。 通常情况下,SHIFT 表项的取值总是大于0,因此能够成功地跳过文本块并继续扫描文本。但是当模式数量增多时,情况就完全不同了。当模式数量增多时,SHIFT 表项取值为0的概率也呈线性递增趋势,即发生匹配冲突的可能性越来越大。本文设计的该算法的核心思想就是采用散列技术来最小化需要处理模式的数目,避免与模式链表中的每个模式逐一进行匹配,同时结合PREFIX 表的过滤作用,加速搜索过程。 (2)HASH 表的创建创建HASH 表,并使用前面计算出的用于索引SHIFT 表的B 个字符串映像整数作为该表的索引。设HASH 表的第i 个入口为HASH[i],它包含了一个指向最后B 个字符散列值为i 的模式链表的指针。链表PAT_POINT 用于存储指向模式的指针,每个模式按其最后B 个字符的散列值大小排序。设h 为文本当前后缀的散列值,并假设SHIFT[i ]=0,此时HASH[h]的取值指针p 指向散列值为h 的模式链表首部。为查找链表尾,指针不断递增直至它等于HASH[h+1]。如果SHIFT[i ]≠0,则有HASH[h]= HASH[h+1],因为不存在后缀散列值为h 的模式。 (3)PREFIX 表的创建多模式中肯定会出现相同后缀的情况,导致HASH 表冲突,即所有具有相同后缀的模式将映像到HASH 表中的同一入口。为了加快在相同后缀中查找确切匹配模式的速度,算法还引入了用于区分这些模式的一个称为PREFIX 的表。除了将所有模式的后B 个字符做一映像之外,还须将所有模式的前B 个字符映像到PREFIX 表中。 如果发现SHIFT 值为0,并且要在HASH 表中确定是否存在匹配,那么就在PREFIX 表中检查该值。对每个后缀而言,HASH 表不仅包含具有所有此后缀的模式,而且还包含了他们相应的前缀。可以通过左移m-B 个位置计算出文本中的相应前缀,并用它来过滤那些后缀相同但是前缀不同的模式。 2. 扫描阶段 扫描阶段的流程如下:(1)计算tm-B+1到tm 的基于文本当前B 个字符的散列值h ;(2)检查SHIFT[h]的取值,如大于0,移动文本返回(1),否则转至(3);(3)从当前位置向左m 个字符处开始计算文本中的前缀散列值,称为文本前缀;(4)检查每个p ,SHIFT[h]≦p <HASH[h+1],是否有PREFIX[P]=text-prefix 。如果相等,那么就直接检查与文本相对应的实际模式(由PAT_POINT[p]给出)。 参考文献: [1] Crosbie , Gene Spafford. Defending a Computer System using Autonomous Agent[R].COAST Technical Report No.95-022, March 1994. [2] Aho A , Corasick M. Efficient String Matching an Aid to Bibliographic Search [J]. Communication of the ACM , 1975, 18(6) : 333-340.

串的朴素模式匹配算法(BF算法)

//算法功能:串的朴素模式匹配是最简单的一种模式匹配算法,又称为 Brute Force 算法,简称为BF算法 #include #include #define MAXL 255 #define FALSE 0 #define TRUE 1 typedef int Status; typedef unsigned char SString[MAXL+1]; //生成一个其值等于串常量strs的串T void StrAssign(SString &T, char *strs) { int i; T[0] = 0; //0号单元存储字串长度 for(i = 0; strs[i]; i++) //用数组strs给串T赋值 T[i+1] = strs[i]; T[0] = i; } //返回子串T在主串S中第pos个字符开始匹配的位置,若不存在,则返回0 int Index(SString S, SString T, int pos) { int i = pos, j = 1; while(i <= S[0] && j <= T[0]) { if(S[i] == T[j]) //继续比较后面的字符 { i++; j++; } else//指针回退,重新开始匹配 { i = i -j + 2; j = 1; } } if(j > T[0]) return i - T[0]; else return 0;

int main() { SString S, T; int m; char strs1[MAXL]; //建立主串S char strs2[MAXL]; //建立模式串T printf("请输入主串和子串:\n"); printf("主串S: "); scanf("%s", strs1); printf("子串T: "); scanf("%s", strs2); StrAssign(S, strs1); StrAssign(T, strs2); m = Index(S, T, 1); if(m) printf("主串 S = {%s}\n子串 T = {%s}\n在第 %d 个位置开始匹配!\n", strs1, strs2, m); else printf("主串 S = {%s}\n子串 T = {%s}\n匹配不成功!\n", strs1, strs2); return 0; }

机器学习工具WEKA的使用总结 包括算法选择、属性选择、参数优化

一、属性选择: 1、理论知识: 见以下两篇文章: 数据挖掘中的特征选择算法综述及基于WEKA的性能比较_陈良龙 数据挖掘中约简技术与属性选择的研究_刘辉 2、weka中的属性选择 2.1评价策略(attribute evaluator) 总的可分为filter和wrapper方法,前者注重对单个属性进行评价,后者侧重对特征子集进行评价。 Wrapper方法有:CfsSubsetEval Filter方法有:CorrelationAttributeEval 2.1.1Wrapper方法: (1)CfsSubsetEval 根据属性子集中每一个特征的预测能力以及它们之间的关联性进行评估,单个特征预测能力强且特征子集内的相关性低的子集表现好。 Evaluates the worth of a subset of attributes by considering the individual predictive ability of each feature along with the degree of redundancy between them.Subsets of features that are highly correlated with the class while having low intercorrelation are preferred. For more information see: M.A.Hall(1998).Correlation-based Feature Subset Selection for Machine Learning.Hamilton,New Zealand. (2)WrapperSubsetEval Wrapper方法中,用后续的学习算法嵌入到特征选择过程中,通过测试特征

粒子群算法优化模糊pid

本文选取常见的二阶惯性加纯滞后环节,传递函数为: )1)(1(21++=-s T s T e G s s τ 在这里,3.0,2,,121===τT T PID 参数取为2,1,2===i d p K K K 本设计中的模糊控制器采用两输入(e, ec),三输出(P,I,D)的形式来调整PID 参数。e 的论域为[-3,3],ec 的论域为[-3,3]。推理机使用 {,,,,,,}NB NM NS O PS PM PB ,表示{负大,负中,负小,零,正小,正中,正大}为了可以调节尽可能多的系统,此控制器选定在负边界处与正边界处分别选用平滑连续的Z 型隶属度函数与S 型隶属度函数,在中间部分采用灵敏度较强的三角形隶属度函数。规则表如下图所示: (1)主程序: clear clc %% 参数设置 w = 0、6; % 惯性因子 c1 = 1、414; % 加速常数 c2 = 1、623; % 加速常数 Dim = 5; % 维数 SwarmSize = 100; % 粒子群规模 ObjFun = @PSO_PID; % 待优化函数句柄

MaxIter = 100; % 最大迭代次数 MinFit = 0、01; % 最小适应值 Vmax = 2; Vmin =-2; Ub = [20 50 1 1 1]; Lb = [0 0 0 0 0]; %% 粒子群初始化 Range = ones(SwarmSize,1)*(Ub-Lb); Swarm = rand(SwarmSize,Dim)、*Range + ones(SwarmSize,1)*Lb; % 初始化粒子群 VStep = rand(SwarmSize,Dim)*(Vmax-Vmin) + Vmin; % 初始化速度 fSwarm = zeros(SwarmSize,1); for i=1:SwarmSize fSwarm(i,:) = feval(ObjFun,Swarm(i,:)); % 粒子群的适应值 end %% 个体极值与群体极值 [bestf,bestindex]=min(fSwarm); zbest=Swarm(bestindex,:); % 全局最佳 gbest=Swarm; % 个体最佳 fgbest=fSwarm; % 个体最佳适应值 fzbest=bestf; % 全局最佳适应值 %% 迭代寻优 iter = 0; y_fitness = zeros(1,MaxIter); % 预先产生4个空矩阵 K_p = zeros(1,MaxIter);

相关文档