软件架构项目报告Word格式文档下载.docx
《软件架构项目报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《软件架构项目报告Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。
4.4.2算法步骤19
5系统实现20
5.1界面设计21
5.2系统集成21
5.2.1系统目录结构21
5.2.2structs具体实现22
5.3系统环境和运行23
5.3.1系统环境23
5.3.2运行效果23
6测试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长码字
,
之间的距离,
其中,
表示模2加运算,
.
表示两码字在相同位置上不同码符号的数目的总和,它能够反映两码字之间的差异,进而提供码字之间的相似程度的客观依据。
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,说明它们是两张不同的图片。
这里是基于汉明距离来对相似度进行计算,定义的相似度计算公式为:
下面两张图片分别是对汉明距离和相似度的实现函数,具体如下:
.
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和abe
b.将字符串想象成下面的结构。
A处
是一个标记,为了方便讲解,不是这个表的内容。
abc
a
b
c
abe
1
2
A处
e
c.来计算A处
出得值
它的值取决于:
左边的1、上边的1、左上角的0.
按照Levenshteindistance的意思:
上面的值和左面的值都要求加1,这样得到1+1=2。
由于是两个a相同,左上角的值加0.这样得到0+0=0。
这是后有三个值,左边的计算后为2,上边的计算后为2,左上角的计算为0,所以A处
取他们里面最小的0.
d.于是表成为下面的样子
B处
在B处
会同样得到三个值,左边计算后为3,上边计算后为1,在B处
由于对应的字符为a、b,不相等,所以左上角应该在当前值的基础上加1,这样得到1+1=2,在(3,1,2)中选出最小的为B处的值。
e.于是表就更新了
C处
C处
计算后:
上面的值为2,左边的值为4,左上角的:
a和e不相同,所以加1,即2+1,左上角的为3。
在(2,4,3)中取最小的为C处
的值。
f.于是依次推得到
D处
G处
B处
E处
H处
F处
I处
I处:
表示abc和abe有1个需要编辑的操作。
这个是需要计算出来的。
同时,也获得一些额外的信息。
A处:
表示a
和a
需要有0个操作。
字符串一样
B处:
表示ab
需要有1个操作。
C处:
表示abe
需要有2个操作。
D处:
和ab
E处:
F处:
和ab
G处:
和abc
H处:
表示ab
和abc
表示abe
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
服务器部署环境为Tomcat
Java运行环境为JDK1.8
5.3.2运行效果
在首页进行导入样本文件后,可以分别进行三种算法的计算得出相应的结果。
然后还能进行加权最优解的获得。
(1)算法A(感知哈希算法)运行效果
后台运行如下图:
结果展示如下:
(2)算法B(Levenshtein距离算法运行效果
后台运行如下:
(3)算法C(欧式距离相似度算法运行效果
(4)加权最优解运行效果
6测试