c语言实现*遗传算法改进BP神经网络原理和算法实现怎么弄

Python016

c语言实现*遗传算法改进BP神经网络原理和算法实现怎么弄,第1张

遗传算法有相当大的引用。遗传算法在游戏中应用的现状在遗传编码时, 一般将瓦片的坐标作为基因进行实数编码, 染色体的第一个基因为起点坐标, 最后一个基因为终点坐标, 中间的基因为路径经过的每一个瓦片的坐标。在生成染色体时, 由起点出发, 随机选择当前结点的邻居节点中的可通过节点, 将其坐标加入染色体, 依此循环, 直到找到目标点为止, 生成了一条染色体。重复上述操作, 直到达到指定的种群规模。遗传算法的优点:1、遗传算法是以决策变量的编码作为运算对象,可以直接对集合、序列、矩阵、树、图等结构对象进行操作。这样的方式一方面有助于模拟生物的基因、染色体和遗传进化的过程,方便遗传操作算子的运用。另一方面也使得遗传算法具有广泛的应用领域,如函数优化、生产调度、自动控制、图像处理、机器学习、数据挖掘等领域。2、遗传算法直接以目标函数值作为搜索信息。它仅仅使用适应度函数值来度量个体的优良程度,不涉及目标函数值求导求微分的过程。因为在现实中很多目标函数是很难求导的,甚至是不存在导数的,所以这一点也使得遗传算法显示出高度的优越性。3、遗传算法具有群体搜索的特性。它的搜索过程是从一个具有多个个体的初始群体P(0)开始的,一方面可以有效地避免搜索一些不必搜索的点。另一方面由于传统的单点搜索方法在对多峰分布的搜索空间进行搜索时很容易陷入局部某个单峰的极值点,而遗传算法的群体搜索特性却可以避免这样的问题,因而可以体现出遗传算法的并行化和较好的全局搜索性。4、遗传算法基于概率规则,而不是确定性规则。这使得搜索更为灵活,参数对其搜索效果的影响也尽可能的小。5、遗传算法具有可扩展性,易于与其他技术混合使用。以上几点便是遗传算法作为优化算法所具备的优点。遗传算法的缺点:遗传算法在进行编码时容易出现不规范不准确的问题。

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)