基于遗传算法优化神经网络结构源程序

发信人: cooooldog (帅小呆), 信区: Num_Analysis
标  题: [分享]基于遗传算法优化神经网络结构源程序 [精华转?发信站: 日月光华 (2004年08月08日

13:56:22 星期天)

#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<math.h>
#include<time.h>
#include<string.h>
#include "graph.c"
#include "operator.c"
/* 宏定义 */
#define POP_SIZE 20
#define S_RATE 0.4
#define M_RATE 0.01
#define I_MAX 5
#define H_MAX 20
#define O_MAX 5
#define P_MAX 100
#define MAX_G_LENGTH 100
#define GX1 360
#define GY1 66
#define GX2 360
#define GY2 257
#define GXR 250
#define GYR 100
#define GSTEP 2
/* 全局变量 */
unsigned char gene[POP_SIZE][MAX_G_LENGTH]; /* 个体遗传基因 */
unsigned char i_unit[I_MAX],h_unit[H_MAX],o_unit[O_MAX];
unsigned char p_i_unit[P_MAX][I_MAX];
unsigned char p_o_unit[P_MAX][O_MAX];
double fitness[POP_SIZE];
double max_fit,avg_fit;
int i_num,h_num,o_num,t_num;
int p_num;
int g_length;

long int calc_g_length()
{
int i;
long int num;
num=0;
for(i=1;i<=h_num;i++)
num=num+i_num+(i-1);
num=num+o_num*(i_num+h_num);
return(num);
}

void set_network()
{
int i,ok;
long int work;
char choice[2];
settextstyle(0,0,4);
gprintf(215,15,4,0,"GA-NN");
setcolor(9);
disp_hz24("遗传优化神经网络结构",170,50,25);
disp_hz16(" 同济大学计算机系 王小平",150,100,20);
disp_hz16("=========确定网络结点数==========",10,150,20);
ok=1;
while(ok==1)
{
setcolor(9);
disp_hz16("输入结点数:",10,180,20);
gscanf(300,180,9,15,3,"%s",choice);
i_num=atoi(choice);
setcolor(9);
disp_hz16("隐结点数:",10,210,20);
gscanf(300,210,15,15,3,"%s",choice);
h_num=atoi(choice);
setcolor(9);
disp_hz16("输出结点数:",10,240,20);
gscanf(300,240,15,0,4,"%s",choice);
o_num=atoi(choice);
t_num=i_num+h_num+o_num;
work=calc_g_length();
if(work>MAX_G_LENGTH)
disp_hz16("结点数太多,请重输入。",10,250,20);
else
{
g_length=(int)work;
setcolor(9);
disp_hz16("ok? 1:no, 2:yes",10,270,20);
  gscanf(300,270,4,0,4,"%s",choice);
ok=atoi(choice);
}
}
}

void set_problem()
{
int i,j;
FILE *fopen(),*fpt;
if((fpt=fopen("//ga//sample","r"))==NULL) exit(-1);
else
{
fscanf(fpt,"%d",&p_num);
for(i=1;i<=p_num;i++)
{
   for(j=1;j<=i_num;j++)
fscanf(fpt,"%d",&p_i_unit[i-1][j-1]);
   for(j=1;j<=o_num;j++)
   fscanf(fpt,"%d",&p_o_unit[i-1][j-1]);
}
fclose(fpt);
}
}

void g_draw_frame(x1,y1,x2,y2,c1,c2,c3,c4,text)
int x1,y1,x2,y2,c1,c2,c3,c4;
char *text;
{ int n,x3;
g_rectangle(x1,y1,x2,y2,c1,1);
g_rectangle(x1,y1,x2,y2,c2,0);
g_rectangle(x1,y1,x2,y1+16,c3,1);
g_rectangle(x1,y1,x2,y1+16,c2,0);
n=strlen(text);
x3=x1+((x2-x1-n*8)/2);
disp_hz16(text,x3,y1,c4);
}

void g_init_frames() /* 初始化画面 */
{
int i,j,cx,cy,x,y;
char text[17];
g_draw_frame(0,0,639,399,15,0,4,15,
"遗传优化神经网络结构");
g_draw_frame(0,16,320,170,7,15,8,15,"训练样本");
for(i=1;i<=p_num;i++)
{
y=48+(i-1)*16;
setcolor(9);
disp_hz16("No. :",20,y,15);
itoa(i,text,10);
g_text(48,y+8,4,text);
x=76;
for(j=1;j<=i_num;j++)
{
itoa(p_i_unit[i-1][j-1],text,3);
g_text(x,y+8,4,text);
x=x+8;
}
setcolor(4);
disp_hz16("===>",x,y,15);
x=x+30;
for(j=1;j<=o_num;j++)
{
itoa(p_o_unit[i-1][j-1],text,3);
g_text(x,y+8,4,text);
x=x+16;
}
}
g_draw_frame(0,170,320,399,7,15,8,15, "最大适应度个体对应的神经元连接矩阵");

g_draw_frame(320,16,639,207,7,15,8,15, "遗传算法适应度曲线");
g_draw_frame(320,207,639,399,7,15,8,15, "随机搜索法适应度曲线");
}

void g_init_graphs()
{
g_rectangle(GX1,GY1,GX1+GXR,GY1+GYR,0,1);
g_rectangle(GX1,GY1,GX1+GXR,GY1+GYR,6,0);
setcolor(1);
disp_hz16("最大适应度",GX1+5,GY1-18,15);
g_line(GX1+90,GY1-10,GX1+110,GY1-10,1);
setcolor(4);
disp_hz16("平均适应度",GX1+120,GY1-18,15);
g_line(GX1+205,GY1-10,GX1+225,GY1-10,4);
setcolor(15);
disp_hz16("世代数",GX1+168,GY1+GYR+10,15);
g_text(GX1-20,GY1,15,"1.0");
g_text(GX1-20,GY1+GYR,15,"0.0");

g_rectangle(GX2,GY2,GX2+GXR,GY2+GYR,0,1);
g_rectangle(GX2,GY2,GX2+GXR,GY2+GYR,6,0);
setcolor(1);
disp_hz16( "最大适应度",GX2+5,GY2-18,15);
g_line(GX2+90,GY2-10,GX2+110,GY2-10,1);
setcolor(4);
disp_hz16("平均适应度",GX2+120,GY2-18,15);
g_line(GX2+205,GY2-10,GX2+225,GY2-10,4);
setcolor(15);
disp_hz16("世代数",GX2+168,GY2+GYR+10,15);
g_text(GX2-20,GY2,15,"1.0");
g_text(GX2-20,GY2+GYR,15,"0.0");
}

void swap_fit(n1,n2)
int n1,n2;
{
unsigned char c;
double f;
int i;
for(i=0;i<g_length;i++)
{
c=gene[n1][i];

gene[n1][i]=gene[n2][i];
gene[n2][i]=c;
}
f=fitness[n1];
fitness[n1]=fitness[n2];
fitness[n2]=f;
}

void sort_fitness(p_size)
int p_size;
{
int i,j;
for(i=0;i<p_size-1;i++)
for(j=i+1;j<p_size;j++)
if(fitness[j]>fitness[i]) swap_fit(j,i);
max_fit=fitness[0];
avg_fit=0;
for(i=0;i<p_size;i++)
avg_fit=avg_fit+fitness[i]/(double)p_size;
}

void make_offspring(g1,g2,g3,ratio)
int g1,g2,g3;
double ratio;
{
int i,rnd;
uni_crossover(gene,g1,g2,g3,ratio,g_length);
for(i=0;i<g_length;i++)
{
rnd=random(100);
if(rnd<=32) gene[g3][i]=0;
  else if (rnd<=65) gene[g3][i]=1;
  else gene[g3][i]=2;
}
}

void ga_reproduction()
{
int i,n,p1,p2;
n=(int)(POP_SIZE*S_RATE);
for(i=0;i<n;i++)
{
p1=random;
p2=random;
while(p2==p1) p2=random;
make_offspring(p1,p2,POP_SIZE-i-1,0.5);
}
}

void g_disp_fitness(n,gen_num,mfold,afold,mf,af)
int n,gen_num;
double mfold,afold,mf,af;
{
int x,y,gx,gy,x_old,y_old;
char text[8];
if(n==1) {gx=GX1;gy=GY1;}
else {gx=GX2;gy=GY2;}
if(gen_num%10==0)
{
x=gx+(gen_num-1)*GSTEP;
g_line(x,gy+1,x,gy+GYR-1,1);
sprintf(text,"%d",gen_num);
if(gen_num<100||gen_num%20==0)
g_text(x-8,gy+GYR+7,15,text);
}
x_old=(int)(gx+(gen_num-1)*GSTEP);
x=x_old+(int)GSTEP;
y_old=(int)gy+GYR-mfold*GYR;
y=(int)gy+GYR-mf*GYR;
g_line(x_old,y_old,x,y,1);
y_old=gy+GYR-(int)(afold*GYR);
y=gy+GYR-(int)(af*GYR);
g_line(x_old,y_old,x,y,4);
}

void calc_fitness(p_size)
int p_size;
{
int i,j,k,m,counter,sum;
int gnum,correct,weight;
double d1,d2;
for(i=0;i<p_size;i++)
{
counter=0;
for(j=0;j<p_num;j++)
{
for(k=0;k<i_num;k++)
i_unit[k]=p_i_unit[j][k];
for(k=0;k<h_num;k++)
h_unit[k]=0;
gnum=0;
for(k=0;k<h_num;k++)
{
sum=0;
for(m=0;m<i_num;m++)
{
weight=gene[i][gnum];
if(weight==2) weight=-1;
sum=sum+weight*i_unit[m];
gnum++;
}
if(k>0)
{
for(m=0;m<k;m++)
{
weight=gene[i][gnum];
if(weight==2) weight=-1;
sum=sum+weight*h_unit[m];
gnum++;
}
}
if(sum>0) h_unit[k]=1;
else h_unit[k]=0;
}
for(k=0;k<o_num;k++)
o_unit[k]=0;
for(k=0;k<o_num;k++)
{
sum=0;
for(m=0;m<i_num;m++)
{
weight=gene[i][gnum];
if(weight==2) weight=-1;
sum=sum+weight*i_unit[m];
gnum++;
}
for(m=0;m<h_num;m++)
{
weight=gene[i][gnum];
if(weight==2) weight=-1;
sum=sum+weight*h_unit[m];
gnum++;
}
if(sum>0) o_unit[k]=1;
else o_unit[k]=0;
}
correct=1;
for(k=0;k<o_num;k++)
if(o_unit[k]!=p_o_unit[j][k]) correct=0;
counter=correct+counter;
}
d1=(double)p_num;
d2=(double)counter;
fitness[i]=d2/d1;
}
}

void g_disp_char(x,y,x1,y1,x2,y2,v) /* 图形中(x,y)点对应的v值的数字表示 */
int x,y,x1,y1,x2,y2;
unsigned char v;
{
char c[10];
if(x>=x1&& x<=x2-10 && y>=y1 && y<=y2-10)
{
switch(v)
{
  case 0: strcpy(c,"0/0");break;
  case 1: strcpy(c,"+/0");break;
  case 2: strcpy(c,"-/0");break;
  case 3: strcpy(c,"x/0");
}
g_text(x,y,4,c);
}
}

void g_disp_best_indv()
{
int x1,y1,x2,y2,x,y;
int i,j,n,g_num;
x1=40;y1=190;x2=304;y2=384;
g_rectangle(x1,y1,x2,y2,7,1);
y=y1+16;g_num=0;
for(i=0;i<t_num;i++)
{
x=x1;
for(j=0;j<t_num;j++)
{
if((i>=i_num && i<i_num+h_num && j<i) ||
(i>=i_num+h_num && j<i_num+h_num))
{ g_disp_char(x,y,x1,y1,x2,y2,gene[0][g_num]);
g_num++;
}
else g_disp_char(x,y,x1,y1,x2,y2,3);
   x=x+10;
}
y=y+10;

}
}

void make_random_gene(p_size)
{
int i,j,rnd;
for(i=0;i<p_size;i++)
for(j=0;j<g_length;j++)
{
rnd=random(100);
if(rnd<=32) gene[i][j]=0;
else if(rnd<=65) gene[i][j]=1;
else gene[i][j]=2;
}
}

void ga_search()
{
int gen_num;
double mfold,afold;
make_random_gene(POP_SIZE);
calc_fitness(POP_SIZE);
sort_fitness(POP_SIZE);
g_disp_best_indv();
mfold=max_fit;afold=avg_fit;
ga_reproduction();
for(gen_num=1;gen_num<=120;gen_num++)
{
calc_fitness(POP_SIZE);
sort_fitness(POP_SIZE);
g_disp_best_indv();
g_disp_fitness(1,gen_num,mfold,afold,max_fit,avg_fit);
mfold=max_fit;afold=avg_fit;
ga_reproduction();
}
}

void random_search()
{
int p_size,gen_num;
double mfold,afold;
p_size=(int)(POP_SIZE*S_RATE);
make_random_gene(p_size);
calc_fitness(p_size);
sort_fitness(p_size);
/* g_disp_best_indv();*/
mfold=max_fit;afold=avg_fit;
for(gen_num=1;gen_num<=120;gen_num++)
{
make_random_gene(p_size);
calc_fitness(p_size);
sort_fitness(p_size);
/* g_disp_best_indv();*/
g_disp_fitness(2,gen_num,mfold,afold,max_fit,avg_fit);
mfold=max_fit;afold=avg_fit;
}
}

main()
{
randomize();
/* 图形界面初始化 */
g_init();
init_mouse(0,6,1);
setcolor(5);
mouse_on(0);
set_network();
set_problem();
g_init_frames();
g_init_graphs();
ga_search();
random_search();
setcolor(5);
disp_hz16("回车键结束",10,430,20);
getch();
}

该程序出自《遗传算法原理——理论、方法与软件实现》一书的自带光盘


--
“凡是偶mm作出的决定,偶都坚决维护;
“凡是偶mm的指示,偶都始终不逾地照办。 ”
【这么做不是没原则,而是……】
“高举'热爱偶mm'理论的伟大旗帜,
“把建设有特色的相知、相亲、相爱、相厮守的伟大事业全面推向二十一世纪!!”
【注:如果偶和偶mm可以活到31世纪的话,以上的“二十一”用“三十一”代替。】

※ 来源:·日月光华 bbs.fudan.edu.cn·HTTP [FROM: 202.120.97.159]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值