这也是人工智能实验的一个题目

  • 这是一个很简陋的遗传算法版本,只有交叉(交配)
  • 因为种群个体只有2个
  • 迭代次数到达后即停止
//@edit 2018/11/29
#include<iostream>
#include<fstream>
using namespace std;
const int CITY_NUM = 7;    //走过城市数量 0 x x x x x 0
const int RAND_GENE = 2;
float city_dis[CITY_NUM-1][CITY_NUM-1];
class individual
{public:int gene[CITY_NUM];     //个体基因,从城市0开始出发,到0结束float fitness;          //适应度,20.0/distanceint distance;           //计算当前基因(路线)下的总距离individual(int gene0,int gene1,int gene2,int gene3,int gene4){//初始化基因gene[0]=gene0;gene[1]=gene1;gene[2]=gene2;gene[3]=gene3;gene[4]=gene4;//基因传递后执行update函数(计算fitness和distance)update_info();}individual(int gene0,int gene1,int gene2,int gene3,int gene4,int gene5,int gene6){//初始化基因 //7gene[0]=gene0;gene[1]=gene1;gene[2]=gene2;gene[3]=gene3;gene[4]=gene4;gene[5]=gene5;gene[6]=gene6;//基因传递后执行update函数(计算fitness和distance)update_info();}void set_new_gene(int *new_gene){//mid part genefor(int i=1;i<CITY_NUM-1;++i){this->gene[i] = new_gene[i-1];//gene和传递进来到new_gene开始计数值不同}update_info();//更新个体fitness和distance}void update_info(){//更新fitness和distance的函数int new_dis = 0;for(int i=0;i<CITY_NUM-1;++i){new_dis += city_dis[this->gene[i]][this->gene[i+1]];}this->distance  = new_dis;this->fitness = 20.0/this->distance;}
};
class tsp
{public:int generation_counts;  //迭代次数,控制循环结束时间int best_route[CITY_NUM];      //存储目前最好的个体(路线)int best_distance;      //最好个体的路线距离float best_fitness;     //其适应度individual *father1;    //初始个体1(路线1individual *father2;    //初始个体2(路线2tsp(){generation_counts = 100;                //迭代次数500次  best_distance = 0;                      best_fitness = 0;load_city_distance();                   //从文件加载城市距离//father1 = new individual(0,2,1,3,0);    //初始化个体1father1 = new individual(0,1,2,3,4,5,0);//try rand father sequence //取消下面备注则会生成随机的基因给初始个体// int rand1[3];// get_random_nums(rand1,3);// father1->set_new_gene(rand1);//father2 = new individual(0,1,3,2,0);    //初始化个体2father2 = new individual(0,2,3,1,5,4,0);// int rand2[3];// get_random_nums(rand2,3);// father2->set_new_gene(rand2);}~tsp(){//析构函数delete father1;delete father2;}void start_generate(){//迭代总函数srand(time(NULL));                      //取随机数用while(--generation_counts >= 0)         //{cout<<"迭代:"<<generation_counts<<endl;get_best_fornow();                  //获取当前种群最好个体switch_part_genes();                //交换两个体的随机2个基因,开始和结束的0基因不参加交换}}void get_best_fornow(){//判断当前种群是否比已有的best个体更优,有则替换individual *now_the_best;if(father1->fitness > father2->fitness){//找到两个个体最优,并用指针指向它now_the_best = father1;}else{now_the_best = father2;}if(now_the_best->fitness > this->best_fitness){//better one will replace the original best individualfor(int i=0;i<CITY_NUM;++i){this->best_route[i] = now_the_best->gene[i];//替换基因}this->best_distance = now_the_best->distance;   //替换distancethis->best_fitness = now_the_best->fitness;     //替换fitness}}void switch_part_genes(){//switch 2 random genes in individualint gene_place1[2];int gene_place2[2];get_random_nums(gene_place1,2);//生成1-citynum-2范围中2个不同随机数给place1get_random_nums(gene_place2,2);//生成1-citynum-2中2个不同随机数给place2//start to switchswap_gene(gene_place1,gene_place2);//交换基因father1->update_info();//更新个体信息father2->update_info();//for testcout<<"\tf1 gene:";for(int i=0;i<CITY_NUM;++i)cout<<father1->gene[i];cout<<" fit:"<<father1->fitness<<endl;cout<<"\tf2 gene:";for(int i=0;i<CITY_NUM;++i)cout<<father2->gene[i];cout<<" fit:"<<father2->fitness<<endl;}void swap_gene(int loc1[2],int loc2[2]){   //loc1 is for father1;loc 2 for father 2//用loc1中的2个father1基因位置来交换loc2中2个father2基因的位置// cout<<loc1[0]<<" "<<loc1[1]<<endl;// cout<<loc2[0]<<" "<<loc2[1]<<endl;for(int i=0;i<2;++i){   //father1[i] <-> father2[i] int temp_father1_gene = father1->gene[loc1[i]];father1->gene[loc1[i]] = father2->gene[loc2[i]];father2->gene[loc2[i]] = temp_father1_gene;}clear_conflict(father1);//交换后可能出现冲突 比如01220这种序列,需要处理冲突clear_conflict(father2);}void clear_conflict(individual *ptr){bool flag=false;for(int i=1;i<CITY_NUM;++i){if(i==CITY_NUM-1){if(flag == true){i=0;flag = false;continue;}else{continue;}}int conf_loc = has_conflict(ptr->gene,i,ptr->gene[i]);if(conf_loc == -1)continue;//has conflictflag = true;++ptr->gene[i];if(ptr->gene[i] == 6)ptr->gene[i] = 1;--i; }return;}int has_conflict(int gene[CITY_NUM],int place,int target){   //可能冲突位置只有123,0和4固定为城市0,只要1和2、1和3、2和3都不冲突,即基因不冲突//不同返回值用于快速定位冲突位置for(int i=place+1;i<CITY_NUM;++i){if(gene[i] == target)return i;}return -1;}bool get_random_nums(int *nums,int size){//给nums数组生成size个不同随机数if(size <= 0){return false;}if(size == 1){nums[0] = rand()%3+1;//range 1-3return true;}//size >= 2;int range = CITY_NUM - 2;for(int i=0;i<size;++i){//i is the target placenums[i] = rand()%range+1;for(int j=0;j<i;++j){//j seeking the same numberif(nums[i] == nums[j]){   nums[i] = rand()%range+1;j=-1;}}}return true;}void print_best_route(){cout<<"\nBEST ROUTE:";for(int i=0;i<CITY_NUM;++i){cout<<best_route[i]<<" ";}cout<<endl;cout<<"DISTANCE:"<<this->best_distance<<endl;cout<<"FITNESS:"<<this->best_fitness<<endl;}void load_city_distance(){//从文件读取城市距离信息char in_data[50];ifstream in_stream;in_stream.open("ds.txt",ios::in);if(!in_stream.is_open())return;int j=0;int k=0;while(!in_stream.eof()){in_stream.getline(in_data,50);for(int i=0;i<50;++i){if(in_data[i]>= '0' && in_data[i] <= '9'){city_dis[j][k++] = in_data[i]-'0';if(k==CITY_NUM-1){k=0;++j;break;}}}}in_stream.close();}
};
int main()
{tsp tsp_demo;tsp_demo.start_generate();tsp_demo.print_best_route();return 0;
}

附测试截图

ds.txt 文件内容
0 1 3 4 2 4
1 0 2 5 1 2
3 2 0 3 4 3
4 5 3 0 3 1
2 1 4 3 0 5
4 2 3 1 5 0

C++ 用遗传算法解决TSP问题,旅行商问题相关推荐

  1. matlab 遗传优化算法_转载 | 遗传算法解决TSP问题的MATLAB实现

    问题定义: 巡回旅行商问题 给定一组n个城市和俩俩之间的直达距离,寻找一条闭合的旅程,使得每个城市刚好经过一次且总的旅行距离最短. TSP问题也称为货郎担问题,是一个古老的问题.最早可以追溯到1759 ...

  2. 遗传算法解决tsp问题(基于python)

    目录 1.遗传算法简要介绍 2.tsp问题简要介绍 3.遗传算法解决tsp问题的几个特殊点 4.源码 1.遗传算法简要介绍 简单来说,遗传算法是用于解决最优化问题的一种搜索算法.其核心基于自然界种群进 ...

  3. MATLAB实战系列(十九)-遗传算法解决TSP(旅行商)问题-应用及解析(文末附MATLAB源码)

    接上篇MATLAB实战系列(十八)-遗传算法解决TSP(旅行商)问题-算法原理 https://wenyusuran.blog.csdn.net/article/details/114060030 感 ...

  4. 计算智能——遗传算法解决TSP问题实验

    遗传算法解决TSP问题 定义 遗传算法 TSP问题 算法流程 参数说明 代码 主程序 main.m 染色体的路程代价函数 mylength.m 适应度函数 fit.m 交叉操作函数 cross.m 变 ...

  5. 模拟退火和遗传算法解决TSP问题

    模拟退火和遗传算法解决TSP问题 数据集介绍 采用数据集FRI26 来自标准数据集,共有26个城市,最优解为933: 数据下载链接 图1:数据矩阵 图2:数据集介绍 算法介绍 模拟退火 介绍: 模拟退 ...

  6. 基于遗传算法解决TSP问题(Matlab代码实现)

    目录 1 概述 2 运行结果 3 Matlab代码实现 4 结语 5 参考文献 1 概述 旅行商问题是一个经典的路径规划问题,传统TSP假设客户位置和客户之间旅行时间是固定不变的,而在现实生活中交通状 ...

  7. 遗传算法解决TSP问题 Python实现【160行以内代码】

    简述 之前通过遗传算法(Genetic Algorithm )+C++实现解决TSP问题 写了一些基本的原理.并且给出了C++版本代码. 相比于近300行的C++程序,Python只用了160行就解决 ...

  8. 运用遗传算法解决TSP问题

    求解15个城市TSP的GA问题,两城市间距离自拟或随机生成 问题分析: 用图论的术语来说,假设有一个图g=(v,e),其中v是顶点集,e是边集,设d=(dij)是由顶点i和顶点j之间的距离所组成的距离 ...

  9. java tsp 遗传算法_遗传算法解决TSP问题

    1实验环境 实验环境:CPU i5-2450M@2.50GHz,内存6G,windows7 64位操作系统 实现语言:java (JDK1.8) 实验数据:TSPLIB,TSP采样实例库中的att48 ...

最新文章

  1. python psycopg2_如何在Python上用“pip”安装psycopg2?
  2. list根据对象进行排序
  3. 全面理解Java中的String数据类型
  4. 2008R2Win7管理二十六ADRMS客户端使用及侦错
  5. android bitmap xml,XML Bitmap
  6. 数据库---练习题(45道)
  7. JVM优化系列-对象内存分配和回收的细节
  8. 部署exchange2010三合一:之二:先决条件
  9. OpenCV源码解析之动态内存管理CvMemStorage与CvSeq
  10. TLQ 异常杀进程清理 IPC 操作步骤
  11. java 压缩文件夹有几率压缩失败,打开显示不可预料的末端且用其他专业软件解压文件没压缩完全
  12. 想要成为黄金分析师要具备哪些知识?
  13. NMI(Normalized Mutual Information)
  14. 3D建模,打印正当时
  15. python标准库:fractions有理数
  16. STM32CubeMX学习笔记(48)——USB接口使用(MSC基于外部Flash模拟U盘)
  17. 在 Windows 10 中更改默认浏览器
  18. Needleman–Wunsch algorithm
  19. 云邦互联 免费空间 我来试一试
  20. java中talent-aio_通讯框架:talent-aio实例

热门文章

  1. dj电商-模型类设计-1.x-用户模块的两张表
  2. 景观分析工具:arcgis中patch analysis模块
  3. MySQL实战 | 01 当执行一条 select 语句时,MySQL 到底做了啥?
  4. 美的物联平台的云上实践与应用
  5. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow
  6. Linux驱动技术(六) _内核中断
  7. 金额数字转中文大写(转)
  8. php使用PHPMailer发送邮件示例
  9. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
  10. 让想法更加结构化!思维导图工具MindManager