求解旅行商(货郎担)问题的五种方法
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 ...
最新文章
- ct检查床的移动精度是指_炮塔铣床、数控铣床导轨平行度(扭曲)的检验
- Brainfuck解释器(C#)
- Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O
- Delphi String的散漫记录,真是知识无数,陷阱无数(转)
- js图片加载效果(延迟加载+瀑布流加载)
- 科研|我最煎熬的学术时刻,是耗时3年完成了一篇论文
- Machine Learning Notes Ⅲ
- c++ 时间戳 转换成时间_区块链世界的公证人:时间戳
- 《从零开始学Swift》学习笔记(Day 39)——构造函数重载
- 关闭进程_Xbox Game Bar重磅更新:可不离开游戏关闭系统进程
- 基于ffmpeg的kxmovie的使用
- 大数据产业发展状况及企业数据资产化运营核心
- 江西省萍乡市谷歌高清卫星地图下载
- ORACLE 11G利用 ORDS+pljson来实现json_table 效果
- 算法复杂度的计算方法
- prisma 连接不上Postgres
- matplotlib默认字体设置探索
- HCTF 2017 bin Level1 Evr_Q Writeup
- 自动控制原理 第一章 控制系统的一般概念
- 微信支付链接二维码生成