软件架构项目报告.docx
《软件架构项目报告.docx》由会员分享,可在线阅读,更多相关《软件架构项目报告.docx(25页珍藏版)》请在冰豆网上搜索。
![软件架构项目报告.docx](https://file1.bdocx.com/fileroot1/2022-11/24/dcb5dfed-7235-4d87-a1b4-d4ae7c86e762/dcb5dfed-7235-4d87-a1b4-d4ae7c86e7621.gif)
软件架构项目报告
软件架构项目报告
目录
1项目概述4
2需求分析4
2.1系统用例图和流程图4
2.2功能需求5
2.3非功能性需求6
2.3.1性能需求6
2.3.2质量需求6
2.3.3安全性需求6
2.4可行性分析6
2.4.1技术可行性7
2.4.2经济可行性7
2.4.3操作可行性7
3总体设计7
4详细设计7
4.1感知哈希算法7
4.1.1算法概述7
4.1.2算法详细步骤8
4.2Levenshtein距离算法10
4.2.1算法概述10
4.2.2生成图片的指纹11
4.2.3计算编辑距离,得出相似度13
4.3欧式距离相似度算法16
4.3.1算法概述16
4.3.2算法步骤16
4.4加权最优解19
4.4.1算法概述19
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
0
1
2
3
a
1
A处
b
2
e
3
c.来计算A处 出得值
它的值取决于:
左边的1、上边的1、左上角的0.
按照Levenshteindistance的意思:
上面的值和左面的值都要求加1,这样得到1+1=2。
A处 由于是两个a相同,左上角的值加0.这样得到0+0=0。
这是后有三个值,左边的计算后为2,上边的计算后为2,左上角的计算为0,所以A处 取他们里面最小的0.
d.于是表成为下面的样子
abc
a
b
c
abe
0
1
2
3
a
1
0
b
2
B处
e
3
在B处 会同样得到三个值,左边计算后为3,上边计算后为1,在B处 由于对应的字符为a、b,不相等,所以左上角应该在当前值的基础上加1,这样得到1+1=2,在(3,1,2)中选出最小的为B处的值。
e.于是表就更新了
abc
a
b
c
abe
0
1
2
3
a
1
0
b
2
1
e
3
C处
C处 计算后:
上面的值为2,左边的值为4,左上角的:
a和e不相同,所以加1,即2+1,左上角的为3。
在(2,4,3)中取最小的为C处 的值。
f.于是依次推得到
a
b
c
0
1
2
3
a
1
A处 0
D处 1
G处 2
b
2
B处 1
E处 0
H处 1
e
3
C处 2
F处 1
I处 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
服务器部署环境为Tomcat
Java运行环境为JDK1.8
5.3.2运行效果
在首页进行导入样本文件后,可以分别进行三种算法的计算得出相应的结果。
然后还能进行加权最优解的获得。
(1)算法A(感知哈希算法)运行效果
后台运行如下图:
结果展示如下:
(2)算法B(Levenshtein距离算法运行效果
后台运行如下:
结果展示如下:
(3)算法C(欧式距离相似度算法运行效果
结果展示如下:
(4)加权最优解运行效果
6测试