求遗传算法(GA)C语言代码

求遗传算法(GA)C语言代码,第1张

x=220

for(i=0i<12i++)

{

y=202+i*16

for(j=bits [ i][0]j<=bits [ i][1]j++)

if(g[j]==0)

g_text(x+(j-bits [ i][0])*16,y,4,"0")

else

g_text(x+(j-bits [ i][0])*16,y,4,"1")

}

}

}

void g_disp_char(x,y,x1,y1,x2,y2,v)

int x,y,x1,y1,x2,y2

unsigned char v

{

char c[10]

if(x>=x1&&x<=x2-8 &&y>=y1 &&y<=y2-10)

{

switch(v)

{

case 0: strcpy(c,"0")break

case 1: strcpy(c,"+")break

case 2: strcpy(c,"-")break

case 3: strcpy(c,"x")

}

g_text(x,y,15,c)

}

}

void remove_life(n) /* 消除第n个个体 */

int n

{

iflg[n]=0

world[iatr[n][0]][iatr[n][1]]=0

g_disp_unit(iatr[n][0],iatr[n][1],0)

if(food_size+1<=MAX_FOOD)

{

food_size++

fatr[food_size-1][0]=iatr[n][0]

fatr[food_size-1][1]=iatr[n][1]

fatr[food_size-1][2]=1

fatr[food_size-1][3]=0

fflg[food_size-1]=1

world[iatr[n][0]][iatr[n][1]]=5

g_disp_unit(iatr[n][0],iatr[n][1],5)

}

}

void remove_food(n) /* 消除第n个食物 */

int n

{

fflg[n]=0

world[fatr[n][0]][fatr[n][1]]=0

g_disp_unit(fatr[n][0],fatr[n][1],0)

}

void make_lives_and_foods() /* 设置虚拟环境中生物与食物 */

{

int x,y,i,j

pop_size=0

food_size=0

for(y=0y<wyy++)

for(x=0x<wxx++)

{

if(world[x][y]==1||world[x][y]==2)

{

if(pop_size+1<=MAX_POP)

{

pop_size++

/* 生成遗传因子 */

gene[pop_size-1][0]=world[x][y]-1

for(i=1i<G_LENGTHi++)

gene[pop_size-1] [ i]=random(2)

/* 设定属性 */

iatr[pop_size-1][0]=x

iatr[pop_size-1][1]=y

iatr[pop_size-1][2]=70+random(30)

iatr[pop_size-1][3]=random(SL_MIN)

}

}

if(world[x][y]==3||world[x][y]==5)

{

if(food_size+1<=MAX_FOOD)

{

food_size++

/* 设定属性 */

fatr[food_size-1][0]=x

fatr[food_size-1][1]=y

if(world[x][y]==3)

fatr[food_size-1][2]=0

else

fatr[food_size-1][2]=1

fatr[food_size-1][3]=random(TL1-1)+1

}

}

}

}

void find_empty(x,y) /* 寻找虚拟环境中的空处,返回坐标 */

int *x,*y

{

int ok

ok=0

while(ok==0)

{

*x=random(wx)*y=random(wy)

if(world[*x][*y]==0) ok=1

}

}

void make_world() /* 随机设定人工环境 */

{

int i,j,k,num,x,y

int ok,overlap

char choice[3]

double size

wx=0

while(wx<10||wx>MAX_WX)

{

setcolor(15)

disp_hz16("虚拟环境长度(10-60)",10,210,20)

gscanf(300,210,4,0,3,"%s",choice)

wx=atoi(choice)

}

wy=0

while(wy<10||wy>MAX_WY)

{

setcolor(15)

disp_hz16("虚拟环境宽度(10-32)",10,240,20)

gscanf(300,240,4,0,3,"%s",choice)

wy=atoi(choice)

}

for(i=0i<wyi++)

for(j=0j<wxj++)

if(i==0||i==wy-1||j==0||j==wx-1)

world[j] [ i]=4

else world[j] [ i]=0

/* 设定障碍物 */

size=(double)(wx*wy)

num=(int)(size/40.0)

if(num>MAX_POP) num=MAX_POP

for(i=0i<numi++)

{

find_empty(&x,&y)

world[x][y]=4

}

num=(int)(size/5.0)

if(num>MAX_FOOD) num=MAX_FOOD

for(i=0i<numi++)

{

ok=0

while(ok==0)

{

x=random(wx)y=random(wy)

if((world[x][y]!=4) &&

(world[x][y-1]==4 || world[x][y+1]==4 ||

world[x-1][y]==4 || world[x+1][y]==4))

{ world[x][y]=4

ok=1

}

}

}

for(y=0y<wyy++)

for(x=0x<wxx++)

if(world[x][y]==0)

{

num=0

for(i=-1i<=1i++)

for(j=-1j<=1j++)

if(get_world(x+j,y+i)==4)

num++

if(num>=6) world[x][y]=4

}

/* 设定生物 */

num=(int)(size*R_LIFE)

for(i=0i<numi++)

{ find_empty(&x,&y)

world[x][y]=random(2)+1

}

/* 设定食物 */

num=(int)(size*R_FOOD)

for(i=0i<numi++)

{

find_empty(&x,&y)

world[x][y]=3

}

}

void load_world_file() /* 读取虚拟环境数据文件设定 */

{

FILE *fopen(),*fpt

char st[100],c

int i,j

if((fpt=fopen("\ga\world","r"))==NULL) exit(-1)

else

{

fscanf(fpt,"%d",&wx)

fscanf(fpt,"%d",&wy)

for(i=0i<wyi++)

for(j=0j<wxj++)

fscanf(fpt,"%d",&world[j] [ i])

fclose(fpt)

需要很多的子函数 %子程序:新物种交叉 *** 作,函数名称存储为crossover.m function scro=crossover(population,seln,pc)BitLength=size(population,2)pcc=IfCroIfMut(pc)%根据交叉概率决定是否进行交叉 *** 作,1则是,0则否 if pcc==1 chb=round(rand*(BitLength-2))+1%在[1,BitLength-1]范围内随机产生一个交叉位 scro(1,:)=[population(seln(1),1:chb) population(seln(2),chb+1:BitLength)] scro(2,:)=[population(seln(2),1:chb) population(seln(1),chb+1:BitLength)] else scro(1,:)=population(seln(1),:)scro(2,:)=population(seln(2),:)end %子程序:计算适应度函数,函数名称存储为fitnessfun.m function [Fitvalue,cumsump]=fitnessfun(population)global BitLength global boundsbegin global boundsend popsize=size(population,1)%有popsize个个体 for i=1:popsize x=transform2to10(population(i,:))%将二进制转换为十进制 %转化为[-2,2]区间的实数 xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1)Fitvalue(i)=targetfun(xx)%计算函数值,即适应度 end %给适...

望采纳!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12174013.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存