当前位置:文档之家› 遗传算法的C语言程序案例

遗传算法的C语言程序案例

遗传算法的C语言程序案例一、说明1.本程序演示的是用简单遗传算法随机一个种群,然后根据所给的交叉率,变异率,世代数计算最大适应度所在的代数2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的命令;相应的输入数据和运算结果显示在其后。

3.举个例子,输入初始变量后,用y= (x1*x1)+(x2*x2),其中-2.048<=x1,x2<=2.048作适应度函数求最大适应度即为函数的最大值4.程序流程图5.类型定义int popsize; //种群大小int maxgeneration; //最大世代数double pc; //交叉率double pm; //变异率struct individual{char chrom[chromlength+1];double value;double fitness; //适应度};int generation; //世代数int best_index;int worst_index;struct individual bestindividual; //最佳个体struct individual worstindividual; //最差个体struct individual currentbest;struct individual population[POPSIZE];3.函数声明void generateinitialpopulation();void generatenextpopulation();void evaluatepopulation();long decodechromosome(char *,int,int);void calculateobjectvalue();void calculatefitnessvalue();void findbestandworstindividual();void performevolution();void selectoperator();void crossoveroperator();void mutationoperator();void input();void outputtextreport();6.程序的各函数的简单算法说明如下:(1).void generateinitialpopulation ()和void input ()初始化种群和遗传算法参数。

input() 函数输入种群大小,染色体长度,最大世代数,交叉率,变异率等参数。

(2)void calculateobjectvalue();计算适应度函数值。

根据给定的变量用适应度函数计算然后返回适度值。

(3)选择函数selectoperator()在函数selectoperator()中首先用rand ()函数产生0~1间的选择算子,当适度累计值不为零时,比较各个体所占总的适应度百分比的累计和与选择算子,直到达到选择算子的值那个个体就被选出,即适应度为fi的个体以fi/∑fk的概率继续存在;显然,个体适应度愈高,被选中的概率愈大。

但是,适应度小的个体也有可能被选中,以便增加下一代群体的多样性。

(4)染色体交叉函数crossoveroperator()这是遗传算法中的最重要的函数之一,它是对个体两个变量所合成的染色体进行交叉,而不是变量染色体的交叉,这要搞清楚。

首先用rand ()函数产生随机概率,若小于交叉概率,则进行染色体交叉,同时交叉次数加1。

这时又要用rand()函数随机产生一位交叉位,把染色体的交叉位的后面部分交叉即可;若大于交叉概率,则进行简单的染色体复制即可。

(5)染色体变异函数mutation()变异是针对染色体字符变异的,而不是对个体而言,即个体变异的概率是一样。

随机产生比较概率,若小于变异概率,则1变为0,0变为1,同时变异次数加1。

(6)long decodechromosome(char *,int,int)本函数是染色体解码函数,它将以数组形式存储的二进制数转成十进制数,然后才能用适应度函数计算。

(7)void findbestandworstindividual()本函数是求最大适应度个体的,每一代的所有个体都要和初始的最佳比较,如果大于就赋给最佳。

(8)void outputtextreport () 输出种群统计结果输出每一代的种群的最大适应度和平均适应度,最后输出全局最大值二、运行环境本程序的开发工具是VC++,在VC++下运行。

源代码#include"stdafx.h"#include <stdio.h>#include <stdlib.h>#include <time.h>/////////////The definiton of user data 定义用户数据////#define Cmax 100 //certain maximal value#define Cmin 0 //certain minimum value#define LENGHT1 3#define LENGHT2 3//总染体长度#define CHROMLENGTH LENGHT1+LENGHT2const int MaxGeneration = 100;const int PopSize = 10;const double Pc = 0.6;const double Pm = 0.001;////////////// 数据结构定义///////////////////struct Individual{char chrom[CHROMLENGTH + 1];double value;double fitness;int generation ;int bestIndex;int worstIndex;Individual bestIndividual ;Individual worstIndividual ;// best individual by nowIndividual currentBest ;Individual population [PopSize] ;///////////////////////void generateInitialPopulation();void generateNextPopulation();void evalutePopulation();long decomdeChromosome(char*, int, int); void calculateObjectValue();void calculateFitnessValue();void findBestAndWorstIndividual();void performEvolution();void selectionOperator();void crossoverOperator();void mutationOperator();void outputTextReport();//以上为函数以及全局变量定义部分int main(){generation = 0; generateInitialPopulation(); evalutePopulation();while (generation < MaxGeneration) { generation++; generateNextPopulation(); evalutePopulation();performEvolution();outputTextReport();}system("pause");return 0;}////////////////////////////////////////////////////////////////////产生第一代样本/////void generateInitialPopulation() {int i, j;srand((unsigned)time(NULL));for (i = 0; i < PopSize; i++) {for (j = 0; j < CHROMLENGTH; j++) {population[i].chrom[j] = ((rand() % 10) < 5) ? '0' : '1';}population[i].chrom[CHROMLENGTH] ='/0';}}////////产生下一代样本//////void generateNextPopulation() {selectionOperator();crossoverOperator();mutationOperator();}//变异算子//void mutationOperator() {int i, j;double p;// bit mutationfor (i = 0; i < PopSize; i++) {for (j = 0; j < CHROMLENGTH; j++) {p = rand() % 1000 / 1000.0;if (p < Pm) {population[i].chrom[j] = (population[i].chrom[j] == '0') ? '1': '0'; }}}}//交叉算子///void crossoverOperator() {int i, j;int index[PopSize];int point, temp;double p;char ch;for (i = 0; i < PopSize; i++) {index[i] = i;}for (i = 0; i < PopSize; i++) {point = rand() %(PopSize - i);temp = index[i];index[i] = index[point + i];index[point + i] = temp;}for (i = 0; i < PopSize - 1; i+=2) {p = rand() % 1000 / 1000.0;if (p < Pc) {point = rand()% (CHROMLENGTH - 1) + 1;for (j = point; j < CHROMLENGTH; j++) {ch = population[index[i]].chrom[j];population[index[i]].chrom[j] = population[index[i + 1]].chrom[j]; population[index[i + 1]].chrom[j] = ch;}}}}///选择算子/////////////void selectionOperator() {int i, index;double p, sum = 0.0;double cfitness[PopSize];Individual newpopulation[PopSize];for (i = 0; i < PopSize; i++) {sum += population[i].fitness;}for (i = 0; i < PopSize; i++) {cfitness[i] = population[i].fitness / sum;}// calculate cumulative fitnessfor (i = 1; i < PopSize; i++) {cfitness[i] = cfitness[i] + cfitness[i - 1];}for (i = 0; i < PopSize; i++) {p = rand() % 1000 / 1000.0;index = 0;while (p > cfitness[index]) {index++;}newpopulation[i] = population[index];}for (i = 0; i < PopSize; i++) {population[i] = newpopulation[i]; /}}/////依据某些公式对样本进行评价////void evalutePopulation() {calculateObjectValue();calculateFitnessValue(); findBestAndWorstIndividual(); /}//找出到目前为止最好的个体//////void findBestAndWorstIndividual() {int i;double sum = 0.0;bestIndividual = population[0];worstIndividual = population[0];for (i = 0; i < PopSize; i++) {if (population[i].fitness > bestIndividual.fitness) { bestIndividual = population[i];bestIndex = i;} else if (population[i].fitness < worstIndividual.fitness) { worstIndividual = population[i];worstIndex = i;}sum += population[i].fitness;}if (generation == 0) {currentBest = bestIndividual;} else {if (bestIndividual.fitness > currentBest.fitness) {currentBest = bestIndividual;}}}//计算适应度///void calculateFitnessValue() {int i;long temp1, temp2;double x1, x2;for (i = 0; i < PopSize; i++) {temp1 = decomdeChromosome(population[i].chrom, 0, LENGHT1);temp2 = decomdeChromosome(population[i].chrom, LENGHT1, LENGHT2); x1 = temp1 * temp1;x2 = temp2 * temp2;population[i].fitness = x1+x2; //x1平方加上x2平方}}//计算目标值//目标函数为f(x) = x1* x1 + x2*x2void calculateObjectValue() {int i;long temp1, temp2;double x1, x2;for (i = 0; i < PopSize; i++) {temp1 = decomdeChromosome(population[i].chrom, 0, LENGHT1);temp2 = decomdeChromosome(population[i].chrom, LENGHT1, LENGHT2); x1 = temp1 * temp1;x2 = temp2 * temp2;population[i].value = x1 + x2;}}//把二进制转化为十进制long decomdeChromosome(char* string, int point, int length) {int i;long decimal = 0L;char * pointer;for(i = 0, pointer=string+point; i < length;i++,pointer++){decimal += (*pointer - '0') << (length - 1 - i);}return decimal;}//进经同时把最坏个体用目前最好个体替代///void performEvolution() {if (bestIndividual.fitness > currentBest.fitness) {currentBest = population[bestIndex];} else {population[worstIndex] = currentBest;}}//打印当前样本信息///void outputTextReport() {int i;double sum;double average;sum = 0.0;for (i = 0; i < PopSize; i++) {sum += population[i].value;}average = sum / PopSize;printf("gen=%d, avg=%f, best=%f",generation, average,currentBest.value); printf(" chromosome=");for( i = 0; i < CHROMLENGTH; i++){printf("%c", currentBest.chrom[i]);}printf("/n");}。

相关主题