⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp1.cpp

📁 用于进行简单的遗传算法
💻 CPP
字号:
/*#include <stdlib.h> 
#include <stdio.h> 
main()
{
int i,j;
for(i=0;i<10;i++) 
{ 
j = rand()%7 ;
printf("%d\n",j ); 
}
}*/
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;//或者把这一句去掉,上面改为#include <iostream.h>,,具体见程序知识!
void GenerationFristIndividual(void);
void decode (void);
void displace(void);
void selection(void);
void crossover(void);
void mutation(void);
void thebestvalue(void);
struct individual
{
	int chrom[20];
	double value;
	double fitness;
};
struct individual population[80];
#define generation 200;//一共繁衍200代

//产生第一代个体
void GenerationFristIndividual(void)
{
	int i,j;
		for(i=0;i<80;i++)
		{
			for(j=0;j<20;j++)
			{
				population[i].chrom[j]=((rand()%10)<5)?0:1;
			}
		}
}

void main(void)//主程序
{
	int i(0),j(0),k(0);
	GenerationFristIndividual();
	decode ();
	for(k=0;k<200;k++)
	{
        //GenerationFristIndividual();
	    decode ();
		displace();
	    selection();
	    crossover();
	    mutation();
	    thebestvalue();
	}
	//for(i=0;i<80;i++)
	//{
        // for(j=0;j<20;j++)
		 //{
	      // cout<<population[i].chrom[j]<<endl;
         //cout<<population[i].fitness<<endl;
		// }
	//}
}

//解码并计算个体值
void decode (void)
{
	int *point,temp1,temp2,i,j,k;
	double x1(0),x2(0);
	for(i=0;i<80;i++)
	{
		temp1=0;temp2=0;//如果这两个在定义时就赋零,则结果temp1与temp2会逐渐变大。
		point=population[i].chrom;
		//cout<<*point<<endl;
		for(j=0;j<10;j++,point++)
		{
			temp1+=*point<<(9-j);
		}
		point=&population[i].chrom[10];//使指针指向i个体的第10号位
		for(k=0;k<10;k++)
		{
			temp2+=*(point++)<<(9-k);
		}
		x1=4.096*temp1/1023.0-2.048;
		x2=4.096*temp2/1023.0-2.048;
		//cout<<x2<<endl;
		population[i].value=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1);
        population[i].fitness=population[i].value;
		//cout<<population[i].fitness<<endl;
	}
}

//寻找适应度最好的和适应度最差的,并将适应度最差的替换为适应度最好的
void  displace(void)
{
	int j(0),k(0),z(0),w(0),*point;
	double max(0),min(0);
	max=population[0].fitness;
	min=population[0].fitness;
	for(j=1;j<80;j++)
	{
		if(population[j].fitness>max)
		{
			max=population[j].fitness;
			w=j;
		}
	}//cout<<w;//查出最大适应度所在位子
	//cout<<max<<endl;
	for(k=1;k<80;k++)
	{
         if(population[k].fitness<min)
		{
			min=population[k].fitness;
			z=k;//查出适应度最小的元素所在位置
		}
	}
	//cout<<z<<endl;
	//cout<<min<<endl;
	point=population[w].chrom;
	for(j=0;j<20;j++,point++)
	{
		population[z].chrom[j]=*point;
	}
}

//选择算子
void selection(void)
{
    struct individual newpopulation[80];
	double fitness[80];//
	double sum(0),p(0);
	int i,j,k;
	for(i=0;i<80;i++)
	{
		sum+=population[i].fitness;
	}
	//cout<<sum;
	for(j=0;j<80;j++)
	{
        fitness[j]=population[j].fitness/sum;//相对适应度
	}
    for(k=0;k<80;k++)
	{
		fitness[k+1]=fitness[k+1]+fitness[k];//开始进行模拟赌盘
	}
	//for(i=0;i<80;i++)
	//{
	//	cout<<fitness[i]<<endl;
	//}
	for(j=0;j<80;j++)
	{
		  p=rand()%1000/1000.0;//cout<<p<<endl;
		  k=0;
		  while(p>fitness[k])
		  {      
			 k++;  
		  }//cout<<k<<endl;//有问题,k一直为1,原因为原先不使用的while语句而使用的if语句,if语句执行完直接跳出。
		  newpopulation[j]=population[k];
	 }
	for(k=0;k<80;k++)
	{
		population[k]=newpopulation[k];
	}
}

//*进行交叉计算(这里运用的是单点交叉)
void crossover(void)
{
	int fenzu[80],temp(0),i(0),q(0),p(0),*point;
	for(i=0;i<80;i++)
	{
		fenzu[i]=i;
	}
	for(i=0;i<80;i++)
	{
		p=rand()%(80-i);
		temp=fenzu[i];
		fenzu[i]=fenzu[p+i];
		fenzu[p+i]=temp;
	}//将fenzu数组中存储的0到79的数随机打乱
	//for(i=0;i<80;i++)
	//{
	//	cout<<fenzu[i]<<endl;
	//}
	
	for(i=0,point=fenzu;i<40;i++,point+=2)//分为四十组
	{
		//cout<<*point<<endl;
		q=rand()%1000;//cout<<q<<endl;//为什么显示全为零?
		if(q<600)//由于q=rand()%1000/1000.0不对,一直显示零,故这里换一种写法*1000
		{
			 p=rand()%20;//cout<<p<<endl;
		     for(;p<20;p++)
			 {
				temp=population[*point].chrom[p];//cout<<*point<<endl;
				population[*point].chrom[p]=population[*(point+1)].chrom[p];
				population[*(point+1)].chrom[p]=temp;
			}
		}
	}
}
//进行变异计算
 void mutation(void)
 {
	 int i(0),j(0),p(0);
	 for(i=0;i<80;i++)
	 {
		 for(j=0;j<20;j++)
		 {
			 p=rand()%1000;//cout<<p<<endl;
			 if(p<100)//变异率设为0.001,由于随机数是1000以内的,故这里变为100
			 {
				 population[i].chrom[j]=(population[i].chrom[j]=0)?1:0;
			 }
		 }
	 }
 }
 //寻找并显示最好的适应度,显示此时的x1与x2
 void  thebestvalue(void)
 {
	int i(0),j(0),k(0),w(0),*point,temp1,temp2;
	double max(0),x1(0),x2(0);
	max=population[0].fitness;
	for(j=1;j<80;j++)
	{
		if(population[j].fitness>max)
		{
			max=population[j].fitness;
			w=j;
		}
	}
        cout<<max<<endl;
		temp1=0;temp2=0;
		point=population[w].chrom;
		//cout<<*point<<endl;
		for(j=0;j<10;j++,point++)
		{
			temp1+=*point<<(9-j);
		}
		point=&population[w].chrom[10];//使指针指向w个体的第10号位
		for(k=0;k<10;k++)
		{
			temp2+=*(point++)<<(9-k);
		}//cout<<temp1<<endl;
		x1=4.096*temp1/1023.0-2.048;
		x2=4.096*temp2/1023.0-2.048;
		//cout<<x1<<endl;
		//cout<<x2<<endl<<endl<<endl<<endl;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -