TSP问题之随机算法 cpp实现

随机算法也许给本称不上算法,但也不是为一种无奈时之举

蚁群算法,遗传算法等用到随机性的算法,在算子设计不好时,并不比随机算法好多少

 

写了两个版本

一个完全随机(下载)

一个覆盖起点随机(下载),就是每一轮都分别以每一个城市为起点,然后随机产生后续

覆盖起点随机算法比完全随机好不少,

其实把覆盖起点延伸,就成了穷举搜索了

这是我自己瞎造的

 

这种算法基本没有现实意义,但可以作为某些算法运行结果的参考

 

 

完全随机

int generation=1000; for (int g=0;g<generation;g++){ double pathLen=0; rand_int_order(individual,cityNum); //calculate length of this path generated at random for (int i=0;i<cityNum-1;i++){ pathLen+=distance[individual[i]][individual[i+1]]; } pathLen+=distance[individual[cityNum-1]][individual[0]]; if (best_path_len>pathLen){ best_path_len=pathLen; } }

覆盖起点随机算法

for (int g=0;g<generation;g++){ for (int p=0;p<cityNum;p++){ pathLen[p]=0; } rand_cover_order(individuals,cityNum); //calculate length of this path generated at random for (int c=0;c<cityNum;c++){ for (int i=0;i<cityNum-1;i++){ pathLen[c]+=distance[individuals[c][i]][individuals[c][i+1]]; } pathLen[c]+=distance[individuals[c][cityNum-1]][individuals[c][0]]; if (best_path_len>pathLen[c]){ best_path_len=pathLen[c]; bestIndex=c; } } }

//generate a integer sequence from 0 to n-1 at random which can cover all start points void rand_int_order(vector<int>& randorder,const int n) { assert(n>1); randorder.clear(); randorder.resize(n); vector<int> recoder; for (int i=0;i<n;i++){ recoder.push_back(i); } for(int i=0;i<n;i++){ int sel=rand()%recoder.size(); randorder[i]=recoder[sel]; recoder.erase(recoder.begin()+sel); } //assertion assert(randorder.size()==n); }

 

你可能感兴趣的:(TSP问题之随机算法 cpp实现)