旅行商问题(TSP)概述
旅行商问题(TSP)概述
1. TSP问题的复杂性
定义:旅行商问题(Traveling Salesman Problem, TSP)是给定一系列城市及其之间的距离,要求找到一条最短路径,使得旅行商从某个城市出发,经过每个城市恰好一次并返回到起点城市。
复杂性分析:
- TSP是一个NP-hard问题,这意味着目前没有已知的多项式时间算法可以解决所有实例。
- 随着城市数量的增加,可能的路径组合呈指数增长。例如,对于n个城市,可能的路径数为(n-1)!/2。
- 因此,对于较小的城市数(通常n ≤ 20),可以使用暴力搜索或动态规划方法;对于较大的城市数,常用启发式或近似算法。
2. 贪心法的主要思路和求解步骤
贪心法简介:
贪心算法通过每一步选择中都采取当前状态下最好或最优的选择,从而希望得到全局最好或最优解。
求解步骤:
- 初始化:选择一个起始城市作为当前城市,并将其标记为已访问。
- 选择下一个城市:在未访问城市中选择与当前城市距离最短的城市,并移动到该城市。
- 重复:继续选择下一个城市,直到所有城市都被访问过。
- 返回起点:最后从最后一个城市返回起始城市,完成环路。
3. 两种贪心法求解TSP的近似算法
算法1:最近邻点算法
步骤:
- 从起始城市出发,标记为已访问。
- 在未访问的城市中选择距离当前城市最近的城市,并移动到该城市。
- 重复步骤2,直到所有城市均已访问。
- 返回起始城市。
上代码
#include<bits/stdc++.h>
using namespace std;
const int MAX = 10; // 最大城市数量
double dist[MAX][MAX]; // 城市距离矩阵
bool visited[MAX]; // 标记是否访问过
// 找到最近的未访问城市
int findNearestCity(int current, int n) {
double minDist = numeric_limits<double>::max();
int nearestCity = -1;
for (int i = 1; i <= n; ++i) {
if (!visited[i] && dist[current][i] < minDist) {
minDist = dist[current][i];
nearestCity = i;
}
}
return nearestCity;
}
// 实现最近邻算法
vector<int> nearestNeighbor(int start, int n) {
vector<int> path;
fill(visited, visited + n, false);
int current = start;
visited[current] = true;
path.push_back(current);
for (int i = 1; i < n; ++i) {
current = findNearestCity(current, n);
visited[current] = true;
path.push_back(current);
}
path.push_back(start); // 返回起点
return path;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
cin >> dist[i][j];
}
}
vector<int> path = nearestNeighbor(1, n);
cout << "最近邻算法路径: ";
for (int city : path) {
cout << city << " ";
}
cout << endl;
return 0;
}
算法2:贪婪插入算法
步骤:
- 初始化一个路径,包括任意两个城市。
- 每次从未访问城市中选择一个城市,插入到当前路径中的最佳位置,以使得路径长度最小。
- 重复步骤2,直到所有城市均已访问。
- 返回起始城市。
上代码
#include<bits/stdc++.h>
using namespace std;
vector<int> greedyInsertTSP(const vector<vector<int>>& distanceMatrix) {
int n = distanceMatrix.size();
vector<bool> visited(n, false);
vector<int> path;
int currentCity = 0;
visited[currentCity] = true;
path.push_back(currentCity);
for (int i = 1; i < n; ++i) {
// 找到最近的未访问城市
int nearestCity = -1;
int minDistance = numeric_limits<int>::max();
for (int j = 0; j < n; ++j) {
if (!visited[j] && distanceMatrix[currentCity][j] < minDistance) {
minDistance = distanceMatrix[currentCity][j];
nearestCity = j;
}
}
// 插入最近的城市到路径中
path.push_back(nearestCity);
visited[nearestCity] = true;
currentCity = nearestCity;
}
// 完成循环,返回起始城市
path.push_back(path[0]); // 返回到起始城市
return path;
}
int main() {
int n;
cin >> n;
vector<vector<int>> distanceMatrix(n, vector<int>(n));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> distanceMatrix[i][j];
}
}
vector<int> result = greedyInsertTSP(distanceMatrix);
for (int city : result) {
cout << city << " ";
}
cout << endl;
return 0;
}
4. 解的对比分析
- 效率:
- 最近邻算法简单易实现,但可能会陷入局部最优。
- 贪婪插入算法相对复杂一些,通常能提供更好的近似解,因为它考虑了整体路径的影响。
- 解的质量:
- 最近邻算法的路径通常较短,但不一定是最优解。
- 贪婪插入算法通过插入策略,可以获得更接近实际最优解的路径。
- 时间复杂度:
- 最近邻算法的时间复杂度为O(n^2)。
- 贪婪插入算法的时间复杂度为O(n^2),但由于需要查找最佳插入位置,实际时间可能略高于最近邻算法。
旅行商问题(TSP)概述的更多相关文章
- 【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...
- 遗传算法解决旅行商问题(TSP)
这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...
- 07_旅行商问题(TSP问题,货郎担问题,经典NPC难题)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P61 问题9: 问题描述:有n(n<=15)个城市,两两之间均有道路直接相连,给出每两个城市i和j之间的道路长度L[i][j],求 ...
- 禁忌搜索算法TSA 旅行商问题TSP python
import math import random import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot ...
- 三进制状态压缩DP(旅行商问题TSP)HDU3001
http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others) ...
- hdu 2224 双调欧几里得旅行商问题tsp
/* 题意:平面上n个点,确定一条连接各点的最短闭合旅程且每个点仅用一次.这个解的一般形式为NP的(在多项式时间内可以求出) 建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从 ...
- 回溯法 | 旅行商问题(TSP问题)
学习链接: 回溯法解旅行商问题(TSP).贪心算法:旅行商问题(TSP) 今天早上做了无数个梦,然后被紧紧地吸附在床上.挣扎一番后爬起来,已经是9点了.然后我开始研究旅行商问题. 在一个无向图中找到一 ...
- 蚁群算法求解TSP问题
一.蚁群算法简介 蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知 ...
- C/C++贪心算法解决TSP问题
贪心算法解决旅行商问题 TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出.问题描述如下: 有若干 ...
- OI总结(垃圾排版就忽略了吧)
学OI一年了,到现在联赛所需要的知识已经基本学完了.现在,有必要回过头来,总结总结自己一年来学到的知识以及得到的经验教训. 基础 语言基础 C++的语言基础啥的就略了吧. 算法复杂度分析 O:复杂度的 ...
随机推荐
- Linux之轨迹记录(script)
使用命令: script 编辑文件: vim /etc/profile 在最后一行添加命令 if [ $UID -ge 0 ]; then exec /usr/bin/script -t 2>/ ...
- 2023-05 多校联合训练 ZJNU站 正式赛
Scarlett的三元组 有一个长度为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\),试问有多少个三元组 \((a_i,a_j,a_k)\) 满足: \(1 \le i \lt j ...
- 逆向WeChat(八)
上一篇逆向WeChat(七)是逆向微信客户端本地数据库相关事宜. 本篇逆向微信客户端本地日志xlog相关的事宜. 本篇在博客园地址https://www.cnblogs.com/bbqzsl/p/18 ...
- Codeforces Round 960 (Div.2)
A 非常容易观察到性质,注意 Alice 为先手,发现当 \(a_{\max}\) 的个数为奇数时显然能 win,但如果 \(a_{\max}\) 的个数为偶数且有一个数具有奇数个可以作为跳板,那么也 ...
- 【并查集+dfs】codeforces 1833 E. Round Dance
题意 输入一个正整数 \(T(1 \leq T \leq 10^4)\),表示接下来输入 \(T\) 组测试用例,对于每一个测试用例: 第一行,输入一个正整数 \(n(2 \leq n \leq 2 ...
- WebP图片使用踩坑
前情 WebP是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,最初在2010年发布,目标是减少文件大小,相较于传统的 PNG.JPG,甚至是动图 GIF 的格式,WebP 比它们的空间更 ...
- 腾讯云TKE-PV使用COS存储案例:容器目录权限问题
背景 在TKE的集群中创建工作负载并把某一个对应的cos桶的根目录挂载到/data目录,在镜像构建的时候有把/data目录设置权限为755,但是运行容器后成功挂载cos桶的根目录到/data/目录,发 ...
- Qt编写物联网管理平台39-报警联动
一.前言 本系统支持报警联动,就是某个探测器报警后,再去下发命令,通知下面的继电器警号,一般是通过串口发送,由于现场会利用现有的串口线路比如485总线,所以本系统需要做特殊处理,就是公用485通信总线 ...
- Qt编写安防视频监控系统39-onvif图片参数
一.前言 通过onvif来调整图片的Brightness(亮度).ColorSaturation(色彩饱和度).Contrast(饱和度)这三个参数,可以实时观测到监控画面对应的变化,比如讲亮度Bri ...
- [转]CLion安装及无限试用
Clion安装及无限试用:链接:https://pan.baidu.com/s/1mreUx5QyS4nkVQMOhdjf7g提取码:ylqw 翻译 搜索 复制