• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: 其他
  • 标签: 遗传算法  TSP  

资源简介

遗传算法的求解的全部代码,带有大量的注释。可读性好,欢迎大家下载

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int DIMENSION=535; //城市个数
const int PERSONS=1000; //种群个数
const int crosspob=0.75; //决定是否交叉的概率
const double mute=0.03; //变异概率
const int iternum=100; //计划迭代次数
ofstream out(“optimal_solution.txt“);
int nmutations;
#define max(ab) a>b?a:b
#define min(ab) astruct chrom{  
unsigned int gene[DIMENSION-1]; //固定第一个城市  
int fitness; //该路径的长度
}; //表征每个染色体特征
struct Population{   
struct chrom person[PERSONS]; //有这么多个染色体   
double fitsum; //适应值之和  
int minfit; //最小适应度的下标
}; //种群的一些属性

//function declare here*********************************
int select(Population* p);
bool Flip(float prob);
void Cross(unsigned int* table1unsigned int* table2);
void Mutation(unsigned int* table);
void crossover(Population* poldPopulation* pnewint parent1int parent2int i);
void UpdateGen(Population* poldPopulation* pnew);
void shuffle(unsigned int* table);
void ComputeFitness(Population* pint* distance);
void InitData(Population* pint* distance);
//function declare here*********************************

bool Flip(float pro)

float temp;  
temp=(float)rand()/(float)RAND_MAX;  
if(temp<=pro)   return true;  
else   return false;
}

int find(unsigned int* tableunsigned int aint startint end) //返回a在数组table中的下标
{    
for(int i=start;i<=end;i++)    
{    
if(a==table[i])     
return i; 

return -1;
}

void exchange(unsigned int* tableint index1int index2)
{   
unsigned int temp=table[index1];   
table[index1]=table[index2];   
table[index2]=temp;
}

void Cross(unsigned int* table1unsigned int* table2) //对两个基因进行交叉操作,生成子代的两个基因
{
int rand1=rand()%(DIMENSION-101)+50; //assure rand1 range from 2 to DIMENSION-4left and right side reserve at least 50 elements 
int rand2=rand1; 
do 
{  
rand2=rand()%(DIMENSION-101)+50;
}while(rand1==rand2); //assure rand1 differ from rand2
const int start=min(rand1rand2); 
const int end=max(rand1rand2); 
for(int i=start;i<=end;i++) 
{    
unsigned int t1=table1[i];  
unsigned int t2=table2[i];       
if(t1!=t2)  
{      
int a1=find(table1t20DIMENSION-2);   
exchange(table1a1i);      
int b1=find(table2t10DIMENSION-2);          
exchange(table2b1i);  
}
}
}

void Mutation(unsigned int* table) //依据一定概率对基因进行变异,变异操作是2-opt的
{      
bool mut=Flip(mute);   
if(mut) //如果发生了变异   
{  
nmutations++;    
int rand1=rand()/(DIMENSION-1);    
int rand2;    
do    
{       
rand2=rand()/(DIMENSION-1);    
}while(rand1==rand2);    
exchange(tablerand1rand2);   
}
return;
}

void crossover(Population* poldPopulation* pnewint parent1int parent2int i) //对群体中的两个个体杂交,生成新的个体并将新个体保存进新的种群里
{  
struct chrom* ch1=&(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8727  2012-11-19 16:11  TSPyichuan.cpp

----------- ---------  ---------- -----  ----

                 8727                    1


评论

共有 条评论