韦礼安 硬戳 云盘:应付职称评定的论文

来源:百度文库 编辑:九乡新闻网 时间:2024/03/28 22:13:50

应付职称评定的论文-《七星彩神经网络预测系统》原型开发构想

分类: 我的技术原创 VC++/VC#相关技术 2007-12-19 08:54 12013人阅读 评论(9) 收藏 举报

《七星彩神经网络预测系统》原型开发构想

【摘要】人工智能技术-神经网络、MatLab矩阵计算、数学建模、VC++技术的综合运用为我们的科研和教学提供了一个新的任务和富有挑战性的课题,又一次拓宽了C++、高等数学等教学内容,使学生们切身体会到知识的广泛的综合利用的重要性。一方面锻炼了我们师资的科研毅力和科研技术,另一方面,为我们的彩民,提供了一个新的选号利器。

 

【关键词】七星彩,MatLab,人工神经网络,矩阵,VC++,预测。

 

近年来“彩票飓风”席卷中华大地,巨额奖金的刺激使越来越多的人加入到“彩民”的行列。如何购买彩票才能在一夜之间成为百万富翁,或者说最划算呢,是众多彩民最迫切希望取得的“真经”;而彩票公司则希望取得最多的利润。彩票是一种低风险投资,在单次抽奖中体现出随机性,从长期统计结果看又具有一定规律性。从彩民的角度看,不同人对奖项的喜好不同。风险喜好型彩民不太在意高项奖的中奖概率小,更多关注于其丰厚的奖金;反之,风险厌恶型彩民则更倾向于奖额低但获奖概率稍高的低项奖。作为一个理智的彩民,不应该在小概率的高项奖上投入太多资金,而要分析各种彩票的中奖面和奖金比例的分配,购买中奖面较大而且发奖金额比较稳定的彩票,而不要受一两次大奖的冲击效应影响,一味追求小概率事件。购买彩票既可能增加个人收入,又可以为公益事业作出贡献,只要彩民保持正确的心态,不要太计较得失,是应该大力提倡的。“七星彩”电脑体育彩票(以下简称“七星彩”)由国家体育总局体育彩票管理中心统一发行,在全国各体育彩票管理中心所辖区域内采用计算机网络系统进行联合销售的一种彩票形式。

神经网络模型是对自然生物神经系统的一种模拟,它具有这样一些特点:大规模并行处理与容错能力,信息的分布式存储与处理,学习和自适应能力,联想与记忆能力。由于它的这些特点,使得神经网络在广泛的领域得到迅速的开发与应用,解决了许多实际问题,这些实际问题通常可以描述为一个非线性对象或系统。由于神经网络具有逼近任意非线性关系的能力,因此它在解决这些问题中发挥了很强的作用,取得了令人满意的效果。然而神经网络不是通用工具,只有与各领域知识的结合才能实现其预想的功能。采用非线性数量技术的人工神经网络在预测研究中得到了普遍应用,取得了令人满意的效果。

为了满足彩民的一般需求:使用最少的投入换取最大概率的汇报(当然奖金越高越好)的要求,打算设计出《七星彩神经网络预测系统》,一方面是人工智能技术-神经网络、MatLab矩阵计算、数学建模、VC++技术的综合运用,另一方面,为我们的科研和教学提供了一个新的任务和课题,锻炼了队伍,同时,为我们的彩民来说,提供了一个新的选号利器。

一.原型设计目标:

此系统首先满足一般彩民对普通功能的需求,它包括:

ü  开奖号码网上自动更新(需要联接互联网);

ü  .简单直观完整的走势图分析方法(提供各种分析方法的走势图)

ü  自定义组分析(可以让您将任意号码组合在一起进行分析);

ü  号码缩水功能,运用旋转矩阵等方法把您的号码过滤后再进行优化重组,保证中奖率的同时,节省您大把的投注资金;

ü  独特的开奖核对功能,能帮您快速准确的核对您的中奖情况;

ü  简单方便的数据导出/导入功能,可以让您更轻松快捷的管理、排版、打印出你需要的数据;

ü  号码保存后可以分时、多次对号码进行过滤缩水等操作。

 

技术指标和手段包括:

ü  过滤缩水: 对所选择的号码组合进行优化重组,过渡掉那些中奖率极低的号码组合。能在保证您的中奖率同时,大幅度缩减了彩票投注金额,提高彩票投资的经济性。

ü  历史数据: 往期开奖开出的号码记录。

ü  跨度大小: 跨度=开奖的最大号码-开奖的最小号码。例如:某期的开奖号码为,“6017220” 那么其跨度:7-=

ü  AC值: AC值,即每两个号码值间差值的个数(相同差值只计作一个),它在一定程度上反映了号码的离散性。AC值表统计了指定分析范围内每期开奖号码的AC值及每种AC值出现的期数。(AC值实际上也称作"数字复杂值",它是引自国外乐透型彩票分析研究的一个概念,是评估乐透型彩票号码价值的一个重要的参数。可以根据AC值变化曲线分析预测下期开奖号码的AC值。) 例如:开奖号码:“6017220”共有差值7个,所以AC=7。用户可以根据AC值分析结果在选号码时对投注号码的AC值进行限定。              

ü  重叠号个数: 一注开奖号码中相同的数字个数。(例如:开奖号码“6010220”共有两个数字相同,分别是0、2)。

ü  重复号个数: 衡量的是本期开出的号码与上一期号码之间的数字重复关系。(例如:上一期开出号码“5408706”本期开出“3770436”那么本期的重复号个数等于4[分别为:7、0、4、6])。

ü  奇数个数: 指的是同一注号码中各位上的奇数的个数。(例如,号码“7867762”其奇数个数等于3)(同一注号码中有这样的关系:奇数个数+偶数个数=7[而且是一定等于7] )。

ü  偶数个数: 指的是同一注号码中各位上的偶数的个数。(例如,号码“7867762”其偶数个数等于4)(同一注号码中有这样的关系:奇数个数+偶数个数=7[而且是一定等于7] )。

ü  大数个数: 把(5、6、7、8、9)这几个数称为大数,大数个数就等于其在一注号码各位上开出的个数(例如,号码“6017220”大数个数=2)(同一注号码中有这样的关系:大数个数+小数个数=7[而且是一定等于7] )。

ü  小数个数: 把(01234)这几个数称为小数,小数个数就等于其在一注号码各位上开出的个数。(例如,号码“6017220”小数个数=5)(同一注号码中有这样的关系:大数个数+小数个数=7[而且是一定等于7] )。

ü  质数个数: 把(1、2、3、5、7)这几个数称为质数,质数个数就等于其在一注号码各位上开出的个数。(例如,号码“6017220”质数个数=4)(同一注号码中有这样的关系:质数个数+合数个数=7[而且是一定等于7] )。

ü  合数个数: 把(0、4、6、8、9)这几个数称为合数,合数个数就等于其在一注号码各位上开出的个数。(例如,号码“6017220”合数个数=3)(同一注号码中有这样的关系:质数个数+合数个数=7[而且是一定等于7] )。

ü  连号个数: 一注号码的的某位上的数字N,如果N的左边一位等于N-1时用一条连线把他们连接或者右边一位等于N+1时用一条连线把他们连接,这是形成的连线的个数就称为连号个数。(例如,“3239677”可以表示为“3-2-396-77”有3条连线,所以连号个数等于3)。

ü  奇数和值: 指的是一注号码中的奇数之和(例如,号码“5184490”奇数和值=5+1+9=15)。

ü  偶数和值: 指的是一注号码中的偶数之和(例如,号码“5184490”偶数和值=8+4+4+0=16)。

ü  和值: 和值=奇数和值+偶数和值(例如,开奖号码“6017220”其和值=6+0+1+7+2+2+0,等于18)

ü  自定义组: 自定义组的号码成员及个数均由用户自行决定(范围:0~9个)(例如,要进行0、1、2路分析过滤时,你可以把(0、3、6、9)自定义为一个组、(1、4、7)定义为另一个组、(2、5、8)定义为另外一组;然后设定各个组内的号码允许开出的个数范围)。用户可以对自定义组进行灵活的使用,例如,你想限制(1、2、3、8、9)这几个号码在下一期中最多会开出1~3个,那么此时你就可以把(1、2、3、8、9)定义为一个组,然后设定,允许其开出个数范围: 3。

ü  历史数据过滤: 其意思就是,如果一注号码在最近的前几期已经中过大奖了,那么现在这注号码再次开出的机会就非常小了,所以需要把它排除。(例如:“过滤掉 2006122期 2006132期 最大匹配值为:5 以上的号码”,指的就是如果一注号码在20061 22期 2006132期任一期内购买,如果能 中得5个及以上的号码,那么这注号码就排除(过滤 掉))。

 

本系统特色技术指标和手段包括:

曲线拟合:直线、曲线拟合模型及拟合次数可选。

神经网络可选参数界面:

 

 

其中的主要界面部分浏览:

1.技术指标图标及分析界面构想:

 

 

 

2.过滤缩水之类的界面构想:

 

  

 

 

3.曲线拟合界面:

 

 

二.原型设计原理及步骤:

l  首先采用MatLab建立数学模型。

MATLAB 程序设计语言是美国Mathworks 公司20 世纪80 年代中期推出的高性能数值计算软件。Mathworks 公司经过十几年的开发扩充与不断完善,使MATLAB 已经发展成为适合多学科功能强大特全的大型系统软件。MATLAB 具有强大的计算功能;丰富方便的图形功能;适用范围大;编程效率高,扩充能力强;语句简单,易学易用;功能齐备的自动控制软件工具包等优点。每一个工具箱都是当今世界上该控制领域里的最权威、最顶尖的计算与仿真程序软件。

人工神经元网络(Artificial Neural Networks 简写为ANN) 是根据大脑神经元电化学活动抽象出来的一种多层网络结构。ANN 是由众多的人工神经元连接而成的。人工神经元像生物神经元一样,是一个简单的信号处理单元,它接受来自其他许多神经元的输出作为输入,而产生一个输出,并可输入到其他神经元。神经元的不同的连接方式就构成了不同的ANN 模型。

常用的有多层前向网络模型、Adaline 模型、Hopfield 网络模型、Koho2 nen 自组织映照模型等等。但不管模型如何,ANN 都有一些共同的固有特点:

⑴并行处理性

⑵分布式的存贮方式

⑶具有很强的容错性和联想性

⑷具有很强的学习功能

⑸强鲁棒性和强适应性

Ø  反向传播网络(BP网络)

1.概述

在实际应用中,我们用的最广泛的是反向传播网络(BP网络)。下面就介绍一下BP网络的结构和应用。 BP网络是采用Widrow-Hoff学习算法和非线性可微转移函数的多层网络。一个典型的BP网络采用的是梯度下降算法,也就是Widrow-Hoff算法所规定的。backpropagation就是指的为非线性多层网络计算梯度的方法。现在有许多基本的优化算法,例如变尺度算法和牛顿算法。神经网络工具箱提供了许多这样的算法。这优缺点。

一个经过训练的BP网络能够根据输入给出合适的结果,虽然这个输入并没有被训练过。

这个特性使得BP网络很适合采用输入/目标对进行训练,而且并不需要把所有可能的输入/

目标对都训练过。为了提高网络的适用性,神经网络工具箱提供了两个特性--规则化和早期

停止。这两个特性和用途我们将在这一章的后面讨论。

2.基础

网络结构

这里着重说明以下几点:

1 常用的前馈型BP网络的转移函数有logsigtansig,有时也会用到线性函数purelin

当网络的最后一层采用曲线函数时,输出被限制在一个很小的范围内,如果采用线性函数则

输出可为任意值。以上三个函数是BP网络中最常用到的函数,但是如果需要的话你也可以

创建其他可微的转移函数。

2 BP网络中,转移函数可求导是非常重要的,tansiglogsigpurelin都有对应的导

函数dtansigdlogsigdpurelin。为了得到更多转移函数的导函数,你可以带字符"deriv"的转移函数:

tansig('deriv')

ans = dtansig

网络构建和初始化

训练前馈网络的第一步是建立网络对象。函数newff建立一个可训练的前馈网络。这需

4个输入参数。第一个参数是一个Rx2的矩阵以定义R个输入向量的最小值和最大值。第二个参数是一个颟顸每层神经元个数的数组。第三个参数是包含每层用到的转移函数名称的细胞数组。最后一个参数是用到的训练函数的名称。

举个例子,下面命令将创建一个二层网络,其网络模型如下图所示。

 

 

它的输入是两个元素的向量,第一层有三个神经元,第二层有一个神经元。第一层的转移函数是tan-sigmoid,输出层的转移函数是linear。输入向量的第一个元素的范围是-12,输入向量的第二个元素的范围是05,训练函数是traingd

net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');

这个命令建立了网络对象并且初始化了网络权重和偏置,因此网络就可以进行训练了。

我们可能要多次重新初始化权重或者进行自定义的初始化。下面就是初始化的详细步骤。

在训练前馈网络之前,权重和偏置必须被初始化。初始化权重和偏置的工作用命令init

来实现。这个函数接收网络对象并初始化权重和偏置后返回网络对象。

下面就是网络如何初始化的:

net = init(net);

我们可以通过设定网络参数net.initFcnnet.layer{i}.initFcn这一技巧来初始化一个给定

的网络。net. initFcn用来决定整个网络的初始化函数。前馈网络的缺省值为initlay,它允许

每一层用单独的初始化函数。设定了net.initFcn ,那么参数net.layer{i}.initFcn 也要设定用

来决定每一层的初始化函数。

对前馈网络来说,有两种不同的初始化方式经常被用到:initwbinitnwinitwb函数根

据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。前馈网络

的初始化权重通常设为rands,它使权重在-11之间随机取值。这种方式经常用在转换函

数是线性函数时。initnw通常用于转换函数是曲线函数。它根据NguyenWidrow[NgWi90]

为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。它

比起单纯的给权重和偏置随机赋值有以下优点:(1)减少神经元的浪费(因为所有神经元的

活动区域都在输入空间内)。(2)有更快的训练速度(因为输入空间的每个区域都在活动的

神经元范围中)。

初始化函数被newff所调用。因此当网络创建时,它根据缺省的参数自动初始化。init

需要单独的调用。可是我们可能要重新初始化权重和偏置或者进行自定义的初始化。例如,

我们用newff创建的网络,它缺省用initnw来初始化第一层。如果我们想要用rands重新初始化第一层的权重和偏置,我们用以下命令:

net.layers{1}.initFcn = 'initwb';

net.inputWeights{1,1}.initFcn = 'rands';

net.biases{1,1}.initFcn = 'rands';

net.biases{2,1}.initFcn = 'rands';

net = init(net);

网络模拟(SIM)

函数sim 模拟一个网络。sim 接收网络输入p,网络对象net,返回网络输出a,这里是

simuff用来模拟上面建立的带一个输入向量的网络。

p = [1;2];

a = sim(net,p)

a =

-0.1011

(用这段代码得到的输出是不一样的,这是因为网络初始化是随机的。)

下面调用sim来计算一个同步输入3向量网络的输出:

p = [1 3 2;2 4 1];

a=sim(net,p)

a =

-0.1011 -0.2308 0.4955

网络训练

一旦网络加权和偏差被初始化,网络就可以开始训练了。我们能够训练网络来做函数近似(非线性 后退),模式结合,或者模式分类。训练处理需要一套适当的网络操作的例子--网络输入p和目标输出t。在训练期间网络的加权和偏差不断的把网络性能函数 net.performFcn减少到最小。前馈网络的缺省性能函数是均方误差mse--网络输出和目标输出t之间的均方误差。这章的余项将描述几个对前馈网络来说不同的训练算法。所有这些算法都用性能函数的梯度来决定怎样把权重调整到最佳。梯度由叫做反向传播的技术决定,它要通过网络实现反向计算。反向传播计算源自使用微积分的链规则。基本的反向传播算法的权重沿着梯度的负方向移动,这将在下一节讲述。以后的章节将讲述更复杂的算法以提高收敛速度。

反向传播算法

反向传播算法中有许多变量,这一章将讨论其中的一些。反向传播学习算法最简单的应

用是沿着性能函数最速增加的方向--梯度的负方向更新权重和偏置。这种递归算法可以写

成:

xk+1 = xk- a k g k

这里xk是当前权重和偏置向量,g k是当前梯度,a k是学习速率。有两种不同的办法实

现梯度下降算法:增加模式和批处理模式。在增加模式中,网络输入每提交一次,梯度计算

一次并更新权重。在批处理模式中,当所有的输入都被提交后网络才被更新。

下面两节将讨论增加模式和批处理模式。

增加模式训练法(ADAPT

函数adapt用来训练增加模式的网络,它从训练设置中接受网络对象、网络输入和目标

输入,返回训练过的网络对象、用最后的权重和偏置得到的输出和误差。

这里有几个网络参数必须被设置,第一个是net.adaptFcn,它决定使用哪一种增加模式

函数,缺省值为adaptwb,这个值允许每一个权重和偏置都指定它自己的函数,这些单个的

学习函数由参数net.biases{i,j}.learnFcnnet.inputWeights{i,j}.learnFcn

net.layerWeights{i,j}.learnFcnGradient Descent (LEARDGD)来决定。对于基本的梯度最速下降算法,权重和偏置沿着性能函数的梯度的负方向移动。在这种算法中,单个的权重和偏置的学习函数设定为"learngd"。下面的命令演示了怎样设置前面建立的前馈函数参数:

net.biases{1,1}.learnFcn = 'learngd';

net.biases{2,1}.learnFcn = 'learngd';

net.layerWeights{2,1}.learnFcn = 'learngd';

net.inputWeights{1,1}.learnFcn = 'learngd';

函数learngd有一个相关的参数--学习速率lr。权重和偏置的变化通过梯度的负数乘上学

习速率倍数得到。学习速率越大,步进越大。如果学习速率太大算法就会变得不稳定。如果

学习速率太小,算法就需要很长的时间才能收敛。当learnFcn设置为learngd时,就为每一个权重和偏置设置了学习速率参数的缺省值,如上面的代码所示,当然你也可以自己按照意愿改变它。下面的代码演示了把层权重的学习速率设置为0.2。我们也可以为权重和偏置单独的设置学习速率。

net.layerWeights{2,1}.learnParam.lr= 0.2;

为有序训练设置的最后一个参数是net.adaptParam.passes,它决定在训练过程中训练值重

复的次数。这里设置重复次数为200 net.adaptParam.passes = 200; 现在我们就可以开始训练网络了。当然我们要指定输入值和目标值如下所示:

p = [-1 -1 2 2;0 5 0 5];

t = [-1 -1 1 1];

如果我们要在每一次提交输入后都更新权重,那么我们需要将输入矩阵和目标矩阵转变

为细胞数组。每一个细胞都是一个输入或者目标向量。

p = num2cell(p,1);

t = num2cell(t,1);

现在就可以用adapt来实现增加方式训练了:

[net,a,e]=adapt(net,p,t);

训练结束以后,我们就可以模拟网络输出来检验训练质量了。

a = sim(net,p)

a =

[-0.9995] [-1.0000] [1.0001] [1.0000]

带动力的梯度下降法(LEARDGDM)

除了learngd以外,还有一种增加方式算法常被用到,它能提供更快的收敛速度--learngdm,

带动量的最速下降法。动力允许网络不但根据当前梯度而且还能根据误差曲面最近的趋势响

应。就像一个低通滤波器一样,动量允许网络忽略误差曲面的小特性。没有动量,网络又可

能在一个局部最小中被卡住。有了动量网络就能够平滑这样的最小。动量能够通过把权重变

得与上次权重变化的部分和由算法规则得到的新变化的和相同而加入到网络学习中去。上一

次权重变化对动量的影响由一个动量常数来决定,它能够设为01之间的任意值。当动量

常数为0时,权重变化之根据梯度得到。当动量常数为1时新的权重变化等于上次的权重变

化,梯度值被忽略了。

Learngdm函数有上面所示的learngd函数触发,除非mclr学习参数都被设置了。由于每

一个权重和偏置有它自己的学习参数,每一个权重和偏置都可以用不同的参数。

下面的命令将用lerangdm为前面建立的用增加方式训练的网络设置缺省的学习参数:

net.biases{1,1}.learnFcn = 'learngdm';

net.biases{2,1}.learnFcn = 'learngdm';

net.layerWeights{2,1}.learnFcn = 'learngdm';

net.inputWeights{1,1}.learnFcn = 'learngdm';

[net,a,e]=adapt(net,p,t);

批处理训练方式

训练的另一种方式是批处理方式,它由函数train触发。在批处理方式中,当整个训练设

置被应用到网络后权重和偏置才被更新。在每一个训练例子中的计算的梯度加在一起来决定

权重和偏置的变化。

批处理梯度下降法(TRAINGD)

与增加方式的学习函数learngd等价的函数是traingd,它是批处理形式中标准的最速下降

学习函数。权重和偏置沿着性能函数的梯度的负方向更新。如果你希望用批处理最速下降法

训练函数,你要设置网络的trainFcntraingd,并调用train函数。不像以前章节的学习函数,它们要单独设置权重矩阵和偏置向量,这一次给定的网络只有一个学习函数。

Traingd有几个训练参数:epochs,show,goal,time,min_grad,max_faillr。这里的学习速率

lerangd的意义是一样的。训练状态将每隔show次显示一次。其他参数决定训练什么时候结束。如果训练次数超过epochs,性能函数低于goal,梯度值低于mingrad或者训练时间超过time,训练就会结束。

下面的代码将重建我们以前的网络,然后用批处理最速下降法训练网络。(注意用批处

理方式训练的话所有的输入要设置为矩阵方式)

net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');nParam.show = 50;

net.trainParam.lr = 0.05;

net.trainParam.epochs = 300;

net.trainParam.goal = 1e-5;

p = [-1 -1 2 2;0 5 0 5];

t = [-1 -1 1 1];

net=train(net,p,t);

TRAINGD, Epoch 0/300, MSE 1.59423/1e-05, Gradient 2.76799/ 1e-10 TRAINGD, Epoch 50/300, MSE 0.00236382/1e-05, Gradient 0.0495292/1e-10

TRAINGD, Epoch 100/300, MSE 0.000435947/1e-05, Gradient 0.0161202/1e-10

TRAINGD, Epoch 150/300, MSE 8.68462e-05/1e-05, Gradient 0.00769588/1e-10

TRAINGD, Epoch 200/300, MSE 1.45042e-05/1e-05, Gradient 0.00325667/1e-10

TRAINGD, Epoch 211/300, MSE 9.64816e-06/1e-05, Gradient 0.00266775/1e-10

TRAINGD, Performance goal met. a = sim(net,p) a = -1.0010 -0.9989 1.0018 0.9985 nnd12sd1来演示批处理最速下降法的性能。

带动量的批处理梯度下降法(TRAINGDM

带动量的批处理梯度下降法用训练函数traingdm触发。这种算法除了两个例外和

learmgdm是一致的。第一.梯度是每一个训练例子中计算的梯度的总和,并且权重和偏置

仅仅在训练例子全部提交以后才更新。第二.如果在给定重复次数中新的性能函数超过了以

前重复次数中的性能函数的预定义速率max_perf_inc(典型的是1.04)倍,那么新的权重和偏

置就被丢弃,并且动量系数mc就被设为0

在下面的代码重,我们重建了以前的网络并用带动量的梯度下降算法重新训练。

Traingdm的训练参数和traingd的一样,动量系数mc和性能最大增量max_perf_inc也是如此。

(无论什么时候,只要net.trainFcn倍设为traingdm,训练参数就被设为缺省值。)

net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingdm');

net.trainParam.show = 50;

net.trainParam.lr = 0.05;

net.trainParam.mc = 0.9;

net.trainParam.epochs = 300;

net.trainParam.goal = 1e-5;

p = [-1 -1 2 2;0 5 0 5];

t = [-1 -1 1 1];

net=train(net,p,t);

TRAINGDM, Epoch 0/300, MSE 3.6913/1e-05, Gradient 4.54729/

1e-10

TRAINGDM, Epoch 50/300, MSE 0.00532188/1e-05, Gradient0.213222/1e-10TRAINGDM, Epoch 100/300, MSE 6.34868e-05/1e-05, Gradient0.0409749/1e-10TRAINGDM, Epoch 114/300, MSE 9.06235e-06/1e-05, Gradient0.00908756/1e-10TRAINGDM, Performance goal met.

a = sim(net,p)

a =

-1.0026 -1.0044 0.9969 0.9992

注意,既然我们在训练前重新初始化了权重和偏置,我们就得到了一个和使用traingd

不同的均方误差。如果我们想用traingdm重新初始化并且重新训练,我们仍将得到不同的军方误差。初始化权重和偏置的随机选择将影响算法的性能。如果我们希望比较不同算法的性能,我们应该测试每一个使用着的不同的权重和偏值的设置。

由于人工神经网络所具有的独特优点,再加上被证明能够逼近任意非线性函数,近年来在模型辨识、控制器设计、优化操作、故障分析与诊断系统的计算与仿真的传统方法发生了革命性的变等领域迅速得到研究与应用,同时在灾难预测,经济预测、金融投资等领域也迅速得到研究与应用。我们在彩票方面的研究,是一个大胆的尝试。

l  MatLab程序核心算法文件转化为C++文件,利用VC++进行核心算法设计。

VC中调用MATLAB神经网络工具箱,在VC中调用利用com组件,实现VCMATLAB数据的交换。首先在MATLAB中完成两个神经网络函数,一个用来检验,一个用来预测。

1、检验函数:

function [w1,b1,w2,b2,ET,a2]=SJHSJY(P,T,me,eg,lr,P2,T2,S1)

[Pn,meanp,stdp,Tn,meant,stdt]=prestd(P,T);   %预处理

[w1,b1,w2,b2]=initff(Pn,S1,''tansig'',Tn,''purelin'');  %数据初始化

df=10;  

tp=[df me eg lr];

[w1,b1,w2,b2,tp,tr]=trainbpx(w1,b1,''tansig''); %样本训练       

P2n=trastd(P2,meanp,stdp);  

......后处理 %必须为非负

该函数的功能为BP神经网络检验误差,P,T,me,eg,lr,P2,T2,S1 为输入参数;w1,b1,w2,b2,ET,a2 为输出参数。

2、预测函数:

function [a2]=SJHSYC(P,T,P2,me,eg,lr,S1)

[Pn,meanp,stdp,Tn,meant,stdt]=prestd(P,T);

[w1,b1,w2,b2]=initff(Pn,S1,''tansig'',Tn,''purelin'');

 

........

参数输出

P,T,me,eg,lr,P2,T2,S1为输入参数 a2为输出参数,即为所要的结果

3、在MATLAB中将该两个函数做成COM组件

4、新建基于对话框的VC工程,在VC中引入COM组件,完成后可以在CLASSView中看到多了两个新类ISJHSJYISJHSYC,如图1所示,它们分别实现函数SJHSJY.mSJHSYC.m的功能。 

 
1

仔细查看类ISJHSJY的参数,如图2所示


2

在类ISJHSJY 有调用函数格式说明:

 ISJHSJY __RPC_FAR * This,

            /* [in] */ long nargout,

            /* [out][in] */ VARIANT __RPC_FAR *w1,

            /* [out][in] */ VARIANT __RPC_FAR *b1,

            /* [out][in] */ VARIANT __RPC_FAR *w2,

            /* [out][in] */ VARIANT __RPC_FAR *b2,

            /* [out][in] */ VARIANT __RPC_FAR *ET,

            /* [out][in] */ VARIANT __RPC_FAR *a2,

            /* [in] */ VARIANT P,

            /* [in] */ VARIANT T,

            /* [in] */ VARIANT me,

            /* [in] */ VARIANT eg,

            /* [in] */ VARIANT lr,

            /* [in] */ VARIANT P2,

            /* [in] */ VARIANT T2,

            /* [in] */ VARIANT S1);

其中nargout 为输出参数的个数; w1,b1,w2,b2,ET,a2 Variant型输出参数; P,T,me,eg,lr,P2,T2,S1Variant型输入参数;
可以看出通过Variant型数据,可以很方便的在VCMATLAB之间建立起数据交换,关于Variant数据类型可以查看MSDN帮助文档或VC类库手册。

5、关键代码:

SAFEARRAYBOUND rgsabound1[2];

       rgsabound1[0].lLbound=0;

       rgsabound1[1].lLbound=0;

       rgsabound1[0].cElements=4;

    rgsabound1[1].cElements=6;

 

VariantInit(&TTT);

TTT.vt=VT_R8|VT_ARRAY;

TTT.parray=SafeArrayCreate(VT_R8,2,rgsabound1);

TTT.parray->pvData=HH2;

  以上代码用来在VC中将输入参数转换为Variant,建立Variant4×6二维数组,其中HH2double型一维数组,TT为函数中的一个输入参数,为Variant型;程序中,输入参数和输出参数基本都为二维数组。

6、调用代码:

if(FAILED(CoInitialize(NULL)))//COM初始化

{MessageBox("Error");

}

ISJHSJY *pclass=NULL;

HRESULT hr=CoCreateInstance(CLSID_SJHSJY,NULL, CLSCTX_ALL, IID_ISJHSJY, (void **)&pclass);

if(SUCCEEDED(hr))

{

long int u=6;

HRESULT hr1=pclass->sjhsjy(u,&w1,&b1,&w2,&b2,&et,&a2,PP,TTT,me,eg,lr,P2,T2,S1);//函数调用

   if(!SUCCEEDED(hr1))

{MessageBox("请输入正确数据");return;}//函数调用失败

   if(SUCCEEDED(hr1))

   {

   memcpy(W1,w1.parray->pvData,420*sizeof(double));//Variant型结果数据转换成double

   memcpy(W2,w2.parray->pvData,240*sizeof(double));

   memcpy(B1,b1.parray->pvData,60*sizeof(double));

   memcpy(B2,b2.parray->pvData,4*sizeof(double));

   memcpy(ET,et.parray->pvData,4*sizeof(double));

   memcpy(A2,a2.parray->pvData,4*sizeof(double));

   m_edit7.Format("%f /r/n %f /r/n %f/r/n %f/r/n ",ET[0],ET[1],ET[2],ET[3]);

   }

 

}

else {MessageBox("COM组件调用失败!","提示",MB_ICONHAND);exit(0);}//COM组件调用失败

pclass->Release();

CoUninitialize();//结束COM

界面构想如下:

 


l  利用Access进行数据库设计。

由于开奖的每期数据经常需要更新,更新的数据可以有效地存储在Access中,便于读取和分析。即可以采用SQL语句进行处理,也可以通过MatLab算法函数对其进行处理。

l  使用图表控件进行界面设计。

利用 MatLab或者MathTool工具提供的界面控件可以有效地进行曲线等部分界面元素的显示,但由于其的不足 ,还另外寻找和购买界面控件,以便显示更复杂的图表。此项工作正在考证。

l  利用客户端HTML进行部分程序界面设计及帮助文档的设计。

采用先进的技术理念和时尚的灵感元素。充分地使用HTML客户端编程技术,利用它包容了一切可以包容的所有技术,比如gif动画,Flash动画,脚本等等。界面元素时尚靓丽,界面皮肤可以更换。与同类型的软件相比,这方面是走在前面的。

l  利用报表控件进行报表设计。

作为一般彩民来讲,一般不太关心打印,但对于以彩票为投资的个人或者机构组织,打印是少不了的。他们需要机下分析数据报告和图表,有时需要复印其文档,不但在电脑上需要保留相关重要数据,为了安全和其它原因,有些数据需要打印在纸上。所以打印功能是少不了的。当然,也可以将数据到处到比如Office Word等中,然后利用它们自带的工具进行打印,这当然方便,但作为一款专业软件系统,要考虑哪些没有安装Office系统的用户。国内的

Grid++Report 是一款高性能的报表开发工具,特别适用于报表开发。提供一个具有超强数据展现能力的数据网格(DataGrid)部件,制作各种表格报表非常简便;运行时可通过事件处理使报表与用户交互;它是制作动态报表的最佳选择。提供可视化报表设计器,设计报表快速简单。Grid++Report除了提供打印功能外,还提供报表的查询显示功能,即如各种数据网格(DataGrid)控件一样显示数据,让报表的查询显示与打印一次实现,既提高开发效率又保持数据的一致性,这也是Grid++Report与其它报表构件的最大区别。采用VC+COM+ATL+WTL开发,运行性能高,重新发布简单、发布文件小且不依赖任何运行时库。

l  软件升级及数据更新模块的设计。

由于开奖号码网上自动更新(需要联接互联网),所以,数据升级成为一个很重要的模块,为了保证数据的完整和可靠,单独设计一个exe模块,以便于程序版本的更新,同时也可完成数据的更新。

其升级界面如下:

 

l  嵌入网刃数字版权保护平台文件,进行系统加密保护。

其加密过程如下:

纯数字的“软加密狗”,它的加密强度远远高于硬件加密狗,但却是无形的、能够网络发行的,并且成本远远低于硬件加密狗。该保护方式原理是安全的,同时又符合保护原创作者版权的理念。网刃平台提供“傻瓜式”的网刃嵌入助手工具全方位、完美的保护方案,让您尽可放心地发布产品。其特点:

²  非对称加密算法等多种国际公认的高强度算法综合应用来保护您的软件。

²  应用双向数字签名技术,让造假者原形毕露。

²  对应用程序数据进行保护,应用程序必须与网刃平台结合才能使用。

²  提供多种功能函数,既让您编程更简单,又能更好保护您的产品。

l  利用打包工具进行资源数据打包及安装程序的制作。

由于数据资源本身很分散,不便于数据的升级和更新,通过对数据等资源的打包,使它们有机地整合一起,同时有些资源数据通过打包可一直存在内存中,显著地提高程序的运行速度。比如:MoleBox 是一款 Windows 应用程序在执行时进行打包的工具。他可以把一个应用程序及其需要的所有数据文件打包成一个可执行文件。他也可以用一套数据包创建一个可执行文件就像整合动态链接库到可执行文件中一样。当处理一套应用程序时,MoleBox 压缩并加密可加密的文件、数据、媒体文件和动态链接库。MoleBox能够保护您的应用程序的数据和媒体文件被查看和改动,能够防止您的动态链接库不被第三方程序使用。Molebox 绝不会改变原始应用程序的任何功能,也不需要任何额外的代码。解包和解密(如果需要)是自动完成的。

通过对最终产品的安装制作,使某些数据和程序变为一个能交付客户使用的产品,并且压缩其空间。当用户安装此产品时,能够安装到指定的位置,有些数据和程序安装到用户指定的位置。比如:采用DotNet 中的分发工具即可完成此项任务。

三.结束语:

神经网络、MatLab矩阵计算、数学建模、VC++技术的综合运用对于我们来说,是一个很大的技术挑战。对一个人的毅力和技术提出更高的要求,通过此系统的原型开发,可以大大提高数学建模转化为应用的技术水平,为以后比如投资理财等金融衍生产品提供系统支持打下一个基础,同时对于教学来说,又一次拓宽了C++、高等数学、线性代数等教学内容,使他们切身体会到知识的综合利用的重要性。

【参考文献】

[1 ]张乃尧,阎平凡. 神经网络与模糊控制[M] . 北京:清华大学出版社,1998.

[2]蔡自兴. 智能控制- 基础与应用[M] . 北京:国防工业出版社,1998.

[3 ]黄忠霖. 控制系统MATLAB 计算及仿真[M] . 北京:国防工业出版社,2001.

[4]肖伟 MATLAB程序设计与应用 北方交通大学出版社 2005

[5]杨莉 Visual C++6.0实例教程 中国水利水电出版社 2001