基因算法源码2(Geneic Algorithm)

来源:百度文库 编辑:神马文学网 时间:2024/04/28 13:40:57
关键词:基因   算法   源码   Geneic   Algorithm
#include
#include
#include
#include
#define MaxGen 30
#define chrom_length 4
#define PopSize 20
#define Upper_Num 5
#define Down_Num 6
#define Point_Num 11
#define INFINITY 9999
#define pc 0.6
#define pm 0.05
#define E 2.78
double d=2,l=10;
double weight=0.5;
int gen;
struct individual{
int chrom[chrom_length];
double value;
double fitness;
};
struct Point{
double x;
double y;
}m_point[Point_Num]={{0,0},{d,0},{2*d,0},{3.5*d,0},{5*d,0},
{2*d,l},{3*d,l},{4*d,l},{0,l+d},{d,l+d},{5*d,l+d}};
double best=INFINITY;
int Best[chrom_length];
struct individual population[PopSize];
double Upper_Array[Upper_Num][35]={4,3,2,3,4,4,3,1,3,4,2,1,0,1,2,3.5,5,17,15,15,14,12,13,13,15,9,10,11, 12,13,13,11,13,10,12,5,4,3,4,5,5,4,2,2,3,3,2,1,0,1,2.5,4,16,14,14,13,11,12,12,14,8,9,10,11,12,12,10,12,9,11,6,5,4,5,4,6,5,3,3,2,4,3,2,1,0,1.5,3,15,13,13,17,10,11,11,13,7,8,9,10,11,11,9,11,8,10,
7.5,6.5,5.5,6.5,5.5,7.5,6.5,4.5,4.5,3.5,5.5,4.5,3.5,2.5,
1.5,0,1.5,13.5,11.5,11.5,10.5,8.5,9.5,9.5,11.5,5.5,6.5,7.5,8.5,9.5,9.5,7.5,9.5,6.5,8.5,9,8,7,6,5,9,8,6,6,5,7,6,5,4,3,1.5,0,12,10,10,9,7,8,8,10,4,5,6,7,8,8,6,8,5,7
};
double Down_Array[Down_Num][12]={
0,2,4,4,3,2,3,4,5,8.47214,8,6,
2,0,2,5,4,3,2,3,4,9.47214,9,7,
4,2,0,6,5,4,3,2,3,10.47214,10,8,
4,5,6,0,1,2,3,4,5,4.47214,4,2,
3,4,5,1,0,1,2,3,4,5.47214,5,3,
5,4,3,5,4,3,2,1,0,9.47214,9,7
};
int murr(int n){
int i,sum=1;
for(i=n;i>0;i--)
sum*=i;
return sum;
}
double min(double x,double y){
return (x>y?y:x);
}
double length(double x1,double y1,double x2,double y2){
return (sqrt(pow((x1-x2),2)+pow((y1-y2),2)));
}
double max(double x,double y){
return(x>y?x:y);
}
void Gener_Init(){//初始化
int i,j;
for(i=0;i{
do{
for(j=0;jpopulation[i].chrom[j]=rand()%5;
}while(population[i].chrom[0]==population[i].chrom[2]);
do{
for(j=1;jpopulation[i].chrom[j]=rand()%6;
}while(population[i].chrom[1]==population[i].chrom[3]);
}
}
void Add_Value(){//目标函数
int i,j,t1,t2,t3,t4;
double Umin_Value,Dmin_Value;
double l1,l2;
for(i=0;iUmin_Value=0; Dmin_Value=0;
for(j=0;j<35;j++)
Umin_Value+=min(Upper_Array[population[i].chrom[0]][j],
Upper_Array[population[i].chrom[2]][j]);
for(j=0;j<12;j++)
Dmin_Value+=min(Down_Array[population[i].chrom[1]][j],
Down_Array[population[i].chrom[3]][j]);
t1=population[i].chrom[0];
t2=population[i].chrom[1]+5;
t3=population[i].chrom[2];
t4=population[i].chrom[3]+5;
l1=length(m_point[t1].x,
m_point[t1].y,
m_point[t2].x,
m_point[t2].y);
l2=length(m_point[t3].x,
m_point[t3].y,
m_point[t4].x,
m_point[t4].y);
population[i].value=weight*(Umin_Value+Dmin_Value)+(1-weight)*(l1+l2)*100;
}
}
void selection(){//选择
int i,index;
double p,temp=0,total=0;
double cfitness[PopSize];
struct individual newpopulation[PopSize];
for(i=0;itemp=max(population[i].value,temp);
total+=population[i].value;
}
temp+=100;
for(i=0;ipopulation[i].fitness=(temp-population[i].value)/(PopSize*temp-total);
cfitness[i]=population[i].fitness;
}
for(i=1;icfitness[i]+=cfitness[i-1];
for(i=0;ip=rand()%1000/1000.0;
index=0;
while(p>cfitness[index])
index++;
newpopulation[i]=population[index];
}
for(i=0;ipopulation[i]=newpopulation[i];
}
}
void Crossing(){//
int i,j;//
int index[PopSize],temp,point;
double p;
for(i=0;iindex[i]=i;
for(i=0;ipoint=rand()%(PopSize-i);
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
for(i=0;ip=rand()%1000/1000.0;
if(ppoint=rand()%2;
if(point==0)
for(j=0;j{
temp=population[index[i]].chrom[j];
population[index[i]].chrom[j]
=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=temp;
}
else
for(j=1;j{
temp=population[index[i]].chrom[j];
population[index[i]].chrom[j]
=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=temp;
}
}
}
}
void Muta_Opeator(){//
int i,j,s,q;
double p;
for(i=0;ifor(j=0;jp=rand()%1000/1000.0;
if(pq=rand()%4;
switch(q){
case 0:
s=rand()%5;
while(s==population[i].chrom[2])
s=rand()%5;
population[i].chrom[q]=s;
break;
case 1:
s=rand()%6;
while(s==population[i].chrom[3])
s=rand()%6;
population[i].chrom[q]=s;
break;
case 2:
s=rand()%5;
while(s==population[i].chrom[0])
s=rand()%5;
population[i].chrom[q]=s;
break;
case 3:
s=rand()%6;
while(s==population[i].chrom[1])
s=rand()%6;
population[i].chrom[q]=s;
break;
}
}
}
}
void print(){
int i,temp=-1;
double average,sum=0;
cout<for(i=0;isum+=population[i].value;
average=sum/PopSize;
for(i=0;iif(best>=population[i].value){
best=population[i].value;
temp=i;
}
}
if(temp!=-1){
for(i=0;iBest[i]=population[temp].chrom[i];
}
cout<<"Generation="<for(i=0;icout<cout<}
void main(){
int q=5,k;
double p[35],sum;
int i,j;
do{
for(i=0;i<35;i++){
k=rand()%(3*q);
p[i]=pow(q,k)*pow(E,-1*q)/(murr(k));
sum+=p[i];}
}while(sum==1.0);
for(i=0;ifor(j=0;j<35;j++)
Upper_Array[i][j]*=p[j];
do{
for(i=0;i<12;i++){
k=rand()%(3*q);
p[i]=pow(q,k)*pow(E,-1*q)/(murr(k));
sum+=p[i];}
}while(sum==1.0);
for(i=0;ifor(j=0;j<12;j++)
Down_Array[i][j]*=p[j];
gen=0;
Gener_Init();
while(genAdd_Value();
print();
selection();
Crossing();
Muta_Opeator();
// print();
gen++;
}
}
【作者:ahli8848】【访问统计:16】【2006年04月30日 星期日 22:16】【加入