遗传算法

原创 2018年04月16日 11:58:20

求y = -x^2+5 最大值

#include<bits/stdc++.h>
using namespace std;
typedef struct Chrom{
	short bit[6];
	int fit;
	double rfit,cfit; //分别是百分比和积累; 
	bool operator<(const Chrom o)const{
		return fit > o.fit;
	}
}chrom;

void init(chrom *popcur);
int getFit(int x);
int getDec(chrom x);
void select(chrom *popnext);
void pickChroms(chrom *popnext);
void crossover (chrom *popnext);   
void mutation (chrom *popnext);
chrom cur[4];
chrom next[4];
int main()
	{
		int t;
		srand((unsigned)time(NULL));
		printf("请输入最大迭代次数: ");
		scanf("%d",&t);
		init(cur);
		int max_fit = cur[0].fit; 
		while(t--){
			for(int i = 0; i < 4; ++i){
				next[i] = cur[i];
			}
			printf("\nafter select :\n\n");
			pickChroms(next);
			printf("after crossover :\n\n");
			crossover(next);    
			printf("\nafter mutation :\n\n");
			mutation(next);	
			for(int i = 0; i < 4; ++i){
				cur[i] = next[i];
			}
			//getchar();
		}
		int x = 0;
		for(int i = 1; i < 4; ++i){
			if(cur[i].fit > max_fit){
				max_fit = cur[i].fit;
				x = getDec(cur[i]);	
			}
		}
		printf("\n当x 等于 %d 时, 函数取得最大值为 : %d",x,max_fit);
		return 0;
		
	}
void init(chrom *popcur)
	{
		int value;
		double sum = 0;
		int i,j;
		for(i = 0; i < 4; ++i){
			for(j = 0; j < 6; ++j){
				popcur[i].bit[j] = rand()%2;
			}
			value = getDec(popcur[i]);
			popcur[i].fit = getFit(value);
			sum += popcur[i].fit;
			printf("\n popcurrent[%d]=%d%d%d%d%d%d , value = %d, fitness = %d",
			i, popcur[i].bit[0], popcur[i].bit[1], popcur[i].bit[2], popcur[i].bit[3], popcur[i].bit[4], popcur[i].bit[5]
			,value,popcur[i].fit); 
		} 
		for(i = 0; i < 4; ++i){
			popcur[i].rfit = popcur[i].fit/sum;
			popcur[i].cfit = 0;
		}
	
}

int getFit(int x)
	{
		return -(x*x) + 5;
	}
int getDec(chrom x)
	{
		int dec= x.bit[5]+x.bit[4]*2 + x.bit[3]*4 + x.bit[2]*8 + x.bit[1]*16;
		if(x.bit[0] == 1){
			return dec*(-1);
		}
		return dec;
	}
//void select(chrom *popnext)
//	{
//		double sumFit = 0;
//		for(int i = 0; i < 4; ++i){
//			sumFit += popnext[i].fit;
//		}
//		//calculate the relative fitness of each member  
//		for(int i = 0; i < 4; ++i){
//			popnext[i].rfit = popnext[i].fit/sumFit;
//		}
//		//calculate the cumulative fitness,即计算积累概率  
//		popnext[0].cfit = popnext[0].rfit;
//		for(int i = 1; i < 4; ++i){
//			popnext[i].cfit = popnext[i].rfit+popnext[i-1].cfit;
//			printf("cfit = %.2f ",popnext[i].cfit);
//		}
//		double p = 0;
//		for(int i = 0; i < 4; ++i){
//			p = rand()%10/10;
//			if(p < popnext[0].cfit){
//				popcur[i] = popnext[0];
//			}
//			else{
//				for(int j = 0; j < 4; ++j){
//					if(p >= popnext[j].cfit && p < popnext[j+1].cfit){
//						popcur[i] = popnext[j+1];
//					}
//				}
//			}
//		}
//		for(int i = 0; i < 4; ++i){
//			popnext[i] = popcur[i];
//					printf("\n popcurrent[%d]=%d%d%d%d%d%d fitness = %d cfit = %.2lf",
//			i, popcur[i].bit[0], popcur[i].bit[1], popcur[i].bit[2], popcur[i].bit[3], popcur[i].bit[4], popcur[i].bit[5]
//			,popnext[i].fit,popnext[i].cfit);
//		}
// 
//		return ;		
//	}
void pickChroms(chrom *popnext)
	{
		chrom tmp;
		int i,j;
		sort(popnext,popnext+4);
//		for(int i = 0; i < 4; ++i){
//			printf("%d ",popnext[i].fit);
//		}
		for(i = 0;i < 4; i++) {
	       printf("Select popnext[%d]=%d%d%d%d%d%d    value=%d    fitness = %d",i, popnext[i].bit[0], popnext[i].bit[1], popnext[i].bit[2], popnext[i].bit[3], popnext[i].bit[4], popnext[i].bit[5], getDec(popnext[i]), popnext[i].fit);     
	        printf("\n" );                       
	    }  
	    
		return ;             
	}
void crossover (chrom *popnext)              // 函数:交叉操作;  
{  
  
    int random ;  
    int i ;   
    random=rand ();                             // 随机产生交叉点;  
    random=((random %5)+1);                     // 交叉点控制在1到5之间;  
    for(i = 0;i < random; i++)                     
    {  
        popnext[2].bit[i] = popnext[0].bit[i];   // child 1 cross over  
        popnext[3].bit[i] = popnext[1].bit[i];   // child 2 cross over  
    }  
  
    for(i = random; i < 6;i++)                      // crossing the bits beyond the cross point index  
	{  
        popnext[2].bit[i]= popnext[1].bit[i];    // child 1 cross over  
        popnext[3].bit[i]= popnext[0].bit[i];    // chlid 2 cross over  
    }    
  
    for(i = 0;i < 4; i++){  
		popnext[i].fit= getFit(getDec(popnext[i]));        // 为新个体计算适应度值;  
    }  
  
    for(i =0;i < 4; i++) {  
    	printf("\nCrossOver popnext[%d]=%d%d%d%d%d%d    value=%d    fitness = %d",i, popnext[i].bit[0], popnext[i].bit[1], popnext[i].bit[2], popnext[i].bit[3], popnext[i].bit[4], popnext[i].bit[5], getDec(popnext[i]), popnext[i].fit);     
    }  
    return ;  
}     
                        
void mutation(chrom *popnext)
	{
		int random,row,col,value;
		random = rand()%50;
		if(random == 25){
			row = rand()%4;
			col = rand()%6;
			if(popnext[row].bit[col] == 1)
				popnext[row].bit[col] = 0;
			else if(popnext[row].bit[col] == 0){
				popnext[row].bit[col] = 1;
			}
			popnext[row].fit = getFit(getDec(popnext[row]));
			value = getDec(popnext[row]);
		}
		for(int i = 0; i < 4; ++i){
			printf("Mutarion popnext[%d]=%d%d%d%d%d%d    value=%d    fitness = %d",i, popnext[i].bit[0], popnext[i].bit[1], popnext[i].bit[2], popnext[i].bit[3], popnext[i].bit[4], popnext[i].bit[5], getDec(popnext[i]), popnext[i].fit);     
			printf("\n");
		}
	}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tianweidadada/article/details/79958819

[置顶] 亲,这就是遗传算法

本文试图通过几幅简明的图来介绍遗传算法。 背景 当一些问题不存在确定性的最优解法,或者说最优解法的施展时间长的1-B,那我们就得开始考虑点其他路子了。 比如说旅行商问题: ...
  • dl0914791011
  • dl0914791011
  • 2015-05-10 15:12:38
  • 2529

遗传算法--较容易理解的一篇讲解

转自:http://www.cnblogs.com/heaad/archive/2010/12/23/1914725.html 遗传算法 ( GA , Genetic Algorit...
  • u013912596
  • u013912596
  • 2015-02-02 22:01:31
  • 2480

遗传算法基本原理及在互联网中的应用

对算法产生的每个染色体进行评价,并基于适应值来选择染色体,是适应性更好的染色体有更多的繁殖机会。在遗传算法中,通过随机方式产生若干个所求解问题的数字编码,即染色体,形成初始种群;通过适应度函数给每个染...
  • gghh2015
  • gghh2015
  • 2017-09-22 00:31:05
  • 410

对基本遗传算法的学习

(→通过算法的乐趣第16章学习)0遗传算法是干嘛的? 貌似很高大上。 求最优解啊。 废话。 好吧就是比穷举快的随机化算法。1达尔文提出进化论时,肯定没想到它还会有今天这样的应用。“物竞天择,适...
  • zeng_luogu
  • zeng_luogu
  • 2016-05-15 10:56:29
  • 2251

一个非常好的理解遗传算法的例子 强烈推荐入门

遗传算法的手工模拟计算示例 为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各     个主要执行步骤。         例:求下述二元函数的最大值:     (1)...
  • u012422446
  • u012422446
  • 2017-03-29 11:08:43
  • 3533

遗传算法详解(GA)(个人觉得很形象,很适合初学者)

本文是去年课题组周报中的一个专题讲解,详细讲了GA,由于是周报,所以十分详细。文章综合参考了一些互联网资料。发博客以备忘!...
  • u010451580
  • u010451580
  • 2016-04-18 11:22:20
  • 63359

遗传算法最好的一本书 《遗传算法原理及应用》

  • 2010年04月17日 16:53
  • 3.27MB
  • 下载

神经网络和遗传算法结合(原创)

本人理解:        神经网络是用来处理 非线性关系的,输入和输出之间的关系可以确定(存在非线性关系),可以利用神经网络的自我学习(需要训练数据集 用明确的输入和输出),训练后权值确定,就可以测试...
  • u011001084
  • u011001084
  • 2015-10-22 16:33:03
  • 5935

遗传算法的入门实现(2):利用正方形拼接firefox

这段程序没有参考网上的任何代码,属于自己独立完成,因此效果也不是很理想。但是不管怎样,我也花了不少心思研究,就当是述说一下自己的思路吧:(1)(1)首先为什么不用三角形来进行填充呢?因为三角形的绘制和...
  • pp634077956
  • pp634077956
  • 2016-12-04 20:15:39
  • 2709

基于模拟退火的遗传算法

基于之前的模拟退火和遗传算法: http://blog.csdn.net/qq_34861102/article/details/77806124针对遗传算法和模拟退火算法的不足,这里给出了一个机遇...
  • qq_34861102
  • qq_34861102
  • 2017-09-08 22:08:20
  • 587
收藏助手
不良信息举报
您举报文章:遗传算法
举报原因:
原因补充:

(最多只允许输入30个字)