遗传算法求解函数极值
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define num_C 12 //个体的个数,前6位表示x1,后6位表示x2
#define N 100 //群体规模为100
#define pc 0.9 //交叉概率为0.9
#define pm 0.1 //变异概率为10%
#define ps 0.6 //进行选择时保留的比例
#define genmax 2000 //最大代数200
}
/*生成一个介于两整型数之间的随机整数*/
int RandomInteger(int low,int high)
{
int k;
double d;
k=rand();
k=(k!=RAND_MAX)?k:(k-1); //RAND_MAX是VC中可表示的最大整型数
d=(double)k/((double)(RAND_MAX));
//交叉
for(j=0;j<=temp1-1;)
{
Cross(&group[temp2+j],&group[temp3+j]);
j+=2;
}
//变异
Varation(group,i);
}
Sort(group);
Print_optimum(group,i-1); //输出当代(第i-1代)种群
}
/*交叉*/
void Print_optimum(struct unit group[N],int k);
/*定义个体信息*/
typedef struct unit
{
int path[num_C]; //每个个体的信息
double cost; //个体代价值
};
struct unit group[N]; //种群变量group
}
else if(p->path[0]<6)
{
x1=0-(p->path[1]+p->path[2]*0.1+p->path[3]*0.01+p->path[4]*0.001+p->path[5]*0.0001);
}
x2=0;
if(p->path[6]>5)
{
x2=p->path[7]+p->path[8]*0.1+p->path[9]*0.01+p->path[10]*0.001+p->path[11]*0.0001;
{
for(j=0;j<=num_C-1;j++) //补全p1
{
son2[i]=p3->path[j];
}
}//end子代2
//end交叉
for(i=0;i<=num_C-1;i++)
{
p3->path[i]=son1[i];
p4->path[i]=son2[i];
}
Calculate_cost(p3); //计算子代p1的函数值
}
printf("当x1=%f x2=%f\n",x1,x2);
printf("函数最小值为:%f \n",p->cost);
}
运行结果:
1
2
3
4
题目:生成两个整型,求在这两个整形之间cost=x1+x2-10*(cos(2*3.14*x1)+cos(2*3.14*x2))函数的最小值
源程序:
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "math.h"
#include "time.h"
return(p->cost);
}
/*复制种群中的p1到p2中*/
void Copy_unit(struct unit *p1,struct unit *p2)
{
int i;
for(i=0;i<=num_C-1;i++)
p2->path[i]=p1->path[i];
p2->cost=p1->cost;
if(p->path[0]>5)
{
x1=p->path[1]+p->path[2]*0.1+p->path[3]*0.01+p->path[4]*0.001+p->path[5]*0.0001;
}
else if(p->path[0]<6)
{
x1=0-(p->path[1]+p->path[2]*0.1+p->path[3]*0.01+p->path[4]*0.001+p->path[5]*0.0001);
Copy_unit(&temp,p2);
}
}//end一轮排序
}//end排序
}
/*计算某个个体的函数值*/
float Calculate_cost(struct unit *p)
{
double x1,x2;
x1=0;
if(p->path[0]>5)
{
x1=p->path[1]+p->path[2]*0.1+p->path[3]*0.01+p->path[4]*0.001+p->path[5]*0.0001;
for(j=1;j<=N-1;j++) //排序总共需进行N-1轮
{
for(i=1;i<=N-1;i++)
{
p1=&group[i-1];
p2=&group[i];
if(p1->cost>p2->cost) //值大的往后排
{
Copy_unit(p1,&temp);
Copy_unit(p2,p1);
void Cross(struct unit *p3,struct unit *p4);
void Varation(struct unit group[N],int i);
void Evolution(struct unit group[N]);
float Calculate_cost(struct unit *p);
void Cross(struct unit *p3,struct unit *p4)
{
int i,j,cross_point;
int son1[num_C],son2[num_C];
for(i=0;i<=num_C-1;i++) //初始化son1、son2
{
son1[i]=-1;
son2[i]=-1;
}
else if(p->path[6]<6)
{
x2=0-(p->path[7]+p->path[8]*0.1+p->path[9]*0.01+p->path[10]*0.001+p->path[11]*0.0001);
}
p->cost=x1+x2-10*(cos(2*3.14*x1)+cos(2*3.14*x2));
int num_gen=0; //记录当前达到第几代
int main()
{
int i,j;
srand((int)time(NULL)); //初始化随机数发生器
Initial_gen(group); //初始化种群
Evolution(group); //进化:选择、交叉、变异
getch();
return 0;
temp1=N*pc/2;
temp2=N*(1-pc);
temp3=N*(1-pc/2);
temp4=N*(1-ps);
temp5=N*ps;
for(i=1;i<=genmax;i++)
{
//选择
for(j=0;j<=temp4-1;j++)
{ Copy_unit(&group[j],&group[j+temp5]); }
if((!flag>(flag_v>100))?(5*100*pm):(100*pm))
{
i=RandomInteger(0,N-1); //确定发生变异的个体
j=RandomInteger(0,num_C-1); //确定发生变异的位
k=RandomInteger(0,num_C-1);
p=&group[i]; //变异
}
/*初始化种群*/
void Initial_gen(struct unit group[N])
{
int i,j;
struct unit *p;
for(i=0;i<=N-1;i++) //初始化种群里的100个个体
{
p=&group[i]; //p指向种群的第i个个体
for(j=0;j<12;j++)
{
p->path[j]=RandomInteger(0,9); //end
}
Calculate_cost(p); //计算该种群的函数值
}//end初始化种群
}
/*种群进化,进化代数由genmax决定*/
void Evolution(struct unit group[N])
{
int i,j;
int temp1,temp2,temp3,temp4,temp5;
Calculate_cost(p4); //计算子代p2的函数值
}
/*变异*/
void Varation(struct unit group[N],int flag_v)
{
int flag,i,j,k,temp;
struFra Baidu bibliotekt unit *p;
flag=RandomInteger(1,100);
//在进化后期,增大变异概率
}
cross_point=RandomInteger(1,num_C-1); //交叉位随机生成
//交叉,生成子代
//子代1
//子代1前半部分直接从父代复制
for(i=0;i<=cross_point-1;i++) son1[i]=p3->path[i];
for(i=cross_point;i<=num_C-1;i++)
}
x2=0;
if(p->path[6]>5)
{
x2=p->path[7]+p->path[8]*0.1+p->path[9]*0.01+p->path[10]*0.001+p->path[11]*0.0001;
}
else if(p->path[6]<6)
{
x2=0-(p->path[7]+p->path[8]*0.1+p->path[9]*0.01+p->path[10]*0.001+p->path[11]*0.0001);
temp=p->path[j];
p->path[j]=p->path[k];
p->path[k]=temp;
Calculate_cost(p); //重新计算变异后的函数值
}
}
/*将种群中个体按函数值从小到大排序*/
void Sort(struct unit group[N])
{
int i,j;
struct unit temp,*p1,*p2;
for(j=0;j<=num_C-1;j++) //补全p1
{
son1[i]=p4->path[j];
}//end子代1
//子代2
//子代1后半部分直接从父代复制
for(i=cross_point;i<=num_C-1;i++) son2[i]=p4->path[i];
for(i=0;i<=cross_point-1;i++)
k=(int)(d*(high-low+1));
return (low+k);
}
/*输出当代种群中的最优个体*/
void Print_optimum(struct unit group[N],int k)
{
struct unit *p;
double x1,x2;
x1=x2=0;
p=&group[0];
int RandomInteger(int low,int high);
void Initial_gen(struct unit group[N]);
void Sort(struct unit group[N]);
void Copy_unit(struct unit *p1,struct unit *p2);
#define N 100 //群体规模为100
#define pc 0.9 //交叉概率为0.9
#define pm 0.1 //变异概率为10%
#define ps 0.6 //进行选择时保留的比例
#define genmax 2000 //最大代数200
}
/*生成一个介于两整型数之间的随机整数*/
int RandomInteger(int low,int high)
{
int k;
double d;
k=rand();
k=(k!=RAND_MAX)?k:(k-1); //RAND_MAX是VC中可表示的最大整型数
d=(double)k/((double)(RAND_MAX));
//交叉
for(j=0;j<=temp1-1;)
{
Cross(&group[temp2+j],&group[temp3+j]);
j+=2;
}
//变异
Varation(group,i);
}
Sort(group);
Print_optimum(group,i-1); //输出当代(第i-1代)种群
}
/*交叉*/
void Print_optimum(struct unit group[N],int k);
/*定义个体信息*/
typedef struct unit
{
int path[num_C]; //每个个体的信息
double cost; //个体代价值
};
struct unit group[N]; //种群变量group
}
else if(p->path[0]<6)
{
x1=0-(p->path[1]+p->path[2]*0.1+p->path[3]*0.01+p->path[4]*0.001+p->path[5]*0.0001);
}
x2=0;
if(p->path[6]>5)
{
x2=p->path[7]+p->path[8]*0.1+p->path[9]*0.01+p->path[10]*0.001+p->path[11]*0.0001;
{
for(j=0;j<=num_C-1;j++) //补全p1
{
son2[i]=p3->path[j];
}
}//end子代2
//end交叉
for(i=0;i<=num_C-1;i++)
{
p3->path[i]=son1[i];
p4->path[i]=son2[i];
}
Calculate_cost(p3); //计算子代p1的函数值
}
printf("当x1=%f x2=%f\n",x1,x2);
printf("函数最小值为:%f \n",p->cost);
}
运行结果:
1
2
3
4
题目:生成两个整型,求在这两个整形之间cost=x1+x2-10*(cos(2*3.14*x1)+cos(2*3.14*x2))函数的最小值
源程序:
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "math.h"
#include "time.h"
return(p->cost);
}
/*复制种群中的p1到p2中*/
void Copy_unit(struct unit *p1,struct unit *p2)
{
int i;
for(i=0;i<=num_C-1;i++)
p2->path[i]=p1->path[i];
p2->cost=p1->cost;
if(p->path[0]>5)
{
x1=p->path[1]+p->path[2]*0.1+p->path[3]*0.01+p->path[4]*0.001+p->path[5]*0.0001;
}
else if(p->path[0]<6)
{
x1=0-(p->path[1]+p->path[2]*0.1+p->path[3]*0.01+p->path[4]*0.001+p->path[5]*0.0001);
Copy_unit(&temp,p2);
}
}//end一轮排序
}//end排序
}
/*计算某个个体的函数值*/
float Calculate_cost(struct unit *p)
{
double x1,x2;
x1=0;
if(p->path[0]>5)
{
x1=p->path[1]+p->path[2]*0.1+p->path[3]*0.01+p->path[4]*0.001+p->path[5]*0.0001;
for(j=1;j<=N-1;j++) //排序总共需进行N-1轮
{
for(i=1;i<=N-1;i++)
{
p1=&group[i-1];
p2=&group[i];
if(p1->cost>p2->cost) //值大的往后排
{
Copy_unit(p1,&temp);
Copy_unit(p2,p1);
void Cross(struct unit *p3,struct unit *p4);
void Varation(struct unit group[N],int i);
void Evolution(struct unit group[N]);
float Calculate_cost(struct unit *p);
void Cross(struct unit *p3,struct unit *p4)
{
int i,j,cross_point;
int son1[num_C],son2[num_C];
for(i=0;i<=num_C-1;i++) //初始化son1、son2
{
son1[i]=-1;
son2[i]=-1;
}
else if(p->path[6]<6)
{
x2=0-(p->path[7]+p->path[8]*0.1+p->path[9]*0.01+p->path[10]*0.001+p->path[11]*0.0001);
}
p->cost=x1+x2-10*(cos(2*3.14*x1)+cos(2*3.14*x2));
int num_gen=0; //记录当前达到第几代
int main()
{
int i,j;
srand((int)time(NULL)); //初始化随机数发生器
Initial_gen(group); //初始化种群
Evolution(group); //进化:选择、交叉、变异
getch();
return 0;
temp1=N*pc/2;
temp2=N*(1-pc);
temp3=N*(1-pc/2);
temp4=N*(1-ps);
temp5=N*ps;
for(i=1;i<=genmax;i++)
{
//选择
for(j=0;j<=temp4-1;j++)
{ Copy_unit(&group[j],&group[j+temp5]); }
if((!flag>(flag_v>100))?(5*100*pm):(100*pm))
{
i=RandomInteger(0,N-1); //确定发生变异的个体
j=RandomInteger(0,num_C-1); //确定发生变异的位
k=RandomInteger(0,num_C-1);
p=&group[i]; //变异
}
/*初始化种群*/
void Initial_gen(struct unit group[N])
{
int i,j;
struct unit *p;
for(i=0;i<=N-1;i++) //初始化种群里的100个个体
{
p=&group[i]; //p指向种群的第i个个体
for(j=0;j<12;j++)
{
p->path[j]=RandomInteger(0,9); //end
}
Calculate_cost(p); //计算该种群的函数值
}//end初始化种群
}
/*种群进化,进化代数由genmax决定*/
void Evolution(struct unit group[N])
{
int i,j;
int temp1,temp2,temp3,temp4,temp5;
Calculate_cost(p4); //计算子代p2的函数值
}
/*变异*/
void Varation(struct unit group[N],int flag_v)
{
int flag,i,j,k,temp;
struFra Baidu bibliotekt unit *p;
flag=RandomInteger(1,100);
//在进化后期,增大变异概率
}
cross_point=RandomInteger(1,num_C-1); //交叉位随机生成
//交叉,生成子代
//子代1
//子代1前半部分直接从父代复制
for(i=0;i<=cross_point-1;i++) son1[i]=p3->path[i];
for(i=cross_point;i<=num_C-1;i++)
}
x2=0;
if(p->path[6]>5)
{
x2=p->path[7]+p->path[8]*0.1+p->path[9]*0.01+p->path[10]*0.001+p->path[11]*0.0001;
}
else if(p->path[6]<6)
{
x2=0-(p->path[7]+p->path[8]*0.1+p->path[9]*0.01+p->path[10]*0.001+p->path[11]*0.0001);
temp=p->path[j];
p->path[j]=p->path[k];
p->path[k]=temp;
Calculate_cost(p); //重新计算变异后的函数值
}
}
/*将种群中个体按函数值从小到大排序*/
void Sort(struct unit group[N])
{
int i,j;
struct unit temp,*p1,*p2;
for(j=0;j<=num_C-1;j++) //补全p1
{
son1[i]=p4->path[j];
}//end子代1
//子代2
//子代1后半部分直接从父代复制
for(i=cross_point;i<=num_C-1;i++) son2[i]=p4->path[i];
for(i=0;i<=cross_point-1;i++)
k=(int)(d*(high-low+1));
return (low+k);
}
/*输出当代种群中的最优个体*/
void Print_optimum(struct unit group[N],int k)
{
struct unit *p;
double x1,x2;
x1=x2=0;
p=&group[0];
int RandomInteger(int low,int high);
void Initial_gen(struct unit group[N]);
void Sort(struct unit group[N]);
void Copy_unit(struct unit *p1,struct unit *p2);