遗传算法源程序
北京航空航天大学 SY11153** 李**
遗传算法源程序
一、问题:
已知线性规划
maximize 3x1+x2+3x3
s.t.2x1+x2+x3≤2
x1+2x2+3x3≤5
2x1+2x2+x3≤6
0≤x1,x2,x3≤2.56;
该问题的最优解为x1=0.2,x2=0,x3=1.6;目标函数最优值为5.4。
二、该问题的遗传算法源程序。
(c语言,在VC++环境下编译运行)。
********************************************************************* #include
#include
#include
#include
#define popsize 200 /*定义种群规模*/
#define pc 0.5 /*定义交叉概率*/
#define pm 0.01 /*定义变异概率*/
#define T 30 /*定义遗传运算的终止进化代数*/
#define chrolength 15 /*定义染色体的长度*/
struct individual
{char chromosome[chrolength+1]; /*定义染色体长度*/
float x1,x2,x3,x10,x20,x30; /*定义自变量*/
float objval; /*定义目标函数*/
float fitness; /*定义适应度*/
float relfit; /*定义相对适应度*/
};
struct individual population[popsize]; /*定义一个群体*/
struct individual newpop[popsize]; /*定义转换的中间群体*/
void Genechromo() /*定义一个函数,用于生成初始的染色体*/ {int i=0,j=0;
int temp;
for(i=0;i
{for(j=0;j
{temp=rand()%100;
population[i].chromosome[j]=(temp
}
population[i].chromosome[chrolength]='\0';
}
}
void Decodechromo() /*本函数对染色体进行解码*/
{int i=0,j=0;int sum1,sum2,sum3;
for(i=0;i
{sum1=sum2=sum3=0;
for(j=0;j
{if(j>9)
sum3=sum3+((population[i].chromosome[j]-'0')4)
sum2=sum2+((population[i].chromosome[j]-'0')
population[i].x1=sum1;population[i].x2=sum2;population[i].x3=sum3;
population[i].x10=2.56/31*sum1;population[i].x20=2.56/31*sum2;population[i].x30=
2.56/31*sum3;
}
} else sum1=sum1+((population[i].chromosome[j]-'0')
void Caculatfitness() /*本函数计算目标函数值、适应度和相对适应度等参数*/
{float xigma1=1.5,xigma2=1.0,xigma3=1.0;
float x1,x2,x3;
float fitness;
float objvalue;
int i;
float sum=0;
for(i=0;i
{x1=population[i].x10;x2=population[i].x20;x3=population[i].x30;
objvalue=3*x1+x2+3*x3;
fitness=objvalue;
if(2*x1+x2+x3-2>0||x1+2*x2+3*x3-5>0||2*x1+2*x2+x3-6>0)
fitness=fitness/pow(1.5,objvalue*0.4);
else fitness=fitness*pow(1.11,objvalue);
if(fitness
population[i].objval=objvalue;population[i].fitness=fitness;
sum=sum+fitness;
}
for(i=0;i
{
population[i].relfit=population[i].fitness/sum;
}
}
void Selectpop() /*本函数对群体进行选择运算*/
{ float Num,mul; int nu;
int i,j,kul,temp=0;
int tem[popsize];
float temp0[popsize];
for(i=0;i
{Num=population[i].relfit*popsize;
nu=(int)Num;
for(j=temp;j
newpop[j]=population[i];
temp=temp+nu;temp0[i]=Num-nu;tem[i]=i;
}
for(i=0;i
for(j=i+1;j
mul=temp0[i];temp0[i]=temp0[j];temp0[j]=mul;
kul=tem[i];tem[i]=tem[j];tem[j]=kul;}
}
for(i=0;i
void Crosschromo() /*本函数对群体进行交叉运算*/ {int temp[popsize];
int temp0[popsize];
int i,j,mark,tc;
char td;
for(i=0;i
{temp0[i]=rand()%popsize;temp[i]=0;}
for(i=0;i
if(temp[temp0[i]]==0)
{newpop[temp0[i]]=population[i];temp[temp0[i]]=1;}
else
newpop[j]=population[i];temp[j]=1;
}
for(i=0,j=popsize-1;i
if(rand()%100
{mark=rand()%chrolength; for(tc=mark+1;tc
newpop[j].chromosome[tc]=td;}
}
for(i=0;i
population[i]=newpop[i];
}
void mutation() /*本函数对群体中个体进行变异操作*/ { char mutamark[chrolength];
int i,j;
char temp;
for(i=0;i
if(rand()%100
mutamark[i]='1';
else mutamark[i]='0';
for(i=0;i
}
void main()
{int i=0,j=0;
int Evomark;
srand((unsigned)time(NULL)); for(j=0;j
Genechromo(); /*生成初始群体,并进行解码、计算适应度等参数*/
Decodechromo();
Caculatfitness();
for(Evomark=0;Evomark
{Selectpop();
Crosschromo();
mutation();
Decodechromo();
Caculatfitness();}
for(i=0;i
for(j=0;j
if(population[i].chromosome[j]=='\0')
{printf("%c,%f,%f,%f",population[i].chromosome[j],population[i].x1,population
[i].x2,population[i].x3);
printf(",%f,%f,%f",population[i].x10,population[i].x20,population[i].x30);
printf(",%f,%f,%f",population[i].objval,population[i].fitness,population[i].relfit); printf("\n");}
else
printf("%c",population[i].chromosome[j]);
}
********************************************************************* 运行结果:经过多次试算,得到比较好的解是
x1=0.247742,x2=0.082581,x3=1.403871。对应的目标函数值为5.037419。相比于
最优值,这个结果是可以接受的。