标题 | 基于C++和MatLab混合编程的GM(1,1)模型实现与应用 |
范文 | 陈婕 摘要:人才与经济发展有着密切的联系,有效的人才需求预测能为宏观调控提供依据,有利于人力资源开发与经济增长的良性互动。该文分别采用C++和MatLab进行混合编程,实现了灰色系统理论的GM(1,1)模型,并应用该程序对十三五期间我国旅游人才需求进行了预测。 关键词:灰色系统理论;旅游人才预测;GM(1,1) 中图分类号:F590.2 文献标识码:A 文章编号:1009-3044(2017)33-0124-03 1 背景 进入21世纪以来,伴随居民收入水平的提高,我国出游人次不断增长,2016年我国旅游人数达到45.78亿人次,同比增长14.46%,。根据“十三五”旅游规划,2020年国内游人数有望达64亿人次,2015-2020CAGR为9.86%;出境游人数有望达1.50亿人次,2015-2020CAGR为5.09%。(数据来源:中国产业信息网.2017年中国酒店行业发展现状及中高端酒店发展趋势分析) 快速增加的旅游者数量,使得相关的旅游企业也得到了快速发展,根据国家旅游局统计数据,截止2016年12月31日,我国有27856家旅行社,六百多个国家5A 级景区,12213家星级酒店。旅游企业的发展,使得对旅游人才需求总量迅速增长,从专业招聘网站“前程无忧”和“智联招聘”上的数据来看,2017年7月,仅北京、上海、广州、深圳、南京5个城市旅游类相关企业共发布招聘信息112415条;中国旅游产业对GDP综合贡献10.8%,超过教育、银行、汽车产业,中国旅游就业人数占总就业人数10.2%(数据来源:中国国家旅游局.2015年中国旅游业统计公报)。可以看出,我国旅游人才市场大致呈现一种供不应求的局面,有必要对十三五期间旅游人才需求进行预测,这样可以提高旅游业的服务质量。 2 需求总量预测理论模型及算法实现 2.1 灰色预测GM(1,1)模型 本次预测,采用的是灰色系统模型。所谓灰色系统,是指既含有已知信息,又含有未知信息的系统,是由邓聚龙教授在1986年提出的。由于它具有所需因素少,模型简单,运算方便,预测精度高等优点,可以较好的对非线性系统进行预测。在旅游人才需求的预测系統中,人才总数、结构等信息是已知的,但也受外界诸如:政治、经济、文化、科技、自然灾害等因素的影响,存在很大的不确定性,非常符合灰色系统的特点,所以可以用灰色系统理论对旅游人才需求进行预测。 灰色系统常用的预测模型是GM(1,1)模型,GM(1,1)模型表示一阶的、单变量的线性动态预测模型,其预测原理是将离散的随机数,经过生成变成随机性被显著削弱的较有规律的生成数,在此基础上建立数学模型,建模步骤如下: 1) 历史数据的采集和累加序列的生成 设研究对象的历史数据为: [] —般情况下,对于给定的原始数据列不能直接用于建模,因为这些数据多为随机的、无规律的,为了减弱原始数据序列的波动性和随机性,需对原始序列进行数据处理,即通过累加生成方式将原始数据列转化为规律性较强的递增数列,累加的规则是:将原始序列的第一个数据作为生成列的第一个数据,将原始序列的第二个数据加到原始序列的第一个数据上,其和作为生成列的第二个数据,将原始序列的第三个数据加到生成列的第二个数据上,其和作为生成列的第三个数据,按此规则进行下去,便可得到生成列。 设累加后生成的序列为: [X(1)=X(1)(1),X(1)(2),X(1)(3),...,X(1)(n)] 上标1表示一次累加,同理,可作m次累加: [X(m)(k)=i=1kX(m-1)(i)] 其中对于非负的数据列,累加的次数越多,则随机性弱化越明显,规律性越增强,这样就较容易用指数去逼近。经过这样的数据处理能达到两个目的:一是弱化了原始数据列的随机性,而找到了其变化的规律性;二是为建立动态模型提供了中间信息。 累减,就是将原始序列前后两个数据相减得到累减生成列。累减是累加的逆运算,累减可将累加生成列还原为非生成列,在建模中获得增量信息。 一次累减的公式为: [X(1)(k)=X(0)(k)-X(0)(k-1)] 2) x0序列的准光滑性检验和x1序列的准指数规律检测 对原始数据经过累加处理后,在建立模型前还必须对数列x0进行准光滑性检验,并检验数列x1是否具有准指数规律。 3) 构建GM(1,1)模型 在第1步中已经生成了X(0)和X(1)序列,则GM(1,1)模型相应的微分方程为: [dX(1)dt+aX(1)=μ] 其中:α称为发展灰数;μ称为内生控制灰数。 设[α]为待估参数向量, [α=aμ] 根据最小二乘法有: 求解微分方程,即可得预测模型: 2.2 模型的算法实现 GM(1,1)模型的计算涉及矩阵运算,特别是求逆矩阵,相当复杂和繁琐,并且容易出错,所以用手工计算去实现GM(1,1)模型显然是不现实的,必须借助计算机进行运算,才能快速、准确的获得结果。我们采用的C++语言和MatLab相结合的方法来实现整个计算过程:用C++语言编程来处理原始数据,累加数据,进行x0序列的准光滑性检验和x1序列的准指数规律检测,并自动生成计算发展灰数和内生控制灰数MatLab的命令,然后用MatLab执行这命令,得出发展灰数和内生控制灰数,再通过C++程序读入这两个数据,最终得到预测结果。
以下是算法的C++语言实现,在DEV C++ 5中编译通过。 #include #include #include #include #include using namespace std; doublestrtofloat(string s) {double res=0; int flag=0,xs=0,ws=0; intjc=1; for(int i=0;i if(s[i]=='.'){ flag=1; continue;} if(flag==0){ res*=10; res+=s[i]-'0';} else{ ws++; xs*=10; xs+=s[i]-'0'; }} for(int j=0;j jc*=10;} res+=xs*1.0/jc; return res;} double **creatdim(inth,int w) {double **temp; inti,j; temp=new double *[h]; for(i=0;i temp[i]= new double[w]; for(i=0;i for(j=0;j temp[i][j]=0; return temp;} void free_space(double **table,introw,int col)//釋放空间 {int i; for(i=0;i delete[]table[i]; //以行为单位释放数值空间 delete[]table; } //释放行地址空间 int check(double x0[],double x1[],intnum) {int i,f1=1,f2=1,ret=0; double *p=new double[num]; double *r=new double[num]; for(i=1;i p[i]=x0[i]/x1[i-1]; for(i=1;i r[i]=x1[i]/x1[i-1]; for(i=3;i if(p[i]>0.5){ f1=0; break;} for(i=3;i if(r[i]<1 || r[i]>1.5){ f2=0; break;} delete []p; delete []r; if(f1==0 && f2==0)ret=1; else if(f1==0)ret=2; else if(f2==0)ret=3; else ret = 0; return ret;} voidgetdata(double x0[],double x1[],intnum) {int i; ifstream fin; string str; fin.open("data.txt"); for(i=0;i getline(fin,str); x0[i]=strtofloat(str); x1[i]=x0[i];} fin.close(); for(i=1;i x1[i]=x1[i-1]+x1[i];} voidoutputmatlab(double **b,double **y,intnum) {int i; ofstreamfout("gm.m",ios_base::out); fout<<"clc;"< fout<<"b=["; for(i=0;i if(i elsefout< fout<<"];"< fout<<"y=["; for(i=0;i if(i elsefout< fout<<"];"< fout<<"bt=b';"<
fout<<"c=bt*b;"< fout<<"d=inv(c);"< fout<<"e=d*bt;"< fout<<"f=e*y;"< fout<<"format long g;"< fout<<"f"; fout.close();} voidoutputdata(double result[],int yearn) {int i; ofstreamfout("result.txt",ios_base::out); for(i=0;i fout< fout.close();} voidgeneratedata(double x0[],double x1[],double **b,double **y,intnum) {int i; for(i=0;i y[i][0]=x0[i+1]; for(i=1;i b[i-1][0]=-(x1[i-1]+x1[i])/2; b[i-1][1]=1;}} double *forecast(double x1[],double a,doubleu,int yearn) {int i; double *result,rel; result=new double[yearn]; result[0]=x1[0]; rel=result[0]; for(i=1;i result[i]=(x1[0]-u/a)*exp(-a*i)+u/a-rel; rel+=result[i];} return result;} int main(void) {double *x0,*x1; double *result; double **b,**y; doublea,u; inti,cret,num,yearn; cout<<"请输入参数的个数:"; cin>>num; x0=new double[num]; x1=new double[num]; b=creatdim(num-1,2); y=creatdim(num-1,1); getdata(x0,x1,num); cret=check(x0,x1,num); if(cret==0){ generatedata(x0,x1,b,y,num); outputmatlab(b,y,num); cout<<"已经生成MATLAB文件,请运行之!\n"; cout<<"请输入α和μ的值:"; cin>>a>>u; cout<<"请输入从起始年开始所需要预测的年数:"; cin>>yearn; result=forecast(x1,a,u,yearn); outputdata(result,yearn); cout<<"已經生成结果文件!\n"; delete []x0; delete []x1; delete []result; free_space(b,num-1,2); free_space(y,num-1,1); } else {if(cret==1)cout<<"准光滑检验和准指数规律检验均无法通过!\n"; if(cret==2)cout<<"准光滑检验检验无法通过!\n"; if(cret==3)cout<<"准指数规律检验无法通过!\n";} getch(); return 0;} 2.3 旅游人才总需求预测应用 如表1所示,为2011年至2015年期间,全国旅游业直接从业人数,其中2014年和2015年的直接就业人数是国家旅游局公布统计数据,2011年至2013年的直接就业人数没有公布过,是依据国家旅游局统计公布推算出来的,具体算法为:每年的旅游统计公报中旅游直接和间接就业人数占全国就业总人数的10%左右,而旅游直接就业人数占旅游直接和间接就业人数的35%左右,设旅游直接就业人数为T,全国就业总人数为P,则根据上述分析,有T=P*0.1*0.35,而每年的全国就业总人数可以从国家统计局网站上查到,所以我们可以得到表1。 3 结束语 灰色预测方法是经济预测中一种非常有效的方法,它不直接采用原始数据建模,而是将原始的、无规则的数据进行加工处理,使之变得有规律,然后利用生成后的数据列来分析建模。这正是灰色理论方法的特点之一,结果证明将灰色系统理论中的GM(1,1)模型引入行业人才需求的预测,所需要的原始数据不多(尤其对历史数据个数较少的情况),容易采集,且具有预测精度较高,模型可检验,参数的计算方法较简单等特点,是一个较为理想的人才预测方法。 参考文献: [1] 梁阜.山东省制造业人力资源需求量预测与分析[J].山东大学学报哲学社会科学版, 2008(5). [2] 杨震.德阳市“十一五”人才需求预测系统[D].成都: 四川大学,2006. [3] 王新宇,方法林,宋益丹.江苏旅游人才需求预测——基于灰色系统理论和一元回归方程混合模型[J].中国商贸,2012(5).
|
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。