NSGAII别人的源程序.docx

上传人:b****6 文档编号:7188530 上传时间:2023-01-21 格式:DOCX 页数:15 大小:17.41KB
下载 相关 举报
NSGAII别人的源程序.docx_第1页
第1页 / 共15页
NSGAII别人的源程序.docx_第2页
第2页 / 共15页
NSGAII别人的源程序.docx_第3页
第3页 / 共15页
NSGAII别人的源程序.docx_第4页
第4页 / 共15页
NSGAII别人的源程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

NSGAII别人的源程序.docx

《NSGAII别人的源程序.docx》由会员分享,可在线阅读,更多相关《NSGAII别人的源程序.docx(15页珍藏版)》请在冰豆网上搜索。

NSGAII别人的源程序.docx

NSGAII别人的源程序

#include

#include

#include

#include

#include

#include

#defineD10//基因维数

#definepopsize100//种群大小

#definegenetic2000//繁衍代数

#defineURAND(rand()/(RAND_MAX+1.0))

#defineepx3.1415926#defineU_S20

intrand_int(intlow,inthight);

doublerand_real(doublelow,doublehigh);

intcmp1(constvoid*a,constvoid*b);

intcmp2(constvoid*a,constvoid*b);

intcmp3(constvoid*a,constvoid*b);

inttemp1[popsize];intmark[popsize];

usingnamespacestd;classindivial{

public:

doublex[D];

intdomi[2*popsize],np,is_domied;//支配集合

voidinition();

intrank;

doublecrowding;

doublefintness[2];

voidfitness_count();

};indivialF[2*popsize][2*popsize];

classpopulation

{

public:

population();

indivialP[popsize];//当代

indivialQ[popsize];//产生的子代

indivialR[2*popsize];

intR_num;

voidset_p_q();

intP_num;

intQ_num;

voidnodominata_sort();//非支配排序

intlen[2*popsize];

intlen_f;

voidcrowding_distance(inti);

voidsorts(inti);

voidmake_new_pop();

voidfast_sort_nondominate();

voidcal();

intm_choice(inta,intb);

};

boolis_dominated(constindivial&a,constindivial&b);

intmain(){

FILE*p;

p=fopen("d:

\\1.txt","w+");

srand((unsignedint)(time(0)));

populationpop;

pop.cal();

inti;

cout<

intj;

for(i=0;i

{

fprintf(p,"第%d个个体\n",i);

fprintf(p,"%f%f\n",pop.P[i].fintness[0],pop.P[i].fintness[1]);

for(j=0;j

fprintf(p,"%e",pop.P[i].x[j]);

fprintf(p,"\n");

}

fclose(p);

return1;

}

voidindivial:

:

inition()

{

inti;

for(i=0;i

x[i]=rand_real(0.0,1.0);

}

population:

:

population()

{

inti;

for(i=0;i

{

P[i].inition();

}

for(i=0;i

{

P[i].fitness_count();

}

P_num=popsize;

Q_num=0;

R_num=0;

}

voidpopulation:

:

make_new_pop()

{

inti,j,x,y,t1,t2,t3;

doubles,u,b;

memset(mark,0,sizeof(mark));

t3=0;

while(t3

{

while(t1=t2=rand_int(0,popsize-1),mark[t1]);

while(t1==t2||mark[t2])

{t2=rand_int(0,popsize-1);

}

t1=m_choice(t1,t2);

temp1[t3++]=t1;

mark[t1]=1;

//printf("__%d___",t1);

}

//printf("_______________%d__",t3);

for(i=0;i

{

s=rand_real(0.0,1.0);

if(s<=0.9)

{

for(j=0;j

{

u=rand_real((0.0+1e-6),(1.0-1e-6));

if(u<=0.5)

{

b=pow(2*u,1.0/21);

}

else

{

b=1.0/pow(2*(1-u),1.0/21);

}

x=y=rand_int(0,popsize/2-1);

while(x==y)

y=rand_int(0,popsize/2-1);

Q[i].x[j]=1.0/2*((1-b)*P[temp1[x]].x[j]+(1+b)*P[temp1[y]].x[j]);

if(Q[i].x[j]<0)

Q[i].x[j]=1e-6;

elseif(Q[i].x[j]>1)

Q[i].x[j]=1.0-(1e-6);

if(i+1

{

Q[i+1].x[j]=1.0/2*((1+b)*P[temp1[x]].x[j]+(1-b)*P[temp1[y]].x[j]);

if(Q[i+1].x[j]<=0)

Q[i+1].x[j]=1e-6;

elseif(Q[i+1].x[j]>1)

Q[i+1].x[j]=(1-1e-6);

}

}

i++;

}

else

{

for(j=0;j

{

x=rand_int(0,popsize/2-1);

u=rand_real(0.0+(1e-6),1.0-(1e-6));

if(u<0.5)

{

u=pow(2*u,1.0/21)-1;

}

else

{

u=1-pow(2*(1-u),1.0/21);

}

Q[i].x[j]=P[temp1[x]].x[j]+(1.0-0.0)*u;

if(Q[i].x[j]<0)

Q[i].x[j]=1e-6;

elseif(Q[i].x[j]>1)

Q[i].x[j]=1-(1e-6);

}

}

}

Q_num=popsize;

for(i=0;i

{

Q[i].fitness_count();

}

}

voidindivial:

:

fitness_count()

{

fintness[0]=x[0];

inti;

doubleg=1,sum=0;

for(i=1;i

{

sum+=x[i];

}

sum=9*(sum/(D-1));

g+=sum;

fintness[1]=g*(1-sqrt(x[0]/g));

}

doublerand_real(doublelow,doublehigh)

{

doubleh;

h=(high-low)*URAND+low+0.001;

if(h>=high)

h=high-0.001;

returnh;

}

voidpopulation:

:

set_p_q()

{

R_num=0;

Q_num=popsize;

inti;

for(i=0;i

{

R[R_num++]=P[i];

}

for(i=0;i

{

R[R_num++]=Q[i];

}

for(i=0;i<2*popsize;i++)

{

R[i].fitness_count();

}

}

voidpopulation:

:

nodominata_sort()

{

inti,j,k;

indivialH[2*popsize];

inth_len=0;

for(i=0;i<2*popsize;i++)

{

R[i].np=0;

R[i].is_domied=0;

len[i]=0;

}

for(i=0;i<2*popsize;i++)

{

for(j=0;j<2*popsize;j++)

{

if(i!

=j)

{

if(is_dominated(R[i],R[j]))

{

R[i].domi[R[i].is_domied++]=j;

}

elseif(is_dominated(R[j],R[i]))

R[i].np+=1;

}

}

if(R[i].np==0)

{

len_f=1;

F[0][len[0]++]=R[i];

}

}

i=0;

while(len[i]!

=0)

{

h_len=0;

for(j=0;j

{

for(k=0;k

{

R[F[i][j].domi[k]].np--;

if(R[F[i][j].domi[k]].np==0)

{

H[h_len++]=R[F[i][j].domi[k]];

R[F[i][j].domi[k]].rank=i+1;

}

}

}

i++;

len[i]=h_len;

if(h_len!

=0)

{

len_f++;

for(j=0;j

{

F[i][j]=H[j];

}

}

}

}

boolis_dominated(constindivial&a,constindivial&b)

{

if((a.fintness[0]<=b.fintness[0])&&(a.fintness[1]<=b.fintness[1]))

{

if((a.fintness[0]==b.fintness[0])&&(a.fintness[1]==b.fintness[1]))

returnfalse;

returntrue;

}

elsereturnfalse;

}

voidpopulation:

:

crowding_distance(inti)

{

intn=len[i];

doublem_max,m_min;

intj;

for(j=0;j

{

F[i][j].crowding=0;

}

F[i][0].crowding=F[i][n-1].crowding=0xffffff;

qsort(F[i],n,sizeof(indivial),cmp1);

m_max=-0xfffff;

m_min=0xfffff;

for(j=0;j

{

if(m_max

m_max=F[i][j].fintness[0];

if(m_min>F[i][j].fintness[0])

m_min=F[i][j].fintness[0];

}

for(j=1;j

{

F[i][j].crowding=F[i][j].crowding+(F[i+1][j].fintness[0]-F[i][j-1].fintness[0])/(m_max-m_min);

}

F[i][0].crowding=F[i][n-1].crowding=0xffffff;

qsort(F[i],n,sizeof(indivial),cmp2);

m_max=-0xfffff;

m_min=0xfffff;

for(j=0;j

{

if(m_max

m_max=F[i][j].fintness[1];

if(m_min>F[i][j].fintness[1])

m_min=F[i][j].fintness[1];

}

for(j=2;j

{

F[i][j].crowding=F[i][j].crowding+(F[i+1][j].fintness[1]-F[i][j-1].fintness[1])/(m_max-m_min);

}

}

intcmp1(constvoid*a,constvoid*b)

{

constindivial*e=(constindivial*)a;

constindivial*f=(constindivial*)b;

if(e->fintness[0]==f->fintness[0])

return0;

elseif(e->fintness[0]fintness[0])

return-1;

elsereturn1;

}

intcmp2(constvoid*a,constvoid*b)

{

constindivial*e=(constindivial*)a;

constindivial*f=(constindivial*)b;

if(e->fintness[1]==f->fintness[1])

return0;

elseif(e->fintness[1]fintness[1])

return-1;

elsereturn1;

}

voidpopulation:

:

sorts(inti)

{

intn;

n=len[i];

qsort(F[i],n,sizeof(indivial),cmp3);

}

intcmp3(constvoid*a,constvoid*b)

{

constindivial*e=(constindivial*)a;

constindivial*f=(constindivial*)b;

if(e->crowding==f->crowding)

return0;

elseif(e->crowdingcrowding)

return1;

elsereturn-1;

}

intrand_int(intlow,inthight)

{

returnint((hight-low+1)*URAND)+low;

}

voidpopulation:

:

cal()

{

ints;

inti,j;

s=genetic;

make_new_pop();

while(s--)

{

printf("第%d\n",s);

set_p_q();

nodominata_sort();

P_num=0;

i=0;

while(P_num+len[i]<=popsize)

{

crowding_distance(i);

for(j=0;j

{

P[P_num++]=F[i][j];

}

i++;

if(i>=len_f)break;

}

if(i

{

crowding_distance(i);

sorts(i);

}

for(j=0;j

{

P[P_num++]=F[i][j];

}

make_new_pop();

}printf("S");

}

intpopulation:

:

m_choice(inta,intb)

{if(P[a].rank

returna;

elseif(P[a].rank==P[b].rank)

{

if(P[a].crowding>P[b].crowding)

returna;

elsereturnb;

}

returnb;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1