• 1.35 MB
  • 27页

软件架构项目报告

  • 27页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'软件架构项目报告 目录1项目概述42需求分析42.1系统用例图和流程图42.2功能需求52.3非功能性需求62.3.1性能需求62.3.2质量需求62.3.3安全性需求62.4可行性分析62.4.1技术可行性72.4.2经济可行性72.4.3操作可行性73总体设计74详细设计74.1感知哈希算法74.1.1算法概述74.1.2算法详细步骤84.2Levenshtein距离算法104.2.1算法概述104.2.2生成图片的指纹114.2.3计算编辑距离,得出相似度134.3欧式距离相似度算法164.3.1算法概述164.3.2算法步骤164.4加权最优解194.4.1算法概述194.4.2算法步骤195系统实现20 5.1界面设计215.2系统集成215.2.1系统目录结构215.2.2structs具体实现225.3系统环境和运行235.3.1系统环境235.3.2运行效果236测试27 1项目概述2需求分析2.1系统用例图和流程图使用基于场景的用例分析方法可知,在操作系统的场景中用户可进行的操作如下:(1)用户加载目标股票的TXT文件,将目标股票的TXT文件生成股票走势图(2)将目标走势图与其他走势图进行比较,计算两两之间的相似度(3)选取与目标走势图相似度最高的走势图(4)输出结果并保存系统用例图如下所示:相应的流程图如下: 2.2功能需求通过上面对系统的分析可知,系统核心的功能主要有如下几种:(1)批量导入样本文件;(2)形成走势图,即股市中的K线图;(3)计算相似度,并选取相似度最大的走势图;因此可以将整个系统分为两大功能模块,功能模块图如下所示: 2.3非功能性需求2.3.1性能需求由于系统运行需要导入大量的数据,因此要求系统在算法实现上能保证尽可能的提供运行效率,降低反应时间。同时,本系统是对股市行情的研究比较,开发的系统要求结果准确。2.3.2质量需求对于系统的相关质量的属性需求如下表:质量属性序列号质量属性要求说明1有导入目标股票的TXT文件方法2有三种不同算法来计算相似度3界面简洁大方,方便操作2.3.3安全性需求1.服务器应该在合适温度、适度的环境下工作,避免剧烈的震动;2.各种电源线和数据线的铺设要合理而安全,避免出现意外脱接现象的发生;3.服务器所在地区应保持电压稳定及电源的持续供应,尽量避免高频率的人为断电现象(例如:错拉电闸、保险丝熔断等),以保持服务器中数据的一致性;4.当提前获知断电时间时,应在网页上及时发布相关信息(例如:服务器将于几时几分关闭),避免站点的突然关闭;5.服务器管理员应确保服务器密码不泄漏;6.服务器所在房间应做好安全防盗工作,避免盗窃现象的发生。2.4可行性分析 2.4.1技术可行性系统实现依靠相对比较熟悉的HTML、JavaScript、java语言,功能实现也相对简单。因此完成此项目的风险较小。2.4.2经济可行性本系统所用到的应用软件、硬件系统都易于获得.因此,开发成本较低。而引进使用本系统后,与传统方式相比,具有高效率、低成本、高质量的特点,可以节省不少人力、物力及财力。所以,从经济的角度来看,该系统可行。2.4.3操作可行性本系统是直接面对用户的,而用户往往对计算机并不是非常熟悉。这就要求系统能够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求系统应该尽量使用用户熟悉的术语和中文信息的界面,从而保证系统的易用性。界面简洁友好,操作方便。3总体设计4详细设计4.1感知哈希算法4.1.1算法概述感知哈希算法pHash(PerceptualHashAlgorithm),意思是为图片生成一个指纹(字符串格式),两张图片的指纹越相似,说明两张图片就越相似.。为降低均值对算法的影响程度,pHash算法使用离散余弦变换(DCT)来获取图片的低频成分。而对于两张图片相似度的计算则是基于汉明距离的。 离散余弦变换(DCT)是种图像压缩算法,它将图像从像素域变换到频率域。然后一般图像都存在很多冗余和相关性的,所以转换到频率域之后,只有很少的一部分频率分量的系数才不为0,大部分系数都为0(或者说接近于0)。汉明距离是以理查德·卫斯里·汉明的名字命名的。在信息论中,汉明距离描述的是两个n长码字x=(x1x2⋯xn),y=(y1y2⋯yn)之间的距离,Dx,y=k=1nxkyk其中,表示模2加运算,xk∈0,1,yk∈{0,1}.D(x,y)表示两码字在相同位置上不同码符号的数目的总和,它能够反映两码字之间的差异,进而提供码字之间的相似程度的客观依据。4.1.2算法详细步骤(1)缩小尺寸:pHash以小图片开始,但图片大于8*8,32*32是最好的。这样做的目的是简化了DCT的计算,而不是减小频率。具体的代码实现如下图:(2)简化色彩:将图片转化成灰度图像,进一步简化计算量。下图是转化为灰度图像的函数grayscale()的实现;(3)计算DCT:计算图片的DCT变换,得到32*32的DCT系数矩阵。下图是进 行二维DCT变换的函数applyDCT()的实现。(4)缩小DCT:虽然DCT的结果是32*32大小的矩阵,但我们只要保留左上角的8*8的矩阵,这部分呈现了图片中的最低频率。(5)计算平均值:如同均值哈希一样,计算DCT的均值。(6)计算hash值:这是最主要的一步,根据8*8的DCT矩阵,设置0或1的64位的hash值,大于等于DCT均值的设为“1”,小于DCT均值的设为“0”。组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。 (7)对比图片指纹:得到图片的指纹后,就可以对比不同的图片的指纹,计算出64位中有多少位是不一样的。一般情况下,如果不相同的数据位数不超过5,就说明两张图片很相似,如果大于10,说明它们是两张不同的图片。这里是基于汉明距离来对相似度进行计算,定义的相似度计算公式为:sim=1-汉明距离位数下面两张图片分别是对汉明距离和相似度的实现函数,具体如下:.4.2Levenshtein距离算法4.2.1算法概述 我们这里所要研究的相似度算法是这样进行的,UML图如上。4.2.2生成图片的指纹在我们的程序中,生成图片哈希值的方法是produceFingerPrint(),他返回的是一个String类型的字符串类型。这个方法里面主要涉及6个部分:(1)读取图片实现这个功能的方法是通过readImage(filename)方法来完成的,这个方法封装在ImageRead类中,它通过获取图片的路径名来得到该图片。代码如下:(2)将图片缩小到固定尺寸因为我们得到的图片可能会大小不一致,多以我们需要将他们缩小成一致的格式,这里我们将他们缩小成8*8的尺寸,总共64个像素,除去了图片的细节,只保留了结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。实现方法是:thumb(BufferedImagesource,intwidth,intheight,booleanb),代 码如下:(3)简化色彩将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。通过灰度值的计算来实现的,方法为rgbToGray()(4)计算平均值计算64个像素的灰度平均值,通过方法average()来实现。代码如下:(5)比较像素灰度将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于 平均值,记为0。(6)计算哈希值将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。代码如下:4.2.3计算编辑距离,得出相似度计算图片指纹的相似度。进而算出图片的相似度。(1)编辑距离概述Levenshtein距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫LevenshteinDistance。(2)举例说明a.首先是有两个字符串,这里写一个简单的abc和abeb.将字符串想象成下面的结构。A处 是一个标记,为了方便讲解,不是这个表的内容。 abcabcabe0123a1A处b2e3c.来计算A处 出得值 它的值取决于:左边的1、上边的1、左上角的0.按照Levenshteindistance的意思:上面的值和左面的值都要求加1,这样得到1+1=2。A处 由于是两个a相同,左上角的值加0.这样得到0+0=0。这是后有三个值,左边的计算后为2,上边的计算后为2,左上角的计算为0,所以A处 取他们里面最小的0.d.于是表成为下面的样子abcabcabe0123a10b2B处e3在B处 会同样得到三个值,左边计算后为3,上边计算后为1,在B处 由于对应的字符为a、b,不相等,所以左上角应该在当前值的基础上加1,这样得到1+1=2,在(3,1,2)中选出最小的为B处的值。e.于是表就更新了 abcabcabe0123a10b21e3C处C处 计算后:上面的值为2,左边的值为4,左上角的:a和e不相同,所以加1,即2+1,左上角的为3。在(2,4,3)中取最小的为C处 的值。f.于是依次推得到abc0123 a1A处 0D处 1G处 2b2B处 1E处 0H处 1e3C处 2F处 1I处 1 I处: 表示abc和abe有1个需要编辑的操作。这个是需要计算出来的。同时,也获得一些额外的信息。A处: 表示a     和a     需要有0个操作。字符串一样B处: 表示ab   和a     需要有1个操作。C处: 表示abe 和a     需要有2个操作。D处: 表示a     和ab   需要有1个操作。E处: 表示ab   和ab   需要有0个操作。字符串一样F处: 表示abe 和ab  需要有1个操作。G处: 表示a     和abc  需要有2个操作。H处: 表示ab  和abc  需要有1个操作。I处: 表示abe 和abc  需要有1个操作。g.计算相似度先取两个字符串长度的最大值maxLen,用1-(需要操作数除maxLen),得到相似度。例如abc和abe一个操作,长度为3,所以相似度为1-1/3=0.666(3)具体实现具体实现代码如下: 4.3欧式距离相似度算法4.3.1算法概述该算法的核心思想是计算两条直线的欧氏距离。4.3.2算法步骤①运用道格拉斯-普克算法将折线简化,提取出折线的特征点。步骤如下,(1)在曲线首尾两点间虚连一条直线,求出其余各点到该直线的距离,如下图(1)。(2)选其最大者与阈值相比较,若大于阈值,则离该直线距离最大的点保留,否则将直线两端点间各点全部舍去,如下图(2),第4点保留。(3)依据所保留的点,将已知曲线分成两部分处理,重复第1、2步操作,迭代操作,即仍选距离最大者与阈值比较,依次取舍, 直到无点可舍去,最后得到满足给定精度限差的曲线点坐标,如下图(3)、(4)依次保留第6点、第7点,舍去其他点,即完成线的化简。具体的代码实现如下:②将两条折线A,B垂直平移至X轴,如下图二。。③将其中一条折线A缩放一定比例得到A’;使得A’上所有点的平均值与B 相等,如下图三。④通过A’上的点向B做垂线,求出垂距H,得出累计垂距Hs如下图四。⑤相似度用1/Hs表示,当Hs=0时,取相似度为1,算法实现为代码二、代码三。具体的代码实现如下: 4.4加权最优解4.4.1算法概述上面三种算法或多或少有相应的侧重,因此我们小组决定根据上面三种算法提供一个加权的最优解。在获得三种算法得出的相关的相似度值后,为每种算法赋予相关的加权值,通过加权运算获得最优的结果。4.4.2算法步骤(1)获得三面三种算法的结果;(2)进行加权运算。分别给算法A(感知哈希算法)、算法B(Levenshtein距离算法)和算法C(欧式距离相似度算法)权数为0.5、0.3、0.2。具体代码实现如下: 5系统实现 整个系统架构思想是基于构件的软件开发思想,通过运用structs框架,将前端界面设计和后台功能实现相结合。具体的界面设计和系统集成如下介绍。5.1界面设计界面设计秉承简单实用的设计思想,将整个系统需求的具体功能在首界面就全部展现出来了。同时,为增加用户的体验好感度,运用了相关的JavaScript技术实现。具体的界面效果如下图:5.2系统集成5.2.1系统目录结构整个项目既有前台界面编写,又有后台算法实现,由于不同的模块代码编写的人员不同,最终需要进行代码的集成整合。通过对代码的集成最后形成的代码系统目录如下图所示: 5.2.2structs具体实现Structs部分的实现包括相关的VO层、action、service以及structs配置文件实现。在这里就不对其一一截图展示了,其中核心的action源码如下图所示: 5.3系统环境和运行5.3.1系统环境集成开发环境为MyEclipse10服务器部署环境为TomcatJava运行环境为JDK1.85.3.2运行效果在首页进行导入样本文件后,可以分别进行三种算法的计算得出相应的结果。然后还能进行加权最优解的获得。(1)算法A(感知哈希算法)运行效果后台运行如下图: 结果展示如下:(1)算法B(Levenshtein距离算法运行效果后台运行如下: 结果展示如下:(1)算法C(欧式距离相似度算法运行效果结果展示如下: (1)加权最优解运行效果 6测试'