您当前的位置:matlab资源网文章中心资料 → 文章内容

遗传算法实例

作者:wanghe334  来源:转载  发布时间:2008-8-1 8:35:41

遗传算法实例

 

基于遗传算法的人工生命模拟
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
#include<math.h>
#include<time.h>
#include<string.h>
#include "graph.c"

#define TL1 20
#define TL2 5
#define NEWFOODS 3
#define MUTATION 0.05
#define G_LENGTH 32
#define MAX_POP 100
#define MAX_FOOD 100
#define MAX_WX 60
#define MAX_WY 32
#define SX1 330
#define SY1 40
#define GX 360
#define GY 257
#define GXR 250
#define GYR 100
#define GSTEP 2
#define R_LIFE 0.05
#define R_FOOD 0.02
#define SL_MIN 10

unsigned char gene[MAX_POP][G_LENGTH];
unsigned char iflg[MAX_POP];
unsigned char fflg[MAX_FOOD];
unsigned char world[MAX_WX][MAX_WY];
unsigned char
life1[5][5]={{0,0,1,0,0},{0,1,0,1,0},{1,0,0,0,1},{0,1,0,1,0},{0,0,1,0,0}};
unsigned char
life2[5][5]={{1,1,1,1,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,1}};
unsigned char
food1[5][5]={{0,0,0,1,0},{0,0,1,1,0},{0,1,0,1,0},{0,0,1,1,0},{0,0,0,1,0}};
unsigned char
food2[5][5]={{0,0,0,1,0},{0,0,1,1,0},{0,1,1,1,0},{0,0,1,1,0},{0,0,0,1,0}};
int pop_size;
int iatr[MAX_POP][4];




int food_size;
int fatr[MAX_FOOD][4];




int wx,wy;

void uni_crossover(gene,g1,g2,g3,ratio1,g_length)
unsigned char *gene;
int g1,g2,g3;
double ratio1;
int g_length;
{
unsigned char *gene1;
unsigned char *gene2;
unsigned char *gene3;
double rnd,r1;
int i;
gene1=gene+g_length*g1;
gene2=gene+g_length*g2;
gene3=gene+g_length*g3;
r1=(int)(10000.0*ratio1);
for(i=0;i<g_length;i++)
{ rnd=random(10000);
if(rnd<=r1) *(gene3+i)=*(gene1+i);
else *(gene3+i)=*(gene2+i);
}
}

void g_disp_unit(x,y,n)

int x,y;
int n;
{
int gx,gy,i,j;
unsigned char col;
gx=SX1+5*x;gy=SY1+5*y;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{ switch(n)
{ case 0: col=0; break;
case 1: col=life1[j] [ i]*2; break;
case 2: col=life2[j] [ i]*4; break;
case 3: col=food1[j] [ i]*6; break;
case 4: col=7; break;
case 5: col=food2[j] [ i]*11;
}
g_pset(gx+j,gy+i,col);
}
}

void g_draw_world()
{
int i,j;
for(i=0;i<wy;i++)
for(j=0;j<wx;j++)
g_disp_unit(j,i,world[j] [ i]);
}

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,0,8,15,"设定参数");
y=48;
setcolor(9);
disp_hz16("植物食物限制时间",16,y,15);
sprintf(text,"%d",TL1);
g_text(200,y+8,4,text);
y=y+24;
setcolor(9);
disp_hz16("动物食物限制时间",16,y,15);
sprintf(text,"%d",TL2);
g_text(200,y+8,4,text);
y=y+24;
setcolor(9);
disp_hz16("植物食物每代生成个数",16,y,15);
sprintf(text,"%d",NEWFOODS);
g_text(200,y+8,4,text);
y=y+24;
setcolor(9);
disp_hz16("变异概率",16,y,15);
i=(int)(MUTATION*100.0);
sprintf(text,"%d",i);
g_text(152,y+8,4,text);
g_draw_frame(0,170,320,399,7,0,8,15,"最佳基因型");
x=16;y=194;
setcolor(9);
disp_hz16("SP:物种号........",x,y,15);y=y+16;
disp_hz16("SL:寿命..........",x,y,15);y=y+16;
disp_hz16("VF:视野..........",x,y,15);y=y+16;
disp_hz16("TM:基本移动模式..",x,y,15);y=y+16;
disp_hz16("CM:移动特点......",x,y,15);y=y+16;
disp_hz16("LM:移动能耗......",x,y,15);y=y+16;
disp_hz16("CA:行动特点......",x,y,15);y=y+16;
disp_hz16("CR:善变性........",x,y,15);y=y+16;
disp_hz16("SA:攻击速度......",x,y,15);y=y+16;
disp_hz16("DA:防御能力......",x,y,15);y=y+16;
disp_hz16("LA:攻击能耗......",x,y,15);y=y+16;
disp_hz16("EF:食物吸取效率..",x,y,15);y=y+16;
g_draw_frame(320,16,639,207,7,0,8,15,"虚拟世界");
g_draw_frame(320,207,639,399,7,0,8,15,"世代个体数目变化");
}

void g_init_graph()

{
g_rectangle(GX,GY,GX+GXR,GY+GYR,0,1);
g_rectangle(GX,GY,GX+GXR,GY+GYR,6,0);
setcolor(1);
disp_hz16( "生物 1",GX+5,GY-18,15);
g_line(GX+90,GY-10,GX+110,GY-10,1);
setcolor(4);
disp_hz16( "生物 2",GX+120,GY-18,15);
g_line(GX+205,GY-10,GX+225,GY-10,4);
setcolor(0);
disp_hz16("世代数",GX+168,GY+GYR+10,15);
g_text(GX-25,GY,0,"100");
g_text(GX-14,GY+GYR,0,"0");
}

void g_plot_population(gen_num,n1,n2,n1old,n2old)
int gen_num,n1,n2,n1old,n2old;
{
int x,y,gx,gy,x_old,y_old;
char text[8];
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+5,15,text);
}
x_old=GX+(gen_num-1)*GSTEP;
x=x_old+GSTEP;
y_old=GY+GYR-n1old;
y=GY+GYR-n1;
g_line(x_old,y_old,x,y,1);
y_old=GY+GYR-n2old;
y=GY+GYR-n2;
g_line(x_old,y_old,x,y,4);
}

void g_disp_genotype()
{
int i,j,n0,n1,x,y;
unsigned char g[G_LENGTH];
unsigned char bits[12][2]=
{ {0,0},{1,4},{5,6},{7,8},{9,11},{12,12},{13,15},
{16,18},{19,21},{22,24},{25,27},{28,31}};

g_rectangle(200,187,319,398,7,1);
if(pop_size!=0)
{

for(i=0;i<G_LENGTH;i++)
{
n0=0;n1=0;
for(j=0;jif(gene[j] [ i]==0) n0++;
else n1++;
if(n0>=n1) g [ i]=0; else g [ i]=1;
}
x=220;
for(i=0;i<12;i

[1] [2] [3] [4] [5]  下一页

  • 上一篇文章:一点体会
  • 下一篇文章:已经没有了
  • 文章评论 (评论内容只代表网友观点,与本站立场无关!)

    用户名: 查看更多评论

    分 值:100分 85分 70分 55分 40分 25分 10分 0分

    内 容:

             (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

    关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 -