亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sga.cpp

?? 基于遺傳算法的TSP優化問題研究完整源c++代碼
?? CPP
字號:
//////////////////////////////////
//
// 實驗三: 基本sga遺傳算法
//                 解安徽省17市TSP問題
// 姓名:饒玉佳  學號:E200602075
//
//

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<conio.h>

#define LENGTH 17                 //染色體長度17,代表17個城市
#define POPSIZE 500
double distance[LENGTH][LENGTH];//城市之間的距離矩陣
double cityposition[LENGTH][2]={//城市的相對坐標
	{1089.66,	541.02},//淮北0
	{538.48,	594.36},//亳州1
	{1191.26,	774.70},//宿州2
	{1409.70,	1257.30},//蚌埠3
	{558.80,	1259.84},//阜陽4
	{1209.04,	1465.58},//淮南5
	{1358.90,	1973.58},//合肥6
	{929.64	,	2059.94},//六安7
	{1965.96,	2319.02},//蕪湖8
	{2166.62,	2580.64},//宣城9
	{1473.20,	2776.22},//池州10
	{1226.82,	2865.12}, //安慶11
	{1661.16,	2603.50},//銅陵12
	{1971.04,	3403.60},//黃山13
	{1673.86,	2156.46},//巢湖14
	{2006.60,	2075.18},//馬鞍山15
	{1920.24,	1681.48}//滁州16
	};

 int popsize ;                         //種群大小
 int maxgeneration;                   //最大世代數
 double pcross = 0.0;                           //交叉率
 double pmutation = 0.0;                           //變異率
 double sumfitness;					//種群個體適應值累計


 struct individual                     //定義染色體個體結構體
 { 
	 int  chrom[LENGTH];              //定義染色體二進制表達形式
	 double fitness;                       //染色體的適應值
 };


int generation;                       //當前執行的世代數
int best_index;                       //本世代最好的染色體索引序號

struct individual bestindividual;     //最佳染色體個體
struct individual currentbest;        //當前最好的染色體個體 currentbest
int bestgeneration;					//當前最好染色體個體產生的代數
struct individual oldpop[POPSIZE];//種群數組
struct individual newpop[POPSIZE];//新種群數組

/* 隨機數發生器使用的靜態變量 */
static double oldrand[55];
static int jrand;
static double rndx2;
static int rndcalcflag;

//函數聲明 
void printline(FILE *);
void caldistancematrix(FILE *ffp);//設定城市距離矩陣                                    
void initialoldpop(FILE *ffp);     //ok-初始化當代種群      
void generatenextpop(FILE *ffp);        //產生下一代種群
void evaluateoldpop();            //評價種群
void calculateobjectfitness();        //計算種群適應度
void findbestindividual();    //尋找最好的染色體個體

int select();                //選擇操作
//將p中移除掉q中位置在j1,j2之間的元素,其余元素前移,返回剩下元素的數量
int searchanddelete(int *p,int* q,int j1,int j2);
void crossover(int *,int *,int *,int *,FILE *ffp);            //交叉操作
void mutation(int *);              //變異操作
void input();                         //輸入接口
void outputtextreport(FILE *ffp);              //每代輸出文字報告
void report(FILE *ffp);//輸出最終結果報告

//以下為一些隨機數相關函數
void advance_random();
int flip(double);int rnd(int, int);
void randomize();
double randomnormaldeviate();
float randomperc();float rndreal(float,float);
void warmup_random(float);

void main()    //主函數
{

	int i; 
	
	FILE *fp;
	
	//打開文本文件
	if((fp= fopen("test1.txt","w+"))==NULL)
	{
		printf("Can not open file!\n");
	}
    fprintf(fp,"本程序為使用基本SGA求解tsp問題\n");
    generation=0;                   //初始化generation當前執行的代
    input();                        //初始化種群大小、交叉率、變異率
    
     
    randomize(); // 初始化隨機數發生器
	caldistancematrix(fp);//設定城市距離矩陣
    initialoldpop(fp);    //產生初始化種群
	
    evaluateoldpop(); 
    while(generation<maxgeneration) //小于最大世代數,執行循環體
	{
		generation++;                   
		generatenextpop(fp);        //生成子代種群(A.選擇; B.交叉; C.變異)
		for(i = 0 ; i < popsize ; i++)
		{
			oldpop[i]=newpop[i];
		}
		evaluateoldpop();            //評價新生子代種群
		outputtextreport(fp);              //輸出當前子代種群統計報告
	}
   	
	report(fp);//輸出最終報告
	fclose(fp);

	printf("計算結果已經輸出到test1.txt文件中。");
	getch();
	
}

void printline(FILE *ffp)
{
	fprintf(ffp,"\n*************************************************************\n");
}

void caldistancematrix(FILE *ffp)//設定城市距離矩陣
{

	int i,j;
	for(i=0;i<LENGTH;i++)
		for(j=0;j<LENGTH;j++)
			//求城市i,j之間的距離存放在distance[i][j]
		{	
			distance[i][j]=sqrt( pow( cityposition[i][0]-cityposition[j][0] ,2) +
				pow( cityposition[i][1]-cityposition[j][1] ,2) );
		}
}

void initialoldpop(FILE *ffp)  //種群初始化,對種群中每條染色體,生成0-16的不重復序列
{
	
	int i,j,k,m;
	srand(   (unsigned)time(   NULL   )   );
	for (i=0;i<popsize; i++)
	{
		//對oldpop[i]染色體生成隨機序列
		int a[LENGTH]   =  {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 
		j =LENGTH;  
		m=0;
		while(j > 0)   
		{   
			k =rand();   
			k%=j;   
			oldpop[i].chrom[m]=a[k]; 
			a[k]=a[j-1];     //  把最后一個拷貝到剛生成的位置               
			m++;
			j--;
		}     
	}	
	
	
	
}

void generatenextpop(FILE *ffp)  //生成下一代
{
	int mate1,mate2,j=0;
	do{
		//挑選交叉配對
		mate1=select();
		mate2=select();
		crossover(oldpop[mate1].chrom,oldpop[mate2].chrom,newpop[j].chrom,newpop[j+1].chrom,ffp);
		mutation(newpop[j].chrom);
		mutation(newpop[j+1].chrom);
		j=j+2;	
	}
	while(j<(popsize-1));
}



void evaluateoldpop()   //評價種群
{
   calculateobjectfitness();       //計算種群個體的適應度
   findbestindividual();   //找到最好和最差的染色體個體
}



void calculateobjectfitness()  //計算染色體個體適應值
{  
  int i,j;

  for(i=0;i<popsize;i++)
	 { 
	  oldpop[i].fitness=0.0;
	  for(j=0;(j+1)<LENGTH;j++)
		  oldpop[i].fitness+=distance[oldpop[i].chrom[j]][oldpop[i].chrom[j+1]];
	  oldpop[i].fitness+=distance[oldpop[i].chrom[LENGTH-1]][0];
	 }

}




void findbestindividual( ) //求最佳個體
{
	int i;
	sumfitness=0.0;
	
	
	bestindividual=oldpop[0];
	best_index=0;
	
	sumfitness=+oldpop[0].fitness; 
	for (i=1;i<popsize; i++)
	{
		if (oldpop[i].fitness<bestindividual.fitness)       //依次比較,找出最佳個體
		{
			bestindividual=oldpop[i];
			best_index=i;
		}
		
		sumfitness+=oldpop[i].fitness;                              // 存放種群總體適應值
	}//for
	
    if (generation==0)
	{
		currentbest=bestindividual;                    //第一代最好的暫時存放在currentbest
		bestgeneration=0;
	}
	if(bestindividual.fitness<currentbest.fitness)//第n代最好的,通過比較小于以往最好個體的話,暫時存放在currentbest
	{ 
		currentbest=bestindividual;
		bestgeneration=generation;
	}
	
}

//將p[]中移除掉q[]中位置在j1,j2之間的元素,其余元素前移,返回剩下元素的數量
int searchanddelete(int *p,int* q,int j1,int j2)
{
	int num=LENGTH;
	int i,j;	

	for(j=j1;j<j2;j++)
			for(i=0;i<num;i++)
			{	if(q[j]==p[i])
				{	
				
				
					while((i+1)<num)
					{	
						p[i]=p[i+1];
						i++;
					}
					num--;//刪除一個元素,計數器減一	
				}			
			}


	num=LENGTH-(j2-j1);//計算剩下元素的數目

	return num;	
}

int select() //輪盤賭選擇
{
	float randomperc();
	
	double sum,pick;
	int i;
	
	pick=randomperc(); //產生[0,1]上隨機數
	sum=0.0;
	if(sumfitness!=0)
	{
		for(i=0;(sum<pick)&&(i<popsize);i++)
			sum+=oldpop[i].fitness/sumfitness;
		
	}
	else
		i=rnd(1,popsize);  
	
	return(i-1); 
}



void crossover(int *parent1,int *parent2,int *child1,int *child2,FILE *ffp) //ox交叉算法
{
	
	int i,j;
	int jcross1,jcross2;//交叉位置
	int temp;
	int num1,num2;

	int temp1[LENGTH],temp2[LENGTH];//分別作為暫存parent1,parent2的數組
	
	for(i=0;i<LENGTH;i++)
	{
		temp1[i]=parent1[i];
		temp2[i]=parent2[i];

	}
	
	if(flip(pcross))
	{
		//在1和LENGTH-1之間隨機產生兩個交叉位置值
		jcross1=-1;
		jcross2=-1;
		while(jcross1==jcross2)
		{
			jcross1=rand()%(LENGTH-1)+1;
			jcross2=rand()%(LENGTH-1)+1; 
		}
		if(jcross1>jcross2)
		{
			temp=jcross1;
			jcross1=jcross2;
			jcross2=temp;
		}

		//將切割點之間的元素復制到后代的切割點之間
		j=jcross1;
		while(j<jcross2)
		{
			child1[j]=temp1[j];
			child2[j]=temp2[j];
			j++;
		}
	
		
	//將parent2中,除掉child1中位置在jcross1,jcross2之間的元素,其余元素前移,返回剩下元素的數量
		num1=searchanddelete(temp2,child1,jcross1,jcross2);

		//將parent1中,除掉child2中位置在jcross1,jcross2之間的元素,其余元素前移,返回剩下元素的數量
		num2=searchanddelete(temp1,child2,jcross1,jcross2);

		
		//將去掉多余元素的parent2中值復制到child1中,避開jcross1,jcross2之間的元素
		j=0;i=0;
		while(j<jcross1)
		{
			child1[j]=temp2[i];
			i++;
			j++;
			
		}		
		
		
		j=jcross2;//數組下標避開jcross1,jcross2之間的元素
		while(i<num1)
		{
			child1[j]=temp2[i];
			i++;
			j++;
			
		}
		
		
		//將去掉多余元素的parent1中值復制到child2中,避開jcross1,jcross2之間的元素
		j=0;i=0;
		while(j<jcross1)
		{		
			child2[j]=temp1[i];
			i++;
			j++;
			
		}		
		
		j=jcross2;//數組下標避開jcross1,jcross2之間的元素
		while(i<num2)
		{
			child2[j]=temp1[i];
			i++;
			j++;
			
		}
				
				
	}//if

	else
	{	
		for(i=0;i<LENGTH;i++)
		{
			child1[i]=temp1[i];
			child2[i]=temp2[i];
			
		}

	}
	
}


void mutation(int *child) //變異是在染色體上隨機地選擇兩點,交換其編碼
{
	
	int i;
	int j1,j2,temp; 
	
	
	for(i=0;i<LENGTH;i++)
	{
		
		if (flip(pmutation))
		{
			j1=rand()%(LENGTH-1)+1; 
			j2=rand()%(LENGTH-1)+1; 
			temp=child[j1];
			child[j1]=child[j2];
			child[j2]=temp;
			
		}
	}	 
	
}


 
 void input() //數據輸入
 {
	 
	 printf("初始化全局變量:\n");
	 
	 printf("    種群大小(50-500偶數):");
	 scanf("%d", &popsize);                //輸入種群大小,必須為偶數
	 if((popsize%2) != 0)          
	 {
		 printf( "   種群大小已設置為偶數\n");
		 popsize++;
	 }
	 printf("     最大世代數(100-300):"); //輸入最大世代數
	 scanf("%d", &maxgeneration);
	 printf("     交叉率(0.2-0.99):");    //輸入交叉率
	 scanf("%lf", &pcross);
	 printf("     變異率(0.001-0.1):");   //輸入變異率
	 scanf("%lf", &pmutation);
	 
 }


 
 void outputtextreport(FILE *ffp)//數據輸出
 {
	int i;

	printline(ffp);

	fprintf(ffp,"\n\t當前世代=%d\n",generation);

	fprintf(ffp,"本世代最好的染色體為:\n");
	for(i=0;i<LENGTH;i++)
		fprintf(ffp," %d-",bestindividual.chrom[i]);

	fprintf(ffp,"\n總長度(相對長度)為%6.1f",currentbest.fitness);
	 
 }

 void report(FILE *ffp)
 {
	 
	int i; 
	
	fprintf(ffp,"\n");
	fprintf(ffp,"         統計結果:        ");
	fprintf(ffp,"\n");

	fprintf(ffp,"\n種群數:%d", popsize);
	fprintf(ffp,"\n最大世代數:%d", maxgeneration);
	fprintf(ffp,"\n交叉率:%5.1f", pcross);
	fprintf(ffp,"\n變異率:%5.1f", pmutation);

	fprintf(ffp,"\n最終求得tsp問題的最短路徑解");
	fprintf(ffp,"產生于%d代",bestgeneration);
	fprintf(ffp,"\n其染色體編碼為:");
	
	for( i = 0 ; i < LENGTH ; i++ )
		fprintf(ffp," %d-",currentbest.chrom[i]);
	fprintf(ffp,"\n總長度(相對長度)為%6.1f",currentbest.fitness);
	fprintf(ffp,"\n");
	
	 
	 
 }


void advance_random()          // 產生55個隨機數 
{
    int j1;
    double new_random;
    for(j1 = 0; j1 < 24; j1++)
    {
        new_random = oldrand[j1] - oldrand[j1+31];
        if(new_random < 0.0) new_random = new_random + 1.0;
        oldrand[j1] = new_random;
    }
    for(j1 = 24; j1 < 55; j1++)
    {
        new_random = oldrand [j1] - oldrand [j1-24];
        if(new_random < 0.0) new_random = new_random + 1.0;
        oldrand[j1] = new_random;
    }
}

int flip(double prob)          //以一定概率產生0或1
{

    if(randomperc() <= prob)
        return(1);
    else
        return(0);
}

void randomize()            /* 設定隨機數種子并初始化隨機數發生器 */
{
    float randomseed;
    int j1;
    for(j1=0; j1<=54; j1++)
      oldrand[j1] = 0.0;
    jrand=0;
      do
        {
             printf("請輸入隨機數種子[0-1]:\n");
			 scanf("%f",&randomseed);
         }
        while((randomseed < 0.0) || (randomseed > 1.0));
    warmup_random(randomseed);
}

double randomnormaldeviate()         // 產生隨機標準差 
{

    double t, rndx1;
    if(rndcalcflag)
    {   rndx1 = sqrt(- 2.0*log((double) randomperc()));
        t = 6.2831853072 * (double) randomperc();
        rndx2 = rndx1 * sin(t);
        rndcalcflag = 0;
        return(rndx1 * cos(t));
    }
    else
    {
        rndcalcflag = 1;
        return(rndx2);
    }
}


float randomperc()            //與庫函數random()作用相同, 產生[0,1]之間一個隨機數 
{
    jrand++;
    if(jrand >= 55)
    {
        jrand = 1;
        advance_random();
    }
    return((float) oldrand[jrand]);
}


int rnd(int low,int high)           //在整數low和high之間產生一個隨機整數
{
    int i;
 
    if(low >= high)
        i = low;
    else
    {
        i = ((int)randomperc() * (high - low + 1)) + low;
        if(i > high) i = high;
    }
    return(i);
}

void warmup_random(float random_seed)       //初始化隨機數發生器
{
    int j1, ii;
    double new_random, prev_random;

    oldrand[54] = random_seed;
    new_random = 0.000000001;
    prev_random = random_seed;
    for(j1 = 1 ; j1 <= 54; j1++)
    {
        ii = (21*j1)%54;
        oldrand[ii] = new_random;
        new_random = prev_random-new_random;
        if(new_random<0.0) new_random = new_random + 1.0;
        prev_random = oldrand[ii];
    }
    advance_random();
    advance_random();
    advance_random();
    jrand = 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
热久久一区二区| 欧美三级视频在线| 色婷婷av久久久久久久| 欧美一区二区三区喷汁尤物| 欧美激情一区二区三区不卡| 日韩精品欧美精品| 91在线观看一区二区| 欧美大胆一级视频| 亚洲午夜电影在线| 色综合亚洲欧洲| 中国色在线观看另类| 美女任你摸久久| 精品视频一区二区三区免费| 亚洲欧美自拍偷拍| 国产乱子轮精品视频| 日韩欧美激情在线| 香蕉成人啪国产精品视频综合网 | 国产精品久久久久久亚洲伦| 男女男精品网站| 欧美日韩小视频| 亚洲欧美视频在线观看| 国产成人亚洲综合a∨婷婷图片| 91精品久久久久久久99蜜桃| 亚洲韩国精品一区| 色94色欧美sute亚洲线路一久 | 亚洲成av人片| 91女人视频在线观看| 国产精品视频一区二区三区不卡| 久久国产精品99久久人人澡| 91精品国产综合久久精品性色| 亚洲一二三区在线观看| 91丝袜国产在线播放| 中文字幕欧美一区| a在线播放不卡| 亚洲欧洲一区二区三区| 一本一道综合狠狠老| 亚洲色图制服诱惑| 色综合咪咪久久| 亚洲综合成人在线视频| 欧美午夜影院一区| 亚洲第一av色| 日韩欧美在线一区二区三区| 日本不卡视频一二三区| 欧美成人a∨高清免费观看| 蜜桃一区二区三区四区| 久久―日本道色综合久久 | 日本欧美大码aⅴ在线播放| 在线观看欧美日本| 午夜精品久久久久久久| 91精品国产aⅴ一区二区| 久久成人免费网站| 国产精品国产三级国产普通话蜜臀 | 国产成人在线视频免费播放| 国产精品免费av| 色综合网色综合| 无吗不卡中文字幕| 精品国产一区二区三区av性色| 国产成人午夜精品5599| 亚洲精品国产精华液| 91精品国产综合久久国产大片| 日本欧美一区二区| 国产精品免费丝袜| 欧美性大战久久久久久久蜜臀| 日精品一区二区| 国产三级一区二区| 日本大香伊一区二区三区| 日韩二区三区在线观看| 日本一区二区三区久久久久久久久不| 97国产一区二区| 日产欧产美韩系列久久99| 国产亚洲精品bt天堂精选| 色综合久久综合网欧美综合网| 蜜乳av一区二区三区| 成人欧美一区二区三区白人| 91精品国产手机| 99久久国产免费看| 另类欧美日韩国产在线| 18成人在线观看| 精品国免费一区二区三区| 色综合色综合色综合色综合色综合| 男人的天堂亚洲一区| 亚洲精品精品亚洲| 久久一留热品黄| 欧美日韩成人一区| 972aa.com艺术欧美| 久久国产精品区| 亚洲成人一区二区| 中文字幕中文在线不卡住| 日韩一区二区在线观看视频播放| 成人av在线播放网址| 精品一区二区在线看| 青青草国产精品亚洲专区无| 亚洲欧美色图小说| 国产日韩亚洲欧美综合| 91精品欧美综合在线观看最新| 91丨porny丨中文| 国产99久久久国产精品免费看| 日韩av电影免费观看高清完整版在线观看 | 亚洲视频 欧洲视频| 久久精品一区八戒影视| 欧美一级黄色大片| 欧美在线色视频| 91毛片在线观看| 岛国精品一区二区| 国产伦精品一区二区三区在线观看 | 亚洲女爱视频在线| 国产精品久久久久久一区二区三区| 欧美电影免费提供在线观看| 欧美剧情电影在线观看完整版免费励志电影| 成人午夜av电影| 国产二区国产一区在线观看| 久久国产精品无码网站| 久久66热re国产| 免费在线成人网| 久久成人麻豆午夜电影| 精品在线播放午夜| 国产一区二区在线电影| 国产精品一区三区| 国产一区91精品张津瑜| 国产精品1024| 99精品久久只有精品| 91免费在线看| 欧美日本免费一区二区三区| 欧美日韩午夜影院| 欧美精品99久久久**| 欧美一区2区视频在线观看| 这里只有精品99re| 日韩欧美一区二区免费| 精品乱人伦小说| 亚洲国产经典视频| 亚洲欧美日韩中文播放| 亚洲制服丝袜一区| 日本不卡在线视频| 国产乱人伦偷精品视频不卡| bt欧美亚洲午夜电影天堂| 色婷婷久久99综合精品jk白丝| 欧美日韩五月天| 久久久久久久久久久电影| 中文av一区二区| 亚洲高清免费视频| 精品午夜一区二区三区在线观看| 国产剧情一区二区三区| 91亚洲精华国产精华精华液| 欧洲国内综合视频| 日韩久久久精品| 国产精品成人在线观看| 亚洲一二三专区| 激情伊人五月天久久综合| aaa国产一区| 91精品国产综合久久蜜臀| 日本一区二区三区高清不卡| 亚洲欧美日韩电影| 国内精品视频666| 91视视频在线直接观看在线看网页在线看| 欧美性做爰猛烈叫床潮| 2014亚洲片线观看视频免费| 亚洲精品中文字幕乱码三区| 免费成人av资源网| 99国产精品久久久久久久久久久 | 三级欧美在线一区| 国产成人无遮挡在线视频| 欧美性受xxxx黑人xyx| 国产视频一区在线播放| 视频一区欧美精品| 91免费观看在线| 国产偷国产偷亚洲高清人白洁| 亚洲欧美色图小说| 国产 欧美在线| 日韩欧美一区二区不卡| 亚洲一区欧美一区| 成人美女视频在线观看18| 日韩片之四级片| 一区二区三区不卡视频在线观看| 国产剧情av麻豆香蕉精品| 欧美美女激情18p| 一区二区三区久久| 成人网在线播放| 国产日韩欧美高清| 精品亚洲aⅴ乱码一区二区三区| 欧美人动与zoxxxx乱| 亚洲色欲色欲www| 成人高清视频免费观看| 久久久久久久久久久电影| 男男成人高潮片免费网站| 欧美性猛交xxxx黑人交| 一区在线中文字幕| 成人深夜在线观看| 国产色产综合色产在线视频| 美国欧美日韩国产在线播放| 欧美日韩午夜精品| 亚洲成精国产精品女| 色菇凉天天综合网| 一区二区成人在线| 99久久伊人网影院| 国产精品成人免费在线| 不卡一区二区中文字幕| 国产精品区一区二区三区 | 精品亚洲成a人| 欧美精品一区二区三区蜜臀| 极品少妇一区二区三区精品视频|