//*****************************头函数******************************//
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
//***********************定义宏、变量和常量************************//
#define maximization 1 //定义宏,最大值为1
#define minimization 2 //定义宏,最小值为2
#define length1 16 //定义宏,二进制x1的染色体长度为16,与精度有关
#define length2 16 //定义宏,二进制x2的染色体长度为16,与精度有关
#define length3 16 //定义宏,二进制x3的染色体长度为16,与精度有关
#define length4 16 //定义宏,二进制x4的染色体长度为16,与精度有关
#define chromlength length1+length2+length3+length4 //定义宏,二进制x的染色体总长度为64
int functionmode=minimization; //定义变量,32位整型,
const int popsize=480; //定义常量,32位整型,染色体(个体)的个数为500,即种群规模
const int maxgeneration=1900; //定义常量,32位整型,最大代数
const double pc=0.8; //定义常量,双精度,pc为交叉率
const double pm=0.09; //定义常量,双精度,pm为变异率
//**************************定义结构体**************************//
struct individual //定义结构体,个体结构
{
char chrom[chromlength+1]; //定义变量,字符型,染色体
long temp1; //定义变量,64长整型,x1的二进制值
long temp2; //定义变量,64位整型,x2的二进制值
long temp3; //定义变量,64位整型,x3的二进制值
long temp4; //定义变量,64位整型,x4的二进制值
double x1; //定义变量,双精度,x1的十进制值
double x2; //定义变量,双精度,x2的十进制值
double x3; //定义变量,双精度,x3的十进制值
double x4; //定义变量,双精度,x4的十进制值
double value; //定义变量,双精度,测试函数的函数值
double fitness; //定义变量,双精度,适应度值
};
int generation; //定义变量,32位整型,代数
int best_index; //定义变量,32位整型,最佳
int worst_index; //定义变量,32位整型,最差
struct individual bestindividual; //定义结构体,最佳个体,与个体结构相同
struct individual worstindividual; //定义结构体,最差个体,与个体结构相同
struct individual currentbest; //定义结构体,总最佳个体,与个体结构相同
struct individual population[popsize]; //定义结构体,种群规模,与个体结构相同)
//*************************函数声明*************************//
void generateinitialpopulation(); //声明函数,无返回值型,生成初始染色体
void generatenextpopulation(); //声明函数,无返回值型,生成下一代
void evaluatepopulation(); //声明函数,无返回值型,评价种群,求最佳个体
long decodechromosome(); //声明函数,64位长整型,解码染色体(自变量2→10)
void calculateobjectvalue(); //声明函数,无返回值型,染色体合成个体(计算函数值)
void calculatefitnessvalue(); //声明函数,无返回值型,计算适应度值
void findbestandworstindividual(); //声明函数,无返回值型,求最佳个体和最差个体值
void performevolution(); //声明函数,无返回值型,演示评价结果
void selectoperator(); //声明函数,无返回值型,选择操作
void crossoveroperator(); //声明函数,无返回值型,交叉操作
void mutationoperator(); //声明函数,无返回值型,变异操作
void outputtextreport(); //声明函数,无返回值型,输出操作
//**************************主函数**************************//
int main() //声明函数,无返回值型,主函数
{
int i; //定义变量,32位整型,循环变量i
printf("各阶段结果如下\n"); //输出,字符,回车
generateinitialpopulation(); //调用函数,生成初始个体
generation=0; //计算,定义初始代数为0
evaluatepopulation(); //调用函数,评价种群,求最佳个体
while(generation<maxgeneration) //条件满足时循环,代数小于3000时,进入循环
{
generation++; //计算,代数变量+1
generatenextpopulation(); //调用函数,实现生成下一代
evaluatepopulation(); //调用函数,评价种群,求最佳个体
outputtextreport(); //调用函数,输出操作
}
printf("\n"); //输出,回车
printf("最终结果:"); //输出,字符
printf("\n\n"); //输出,回车*2
printf("我的函数为:f(x)=[100*(x2-x1^2)^2+(1-x1)^2]+[100*(x3-x2^2)^2+(1-x2)^2]+[100*(x4-x3^2)^2+(1-x3)^2],[-30,30]");
printf("\n\n"); //输出,回车*2
printf("最小函数值为:%f\n\n",currentbest.value); //输出,变量当前最佳值
printf("其中,"); //输出,字符
printf("\n"); //输出,回车
printf("自变量X二进制值(染色体编码)为:"); //输出,字符,
for (i=0;i<chromlength;i++) //循环,i从0到16*4-1,共64个位点
{
printf("%c",currentbest.chrom[i]); //输出,“%c”输出类型,字符
}
printf("\n"); //输出,回车
printf("自变量X十进制值分别为:%f\t%f\t%f\t%f\n",currentbest.x1,currentbest.x2,currentbest.x3,currentbest.x4); //输出,自变量x1,x2,x3,x4
printf("\n"); //输出,回车
}
//**************************生成初始染色体******************************//
void generateinitialpopulation() //声明函数,无返回值型,生成初始染色体(个体)
{
int i,j; //定义变量,循环变量i、j
for (i=0;i<popsize; i++) //循环,i从0到499,共500个染色体(个体)
{
for(j=0;j<chromlength;j++) //循环,第二层 j从0到16*4-1,共64个位点
{
population[i].chrom[j]=(rand()%10<5)?'0':'1';//随机函数,生成随机数,生成染色体。通过取余得数字属于(0,10),判断与5的关系,得0或1
}
population[i].chrom[chromlength]='\0'; //'\0'是c/c++语言中的字符串结束符
}
}
//**************************生成下一代******************************//
void generatenextpopulation() //声明函数,无返回值型,生成下一代
{
selectoperator(); //实现函数,选择操作
crossoveroperator(); //实现函数,交叉操作
mutationoperator(); //实现函数,变异操作
}
//****************************评价种群*********************************//
void evaluatepopulation() //声明函数,无返回值型,评价种群
{
calculateobjectvalue(); //调用函数,实现染色体合成个体(计算函数值)
calculatefitnessvalue(); //调用函数,实现计算适应度值
findbestandworstindividual(); //调用函数,实现求最佳个体和最差个体值
}
//*********************解码染色体(自变量2→10)*********************//
long decodechromosome(char *string ,int point,int length) //定义变量,64位整型,解码染色体(自变量2→10)point对应解码起始点,length对应解码终点