| 查看: 2354 | 回复: 12 | ||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | ||
[求助]
求助高手将以下C语言翻译为Matlab语言,急急急!
|
||
|
#include #include #include #include #include #include #include #define Fit_name "fit.ga" #define Indiv_name "ind.ga" #define Result_name "out.ga" #define Test_name "test.ga" #define Cont_name "ctr.ga" #define Mv_name "m_v.ga" #define Amv_name "am_v.ga" #define _in_varl 2 #define _out_varl 1 #define _rule 4 #define _pi 3.1415926 #define _order 1 #define _time1 250 #define _popsize 50 #define _maxgen 500 // max generation #define _number 2 // for tournament selection float _pmutation = 0.1 ; // initial mutation probability float _pcrossover= 0.4 ; const int _lchrom = _rule*(2*_in_varl+ (_in_varl+1)*_out_varl) ; class Data { public : float in[_in_varl+1],out[_out_varl+1], ym[_order+1],yp[_order+1] ; float scale_in[_in_varl+1] ,scale_out[_out_varl+1]; Data() ; void input(int) ; void output(float *,float *) ; void init(void); void Save() ; } ; Data :: Data() { int i ; for(i=0;i<_order;i++) { yp = 2 ; } for(i=0;i<_in_varl;i++) scale_in = 4.2 ; for(i=0;i<_out_varl;i++) scale_out = 4.2 ; } class Rule { friend void Eva_out(float *,Data ,int,Rule *) ; float in_mu,f[_out_varl+1] ; public : void In_mem(Data,int,int) ; } ; class Population { friend class Rule ; friend void generation(int,int *) ; friend void Crossover(int,int,int) ; friend void report(float,float,float,char *) ; friend void Eva_out(float *,Data ,int,Rule *) ; friend void Save(int) ; float chrom[_lchrom+1], sum_fitness, in_mu, x ; int checked ; public : float fitness ; Population() {sum_fitness = 0 ; } void clear() ; void initpop(void) ; void Save_m_v(FILE *ft) ; void objfunc(float) ; } ; inline float phi(float x,float mm,float v) { return( exp( - (x-mm)*(x-mm)/(v*v) )) ; } inline float max(float a , float b) { return ( ( a>b) ? a :b); } template Type mutation(Type ge,int j) { int i,n,m ; n = 2*_in_varl+_out_varl ; m = _rule*n ; if (flip(_pmutation)) { if (j<=m) { i = j%n ; if (( i == 0 ) || (i > 2*_in_varl) ) ge = (rand()%(4000)-2000)/1300.0 ; // consequent parameter a0 else if ( i%2 == 1 ) ge = (rand()%(200) - 100)/100.0 ; // mean value else ge = 0.05+ (rand()%700)/1000.0 ; // width } else ge = (rand()%(4000)-2000)/1300.0 ; // TSK-type consequence a1 -- an _nmutation = _nmutation + 1 ; } return ge ; } int select(int) ; void initialize(void) ; void statistics(float *,float *,float *, float, int) ; void generation(int, int *) ; void report(float,float,float,char *) ; float Eva_Fitness(int,int) ; Population _oldpop[_popsize+1],_newpop[_popsize+1] ; int _nmutation=0,_nncross=0 ; float _sumfitness, _avg,_max,_min ; int main(void) { int max ,gen ; void Save(int) ; time_t tt; srand((unsigned) time(&tt)); initialize() ; for(gen=1; gen < _maxgen;gen++) { cout << "\n Generation is --- " << gen ; generation(gen,&max) ; } cout << "\n ******* The End ****** " ; Save(max) ; return(0); } void initialize() { int j ; Data train; float fmax_fit=-1E7, fmin_fit=1E7, ave_fit=0 ,fit ; FILE *fm ; cout << "\n Initial generation " << endl ; for(j=1;j<=_popsize;j++) { _newpop[j].initpop(); _newpop[j].clear() ; } for(j=1;j<=_popsize;j++) { fit = Eva_Fitness(j,0) ; statistics(&fmax_fit,&fmin_fit,&ave_fit,fit,j) ; _newpop[j].objfunc(fit) ; } if( (fm=fopen(Mv_name,"w" )==NULL) exit(1) ;for(j=1;j<=_popsize;j++) _newpop[j].Save_m_v(fm) ; fclose(fm) ; report(fmax_fit,fmin_fit,ave_fit,Fit_name) ; for(j=1;j<=_popsize;j++) { _oldpop[j] = _newpop[j] ; } } float Eva_Fitness(int jj,int gen) { int k ; float act_out[_out_varl+1], error, fit=0 ; Data t ; Rule rules[_rule+1] ; for(k=1;k<=_time1;k++) { t.input(k) ; Eva_out(act_out,t,jj,rules) ; t.output(&error,act_out) ; fit = fit + error ; } return 1./fit ; } void Data::input(int k) { ym[_order] = sin(2*_pi*k/100); in[0] = ym[_order]/scale_in[0] ; in[1] = yp[_order]/scale_in[1] ; } void Data: utput(float *err,float *u){ int i ; yp[_order] = yp[_order-1]/(1+yp[_order-1]*yp[_order-1])+u[0]*u[0]*u[0]; *err = (yp[_order] - ym[_order])*(yp[_order] - ym[_order]) ; for(i=1;i <=_order; i++) { yp[i-1] = yp ; } } void Data::init() { int i ; for(i=0;i<_order;i++) yp = -2 ; } void Eva_out(float *y,Data t,int jj,Rule *rules) { int i,j,k,n,mm,nn,kk ; float *den , *num ; mm = 2*_in_varl+_out_varl ; nn = _rule*mm ; kk = nn + _rule*_rule ; if ( !( num = new float[_rule+1] ) || !( den = new float[_rule+1] ) ) { cout << "\n Insufficient memory for num " ; exit(1) ; } for(k=1;k<=_rule;k++) rules[k].In_mem(t,jj,k) ; // firing strength for(j=0;j< _out_varl;j++) { for(n=1;n<=_rule;n++) { rules[n].f[j] = _newpop[jj].chrom[(n-1)*mm+2*_in_varl+1] ; for(i=1;i<=_in_varl;i++) rules[n].f[j] += _newpop[jj].chrom[nn+(_in_varl)*(n-1)+i]*t.in[i-1] ; //consequence value } den[j] = 0 ; num[j] = 0 ; for(n=1;n<= _rule;n++) { den[j] = den[j] + rules[n].in_mu ; num[j] = num[j] + rules[n].in_mu * rules[n].f[j] ; } if ( fabs(den[j]) < 1E-10 ) *(y+j) = 0 ; else *(y+j) = num[j]/den[j] ; //defuzzify } delete [] den ; delete [] num ; } void Population::clear() { fitness = 0 ; checked = 0 ; } void Rule::In_mem(Data x,int jj,int k) { int i,n ; in_mu = 1. ; n = 2*_in_varl+_out_varl ; for(i=1;i<= _in_varl;i++) in_mu = in_mu * phi(x.in[i-1],_newpop[jj].chrom[(k-1)*n+2*i-1], _newpop[jj].chrom[(k-1)*n+2*i]) ; } void Population :: initpop() { int i,j1,n,m,j ; n = 2*_in_varl+_out_varl ; m = _rule*n ; for(i=0;i<_rule;i++) { for(j1=1;j1<=_in_varl;j1++) { chrom[i*n+2*j1-1] = (rand()%200 -100 )/100.; // center chrom[i*n+2*j1] = 0.05 + (rand()%700)/1000.0 ; //width } for(j=1;j<=_out_varl;j++) chrom[i*n+2*_in_varl+j] = (rand()%(4000)-2000)/1200. ; // consequence } for(j1=1;j1<=_rule;j1++) for(i=1;i<=_in_varl;i++) chrom[m+(j1-1)*(_in_varl) + i ] = (rand()%(8000)-4000)/2600. ; // TSK linear parameter } void Population :: objfunc(float fit) { fitness = fit ; } void statistics(float *max_fit,float *min_fit,float *ave_fit,float fit,int j) { if ( fit > *max_fit ) { *max_fit = fit ; } if ( fit < *min_fit ) { *min_fit = fit ; } *ave_fit = *ave_fit + (1.0/(j+1))*(fit - *ave_fit) ; int flip(float prob) { int i,j ; i = rand()%(10001) ; if ( i < 10000*prob ) j = 1 ; else j = 0 ; return j ; } void generation(int _gen,int *max) { int i,mate1,mate2; float max_f=-1E8; float fmax_fit=-1E8,fmin_fit=1E8 ; float fit,ave_fit=0 ; for(i=1;i<=_popsize;i++) { if ( _oldpop.fitness > max_f ) { max_f = _oldpop.fitness ; *max = i ; } // end if } // end for i for(i=1;i<= _popsize/2;i++) { mate1 = select(_popsize) ; mate2 = select(_popsize) ; Crossover(i,mate1,mate2) ; } _newpop[ *max] = _oldpop[*max] ; for(i=1;i<=_popsize;i++) { _newpop.clear() ; } for(i=1;i<=_popsize;i++) { fit = Eva_Fitness(i,_gen) ; statistics(&fmax_fit,&fmin_fit,&ave_fit,fit,i) ; _newpop.objfunc(fit) ; } report(fmax_fit,fmin_fit,ave_fit,Fit_name) ; for(i=1;i<=_popsize;i++) _oldpop = _newpop ; } void Crossover(int i,int mate1,int mate2) { int j,jcross ; if (flip(_pcrossover)) { jcross = rand()%(_lchrom-1) +1 ; for(j=1;j<=jcross;j++) { _newpop[ _popsize - 2*(i-1) ].chrom[j] = mutation( _oldpop[mate1].chrom[j],j); _newpop[ _popsize - 2*(i-1) - 1 ].chrom[j] = mutation( _oldpop[mate2].chrom[j],j); } for (j=jcross+1;j<=_lchrom;j++) { _newpop[ _popsize - 2*(i-1) ].chrom[j] = mutation( _oldpop[mate2].chrom[j],j); _newpop[ _popsize - 2*(i-1) - 1 ].chrom[j] = mutation( _oldpop[mate1].chrom[j],j); } } else { for(j=1;j<=_lchrom;j++) { _newpop[ _popsize - 2*(i-1) ].chrom[j] = _oldpop[mate1].chrom[j] ; _newpop[ _popsize - 2*(i-1) - 1 ].chrom[j] = _oldpop[mate2].chrom[j]; } } } int select(int range) { int ran[_number+1] ; float max_value ; int max,j=0 ; for(j=1;j<=_number;j++) ran[j] = rand()%(range) + 1 ; max = ran[1] ; max_value = _oldpop[ran[1]].fitness ; for(j=2;j<=_number;j++) { if ( _oldpop[ran[j]].fitness > max_value ) { max = ran[j] ; max_value = _oldpop[ran[j]].fitness ; } } return max ; } void report(float max_fit,float min_fit,float ave_fit,char *p) { static int i= 0 ; FILE *fm ; i++ ; cout << "\n max --- " << max_fit << " , min --- " << min_fit << " , avg -- " << ave_fit ; cout << " Nmutation " << _nmutation ; if (i==2) { _nmutation = 0 ; i = 0 ; } if( (fm=fopen(p,"a" )==NULL) exit(1) ;fprintf(fm,"%f %f %f" ,max_fit,min_fit,ave_fit) ; fprintf(fm,"\n" ;fclose(fm); } void Save(int max) { long int k ; FILE *fm ; float act_out[_out_varl+1],error ; Data t ; Rule rules[_rule+1] ; void Save_Con(float *); if( (fm=fopen(Amv_name,"w" )==NULL) exit(1) ;_newpop[max].Save_m_v(fm) ; fclose(fm) ; for(k=1;k<=_time1;k++) { t.input(k) ; Eva_out(act_out,t,max,rules) ; t.output(&error,act_out) ; Save_Con(act_out); t.Save(); } } void Save_Con(float *u) { FILE *fout ; if( (fout=fopen(Cont_name,"a" )==NULL) exit(1) ;fprintf(fout,"%f \n", u[0] ) ; fclose(fout) ; } void Data::Save() { FILE *fout ; if( (fout=fopen(Result_name,"a" )==NULL) exit(1) ;fprintf(fout,"%f %f \n", yp[_order],ym[_order] ) ; fclose(fout) ; } void Population::Save_m_v(FILE *ft) { int k ; for(k=1;k<=_lchrom;k++) fprintf(ft," %f", chrom[k] ) ; fprintf(ft,"\n" ;} |
» 猜你喜欢
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有4人回复
康复大学泰山学者周祺惠团队招收博士研究生
已经有6人回复
AI论文写作工具:是科研加速器还是学术作弊器?
已经有3人回复
孩子确诊有中度注意力缺陷
已经有6人回复
2026博士申请-功能高分子,水凝胶方向
已经有6人回复
论文投稿,期刊推荐
已经有4人回复
硕士和导师闹得不愉快
已经有13人回复
请问2026国家基金面上项目会启动申2停1吗
已经有5人回复
同一篇文章,用不同账号投稿对编辑决定是否送审有没有影响?
已经有3人回复
RSC ADV状态问题
已经有4人回复
» 本主题相关价值贴推荐,对您同样有帮助:
matlab语言改写成C语言
已经有18人回复
c语言高手请进
已经有35人回复
【求助】有谁能推荐下学习C语言的书或教学视频
已经有7人回复
【求助】本人对C语言有一点基础,打算学习一VC,请各位推荐几本经典入门教材
已经有17人回复
【求助】用matlab编程,需要将数据自检分类(高手进来指点下)
已经有5人回复
【求助】如何将matlab中的randn函数转变为C语言形式的啊?
已经有3人回复
【求助】求将c语言改写为C++,求教高人啊!
已经有6人回复
急急急~~求助 一小段英译汉 高手帮帮忙
已经有3人回复
【求助】c语言中取余的实现
已经有3人回复
【求助】帮我编个程啊~C语言,C++,Matlab,VB...都行~
已经有14人回复
8楼2012-06-08 06:40:12
wu20811055
铜虫 (职业作家)
- 应助: 7 (幼儿园)
- 金币: 87.7
- 散金: 2317
- 红花: 1
- 帖子: 3461
- 在线: 395.3小时
- 虫号: 1786563
- 注册: 2012-04-29
- 性别: GG
- 专业: 计算机应用技术

2楼2012-06-07 18:07:40
libralibra
至尊木虫 (著名写手)
骠骑将军
- 程序强帖: 40
- 应助: 817 (博后)
- 金币: 12914.1
- 红花: 64
- 帖子: 2238
- 在线: 287.3小时
- 虫号: 696514
- 注册: 2009-02-05
- 专业: 计算机软件

3楼2012-06-07 19:41:09
4楼2012-06-07 20:54:38













)==NULL) exit(1) ;
utput(float *err,float *u)
回复此楼
