求解旅行商(货郎担)问题的五种方法
1.蛮力法
#include"Graph.cpp"
#include<stdio.h>
#include<vector>
using namespace std;
int s=0;
MGraph g;
int Count=1;
vector<vector<int> >ps;
void Insert(vector<int>s,int i,vector<vector<int>> &ps1){vector<int>s1;vector<int>::iterator it;for(int j=0;j<i;j++){s1=s;it=s1.begin()+j;s1.insert(it,i);ps1.push_back(s1);}
}
void Perm(int n){vector<vector<int>> ps1;vector<vector<int>>::iterator it;vector<int>s,s1;s.push_back(1);ps.push_back(s);for(int i=2;i<=n;i++){ps1.clear();for(it=ps.begin();it!=ps.end();it++){Insert(*it,i,ps1);}ps=ps1;}
}
void TSP(MGraph g,int s){vector<int>minpath;int minpath=INF;Perm(g.n-1);vector<vector<int>>::reverse_iterator it;vector<int>apath;int pathlen;printf("起点为%d的全部路径:",s);for(it=ps.rbegin();it!=ps.rend();it++){pathlen=0;int initv=s;apath=(*it);for(int i=0;i<(*it).size();i++){pathlen+=g.edges[initv][(*it)[i]];initv=(*it)[i];}pathlen+=g.edges[initv][s];if(pathlen<INF){printf("%d:",Count++);cout<<"0->";for(int i=0;i<apath.size();i++){printf("%d->",apath[i]);}printf("%d路径长度:%d\n",0,pathlen);if(pathlen<minpathlen){minpathlen<pathlen;minpath=apath;}}}printf("起点为%d的最短路径\n",s);printf("最短路径长度:%d\n",minpathlen);printf("最短路径:");printf("0->");for(int i=0;i<minpath.size();i++){printf("%d->",minpath[i]);}cout<<"0"<<endl;
}
int main(){TSP(g,s);
}
2.分支限界法
#include"Graph.cpp"
#include<string.h>
#include<vector>
using namespace std;
int s;
MGraph g;
int Count=1;
vector<int>minpath;
int minpathlen=INF;struct NodeType{int v,num;int visited[MAXV];int pathlen;vector<int>path;bool operator <(const NodeType &s) const{return pathlen>s.pathlen;}
};
void dispasolution(vector<int>path,int pathlen){cout<<Count++<<endl;for(int i=0;i<path.size();i++){printf("%2d",path[i]);}printf("路径长度",pathlen);
}
void TSP(){NodeType e,e1;priority_queue<NodeType>qu;e.v=0;e.pathlen=0;e.path.push_back(0);e.num=1;memset(e.visited,0,sizeof(e.visited));e.visited[0]=1;qu.push(e);while(!qu.empty()){e=qu.top();qu.pop();if(e.num==g.n){if(g.edges[e.v][s]!=0&&g.edges[e.v][s]!=INF){e.path.push_back(s);e.pathlen+=g.edges[e.v][s];dispasolution(e.path,e.pathlen);if(e.pathlen<minpathlen){minipathlen=e.pathlen;minpath=e.path;}}}else {for(int j=1;j<g.n;j++){if(g.edges[e.v][j]!=0&&g.edges[e.v][j]!=INF){if(e.visited[j]==1) continue;e1.v=j;e1.num=e.num+1;e1.path=e.path;e1.path.push_back(j);e1.pathlen=e.pathlen+g.edges[e.v][j];for(int j=0;j<g.n;j++){e1.visited[i]=e.visited[i];}if(e1.pathlen<minpathlen){e1.visited[j]=1;qu.push(e1);}}} }}
}
int main(){TSP();
}
3.回溯法
void TSP(SET V,int i,vector<int>path,int pathlen){int prev;if(path.size()>0){prev=path.back();}path.push_back(i);pathlen+=g.edges[prev][i];if(V.size()==0) {if(g.edges[i][s]!=0&&g.edges[i][s]!=INF){path.push_back(0);pathlen+=g.edges[i][s];dispasolution(path,pathlen);if(pathlen<minpathlen){minpathlen=pathlen;minpath=path;}}}else {SET::iterator it;for(it=V.begin();it!=V.end();it++){SET tmpV=V;int j=*it;tmpV.erase(j);if(pathlen<minpathlen) TSP(tmpV,j,path,pathlen);}}
}
4.贪心法
void TSP(MGraph g){int i,j,k;int minj,minedge;bool find;vector<int>minpath;int minpathlen=0;minpath.push_back(0);i=0;while(minpath.size()!=g.n){find=false;minedge=INF;for(j=1;j<g.n;j++){if(g.edges[i][j]!=0&&g.edges[i][j]!=INF){k=0;while(k<minpath.size()&&j!=minpath[k]){k=0;while(k<minpath.size()&&j!=minpath[k]) k++;if(k==minpath.size()){if(g.edges[i][j]<minedge){minedge=g.edges[i][j];minj=j;}}}}}minpath.push_back(minj);minpathlen+=minedge;i=minj;}minpath.push_back(0);minpathlen+=g.edges[minj][0];}
5.动态规划法
typedef set<int>SET;
int s=0;
MGraph g;
int dp[1<<MAX][MAX];
int minpathlen;
vector<int>minpath;
void solve(){int n=g.n-1;memset(dp,0,sizeof(dp));for(int V=0;V<=(1<<n)-1;V++){for(int i=1;i<=n;i++){if(V&(1<<(i-1))){if(V==(1<<i-1)) dp[V][i]=edges[0][i];else {dp[V][i]=INF;for(int j=1;j<=n;j++){if(V&(1<<(j-1))&&i!=j){dp[V][i]=min(dp[V][i],dp[V^(1<<(i-1))][j]+g.edges[j][i]);}}}}}}
}
求解旅行商(货郎担)问题的五种方法相关推荐
- 鲸鱼优化算法WOA求解旅行商TSP优化问题(2022.6.2)
鲸鱼优化算法WOA求解旅行商TSP优化问题(2022.6.2) 引言 1.鲸鱼优化算法WOA 1.1 WOA算法原理介绍 1.1.1 包围猎物 1.1.2 气泡网式攻击猎物(开发阶段) 1.1.3 寻 ...
- matlab算法大全 pdf_遗传模拟退火算法求解旅行商(TSP)问题
hello大家好,很高兴又和大家见面了.在之前的遗传算法(GA)求解旅行商问题(TSP)MATLAB代码讲解和模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解这两篇推文中,分别讲解了 ...
- MATLAB求解非线性方程组的五种方法
MATLAB求解非线性方程组的五种方法 求解线性方程分为两种方法–二分法和迭代法 常见的方法一共有5种 二分法 迭代法 牛顿法 割线法 拟牛顿法 Halley法 使用条件 二分法需要知道两个自变量,分 ...
- [LeetCode] 322.零钱兑换 五种方法讲解
322.零钱兑换 五种方法讲解 文章目录 322.零钱兑换 五种方法讲解 1 问题描述 2 问题分析 3 解决策略 3.1 递归-暴力解决 3.2 递归-加入存储 3.3 BFS 3.4 动态规划-自 ...
- Linux:检查当前运行级别的五种方法
2019独角兽企业重金招聘Python工程师标准>>> 运行级就是Linux操作系统当前正在运行的功能级别.存在七个运行级别,编号从0到6.系统可以引导到任何给定的运行级别.运行级别 ...
- python 重载_python模块重载的五种方法
环境准备 新建一个 foo 文件夹,其下包含一个 bar.py 文件 bar.py 的内容非常简单,只写了个 print 语句 只要 bar.py 被导入一次,就被执行一次 print 禁止重复导入 ...
- Java字符串拼接的五种方法,哪种性能最好?
作者 | 老坛酸菜WH 来源 | https://www.cnblogs.com/twzheng/p/5923642.html > 字符串拼接一般使用"+",但是" ...
- 五种方法创建 Java 对象,你知道几种呢?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 网络 五种方法创建java对象 作为Java开 ...
- python压缩包怎么安装-详解python解压压缩包的五种方法
这里讨论使用Python解压例如以下五种压缩文件: .gz .tar .tgz .zip .rar 简单介绍 gz: 即gzip.通常仅仅能压缩一个文件.与tar结合起来就能够实现先打包,再压缩. t ...
- Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能
Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...
最新文章
- 【Linux sshfs】sshfs将远程目录挂载到本地目录
- html布局overflow,overflow的中文意思
- [linx] ubuntu网络重启命令
- LAMP平台下构建Postfix邮件服务器
- C 标准IO 库函数与Unbuffered IO函数
- js方法写在html中,在js中写html代码怎么写
- java 自定义报表_设计好的报表是如何在 web 上显示的
- Leetcode每日一题:41.first-missing-positive(缺失的第一个正数)
- android 图库分析,Android开发之ImageSwitcher相册功能实例分析
- 推荐《Office SharePoint Server 2007案例实战开发》
- (旧)子数涵数·PS——换脸
- excel学习-阶梯查询函数lookup
- lv官网编码查询_成都市居住证编号查询系统
- 智能人物画像综合分析系统——Day16
- 单肩包属于什么类目_包包属于什么商标类目
- 面向工业物联网的拍赫兹通信
- [企业信息化大家学系列]制造业税务成本
- 数据库面试——锁的12连问,赶紧收藏!
- 合肥太阳能电池片表面缺陷检测-施努卡
- 第一次写需求文档的心酸历程
热门文章
- 肖星老师《一本书读懂财报》经典语句摘录(下)实战篇
- 华为matebook笔记本鸿蒙,聊聊鸿蒙对笔记本电脑行业的影响
- 计算机清单笔记本,2019吃鸡笔记本电脑配置清单,吃鸡高手给你分享
- linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计
- pandas的数据拼接与合并(concat、join、merge)
- 心态-《生活的艺术》书中的精髓:中国人享受生活,所以有着独特的生活的艺术,享受生活首先要有闲暇时光,也要去感受生活,才会体验到生活的乐趣
- Synaptics蠕虫木马分析
- 编程理念-程序基本编写IPO方法
- 【考】现代传感器技术作业一至四 复习用
- 华为注册“花瓣编程”,释放了什么信号?