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

📄 inherit.cpp

📁 本程序利用遗传算法解决一简单的多项式极值问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void elitist()
{
	int i;
	double best, worst;             /* best and worst fitness values */
	int best_mem, worst_mem; /* indexes of the best and worst member */

	best = population[0].fitness;
	worst = population[0].fitness;

	for (i=0; i<POPSIZE; i++)
	{
		if ( population[i].fitness >= best )
		{
			best = population[i].fitness;
			best_mem = i;
		}
		if ( population[i].fitness <= worst )
		{
			worst = population[i].fitness;
			worst_mem = i;
		}
	}

// 	for (i = 0; i < POPSIZE - 1; i++)       //这种求法啰嗦
// 	{
// 		if(population[i].fitness > population[i+1].fitness)
// 		{
// 			if (population[i].fitness >= best)
// 			{
// 				best = population[i].fitness;
// 				best_mem = i;
// 			}
// 			if (population[i+1].fitness <= worst)
// 			{
// 				worst = population[i+1].fitness;
// 				worst_mem = i + 1;
// 			}
// 		}
// 		else
// 		{
// 			if (population[i].fitness <= worst)
// 			{
// 				worst = population[i].fitness;
// 				worst_mem = i;
// 			}
//             if (population[i+1].fitness >= best)
// 			{
// 				best = population[i+1].fitness;
// 				best_mem = i + 1;
// 			}
// 		}
// 	}
/* if best individual from the new population is better than */
/* the best individual from the previous population, then    */
/* copy the best from the new population; else replace the   */
/* worst individual from the current population with the     */
/* best one from the previous generation                     */

	if (best >= population[POPSIZE].fitness)
	{
		for (i = 0; i < NVARS; i++)
			population[POPSIZE].gene[i] = population[best_mem].gene[i];
		population[POPSIZE].fitness = population[best_mem].fitness;
    }
	else
	{
		for (i = 0; i < NVARS; i++)
			population[worst_mem].gene[i] = population[POPSIZE].gene[i];
		population[worst_mem].fitness = population[POPSIZE].fitness;
    } 
}
/**************************************************************/
/* Selection function: Standard proportional selection for    */
/* maximization problems incorporating elitist model - makes  */
/* sure that the best member survives                         */
/**************************************************************/

void select(void)
{
	int mem, i, j;
	double sum = 0;
	double p;

/* find total fitness of the population */
	for (mem = 0; mem < POPSIZE; mem++)
	{
		sum += population[mem].fitness;
	}

/* calculate relative fitness */
	for (mem = 0; mem < POPSIZE; mem++)
	{
		population[mem].rfitness =  population[mem].fitness/sum;
	}
	population[0].cfitness = population[0].rfitness;

/* calculate cumulative fitness */
	for (mem = 1; mem < POPSIZE; mem++)
	{
		population[mem].cfitness =  population[mem-1].cfitness + population[mem].rfitness;
	}

/* finally select survivors using cumulative fitness. */
	for (i = 0; i < POPSIZE; i++)
	{
// 		p = rand()%1000/1000.0;
		p=rand()/((RAND_MAX+1)*1.0);
		if (p < population[0].cfitness)
			newpopulation[i] = population[0];
		else
		{
			for (j = 0; j < POPSIZE;j++)
				if (p >= population[j].cfitness && p<population[j+1].cfitness)
					newpopulation[i] = population[j+1];
		}
	}
/* once a new population is created, copy it back */

	for (i = 0; i < POPSIZE; i++)
		population[i] = newpopulation[i];      
}

/***************************************************************/
/* Crossover selection: selects two parents that take part in  */
/* the crossover. Implements a single point crossover          */
/***************************************************************/

void crossover(void)
{
	int mem, one;
	int first  =  0; /* count of the number of members chosen */
	double x,y,a[NVARS],b[NVARS];
	for (mem = 0; mem < POPSIZE; mem++)
	{
// 		x = rand()%1000/1000.0;
		x=rand()/((RAND_MAX+1)*1.0);
		if (x < PXOVER)
		{
			first++;
			if (first % 2 == 0)
			{				
				for (int i=0;i<NVARS;i++)
				{
					a[i] = population[one].gene[i];
					b[i] = population[mem].gene[i];
				}
				y = rand()/((RAND_MAX+1)*1.0);//y为随机加权因子

				for (i=0;i<NVARS;i++)//杂交
				{
					population[one].gene[i]=y*a[i]+(1-y)*b[i];
					population[mem].gene[i]=(1-y)*a[i]+y*b[i];					
				}

			}
// 				Xover(one, mem);
			else
				one = mem;
		}
	}
}



      


// ************************************************************ Crossover: performs crossover of the two selected parents. ************************************************************
// void Xover(int one, int two)
// {
// 	int i;
// 	int point;  crossover point 
//  select crossover point 	if(NVARS > 1)
// 	{
// 		if(NVARS == 2)
// 			point = 1;
// 		else
// 			point = (rand() % (NVARS - 1)) + 1;
// 
// 		for (i = 0; i < point; i++)
// 			swap(&population[one].gene[i], &population[two].gene[i]);
// 	}
// }
// 
// 
// 
// 
// *********************************************************** Swap: A swap procedure that helps in swapping 2 variables ***********************************************************
// void swap(double *x, double *y)
// {
// 	double temp;
// 
// 	temp = *x;
// 	*x = *y;
// 	*y = temp;
// 
// }



/**************************************************************/
/* Mutation: Random uniform mutation. A variable selected for */
/* mutation is replaced by a random value between lower and   */
/* upper bounds of this variable                              */
/**************************************************************/

void mutate(void)
{
	int i, j;
	double lbound, hbound;
	double x;

	for (i = 0; i < POPSIZE; i++)
		for (j = 0; j < NVARS; j++)
		{
// 			x = rand()%1000/1000.0;
			x=rand()/((RAND_MAX+1)*1.0);
			if (x < PMUTATION)
			{
				/* find the bounds on the variable to be mutated */
				lbound = population[i].lower[j];
				hbound = population[i].upper[j];
				population[i].gene[j] = randval(lbound, hbound);
			}
		}
}

/***************************************************************/
/* Report function: Reports progress of the simulation. Data   */
/* dumped into the  output file are separated by commas        */
/***************************************************************/

void report(ofstream galog)
{
	int i;
	double best_val;            /* best population fitness */
	double avg;                 /* avg population fitness */
	double stddev;              /* std. deviation of population fitness */
	double sum_square;          /* sum of square for std. calc */
	double square_sum;          /* square of sum for std. calc */
	double sum;                 /* total population fitness */

	sum = 0.0;
	sum_square = 0.0;

	for (i = 0; i < POPSIZE; i++)
	{
		sum += population[i].fitness;
		sum_square += population[i].fitness * population[i].fitness;
	}
	

	avg= sum/POPSIZE;
	square_sum = avg * avg * POPSIZE;
	stddev = sqrt((sum_square - square_sum)/(POPSIZE - 1));
	best_val = population[POPSIZE].fitness;

	galog<<endl<<generation<<'\t'<<best_val<<'\t'<<avg<<'\t'<<stddev<<endl;
// 	fprintf(galog, "\n%5d, %6.3f, %6.3f, %6.3f \n\n", generation, best_val, avg, stddev);
}

⌨️ 快捷键说明

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