Java旅行商问题知识点(含面试大厂题和源码)

旅行商问题(Travelling Salesman Problem,简称TSP)是组合优化中的一个经典问题。问题的目标是找到最短可能的路径,让旅行商从一个城市出发,经过所有其他城市恰好一次,然后回到起始城市。

TSP是一个NP-hard问题,这意味着目前没有已知的多项式时间算法可以解决所有实例。尽管如此,对于小规模的问题,可以通过穷举搜索(Brute Force)或者启发式算法(如动态规划、分支限界、遗传算法等)找到精确解。对于大规模问题,通常采用近似算法或者启发式搜索来找到近似解。

穷举搜索(Brute Force)

穷举搜索是解决TSP问题的一种直接方法,它尝试所有可能的路径组合,然后选择总距离最短的一条。这种方法的时间复杂度是O(n!),因为旅行商需要访问每个城市的排列,其中n是城市的数量。

动态规划

对于TSP问题,动态规划方法通常使用held-karp算法,该算法通过将问题分解为子问题,并存储子问题的解来避免重复计算。held-karp算法的时间复杂度是O(n^2 * 2^n)。

分支限界法

分支限界法是一种在解空间树上进行搜索的算法,它通过剪枝来避免搜索整个解空间。这种方法可以找到近似解,并且在实际应用中非常有效。

遗传算法

遗传算法是一种启发式搜索算法,它模仿自然选择的过程来生成问题的解。遗传算法通过迭代地选择、交叉、变异和替换候选解来寻找最优解。

源码实现 - 穷举搜索(Java):

import java.util.*;public class TSPBruteForce {private static final int INF = Integer.MAX_VALUE / 2;public static int tsp(int[][] distances, int n) {int[][] dp = new int[n][1 << n];int[] path = new int[1 << n];int result = INF;for (int i = 0; i < n; i++) {Arrays.fill(dp[i], INF);dp[i][1 << i] = 0;path[1 << i] = i;}for (int mask = 1; mask < (1 << n); mask++) {int lastCity = Integer.bitCount(mask) - 1;int currentCost = dp[lastCity][mask];if (currentCost >= result) continue;for (int nextCity = 0; nextCity < n; nextCity++) {if ((mask & (1 << nextCity)) == 0) {int newMask = mask | (1 << nextCity);int newPath[] = new int[newMask];System.arraycopy(path, 0, newPath, 0, newMask - (1 << nextCity));newPath[newMask - 1] = nextCity;int newCost = currentCost + distances[path[newMask - (1 << nextCity)]][nextCity];if (newCost < dp[nextCity][newMask]) {dp[nextCity][newMask] = newCost;path[newMask] = newPath;}}}}for (int i = 0; i < n; i++) {result = Math.min(result, dp[i][(1 << n) - 1]);}return result;}public static void main(String[] args) {int[][] distances = {{0, 10, 15, 20},{10, 0, 35, 25},{15, 35, 0, 30},{20, 25, 30, 0}};int n = 4;int result = tsp(distances, n);System.out.println("Minimum cost of TSP: " + result);}
}

在面试中,TSP问题可以用来评估应聘者的算法设计能力和问题解决技巧。通过实现TSP问题的解决方案,可以展示你对组合优化问题的理解和算法的掌握程度。希望这些知识点和示例代码能够帮助你更好地准备面试!旅行商问题(TSP)是算法面试中的一个高级问题,通常出现在大厂的面试中,用于评估应聘者解决复杂问题的能力。以下是三道可能出现在大厂面试中的与旅行商问题相关的编程题目,以及相应的Java源码实现。

题目 1:简单的旅行商问题

描述
给定一个城市列表和每对城市之间的距离,找到访问每个城市一次并返回起点的最短路径。

示例

输入: 城市间距离矩阵如下:
[[0, 10, 15, 20],[10, 0, 35, 25],[15, 35, 0, 30],[20, 25, 30, 0]
]
输出: 最短路径的总距离

Java 源码(使用穷举搜索):

import java.util.Arrays;public class SimpleTSP {public int shortestPath(int[][] distances) {int n = distances.length;int minDistance = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i != j) {int[] path = new int[n];int distance = 0;path[0] = i;for (int k = 0; k < n - 1; k++) {distance += distances[path[k]][j];path[k + 1] = j;j = (k + 1) % n;}distance += distances[path[n - 1]][i];if (distance < minDistance) {minDistance = distance;}}}}return minDistance;}public static void main(String[] args) {SimpleTSP solution = new SimpleTSP();int[][] distances = {{0, 10, 15, 20},{10, 0, 35, 25},{15, 35, 0, 30},{20, 25, 30, 0}};int result = solution.shortestPath(distances);System.out.println("Minimum distance of TSP: " + result);}
}

题目 2:近似旅行商问题

描述
给定一个城市列表和每对城市之间的距离,找到一个近似的最短路径,该路径访问每个城市一次并返回起点。

示例

输入: 城市间距离矩阵同上
输出: 近似最短路径的总距离

Java 源码(使用近似算法,如最小生成树):

import java.util.PriorityQueue;public class ApproximateTSP {public int approximatePath(int[][] distances) {int n = distances.length;PriorityQueue<int[]> pq = new PriorityQueue<>(n, (a, b) -> (a[0] - b[0]));for (int i = 0; i < n; i++) {pq.offer(new int[]{distances[0][i], i});}int[] path = new int[n];int totalDistance = 0;for (int i = 0; i < n - 1; i++) {int[] edge = pq.poll();totalDistance += edge[0];path[i] = edge[1];if (i < n - 2) {for (int j = 0; j < n; j++) {if (j != edge[1]) {pq.offer(new int[]{distances[edge[1]][j] + distances[j][edge[1]], j});}}}}totalDistance += distances[path[n - 2]][path[0]];return totalDistance;}public static void main(String[] args) {ApproximateTSP solution = new ApproximateTSP();int[][] distances = {{0, 10, 15, 20},{10, 0, 35, 25},{15, 35, 0, 30},{20, 25, 30, 0}};int result = solution.approximatePath(distances);System.out.println("Approximate minimum distance of TSP: " + result);}
}

题目 3:带时间窗口的旅行商问题

描述
给定一个城市列表、每对城市之间的距离,以及每个城市的时间窗口,找到访问每个城市一次并返回起点的最短路径,同时满足每个城市的时间窗口要求。

示例

输入: 城市间距离矩阵和时间窗口如下:
[[0, 10, 15, 20],[10, 0, 35, 25],[15, 35, 0, 30],[20, 25, 30, 0]
]
时间窗口:每个城市从0开始,持续24小时
输出: 满足时间窗口要求的最短路径的总距离

Java 源码(这个问题通常需要复杂的算法或启发式方法,这里提供一个简化的示例):

public class TimeWindowTSP {// 简化的示例,不考虑时间窗口的复杂性public int shortestPathWithTimeWindows(int[][] distances) {// 这里使用的是普通的穷举搜索,实际问题需要考虑时间窗口return shortestPath(distances);}// 调用之前的shortestPath方法
}// 其他代码与之前的示例相同

这些题目和源码展示了旅行商问题的不同类型的问题以及如何在实际编程中解决它们。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Modality-Aware Contrastive Instance Learning with Self-Distillation ... 论文阅读

Modality-Aware Contrastive Instance Learning with Self-Distillation for Weakly-Supervised Audio-Visual Violence Detection 论文阅读 ABSTRACT1 INTRODUCTION2 RELATEDWORKS2.1 Weakly-Supervised Violence Detection2.2 Contrastive Learning2.3 Cross-Modality Knowle…

读天才与算法:人脑与AI的数学思维笔记02_激发创造力

1. 心理创造力 1.1. 自我创造力的实现结果对个体来说可能是全新的&#xff0c;但纵观历史其实已算是“明日黄花”&#xff0c;这就是心理创造力的概念 2. 激发创造力 2.1. 理智是创造力最大的敌人 2.1.1. 巴勃罗毕加索&#xff08;P…

Jmeter 场景测试:登录--上传--下载--登出

为了练习Jmeter的使用&#xff0c;今天我要测试的场景是“登录--上传--下载--登出”这样一个过程. 测试的目标是我曾经练手写的一个文件分享系统&#xff0c;它要求用户只有登录后才可以下载想要的文件。 Jmeter总体结构&#xff1a; 第一步&#xff1a;添加HTTP Cookie管理器…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果&#xff0c;共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

电动汽车退役锂电池SOC主动均衡控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 仿真简介 模型选用双向反激变换器作为主动均衡拓扑电路&#xff0c;均衡策略采用基于SOC的主动均衡策略&#xff0c;旨在解决电动汽车退役锂电池的不一致性问题。模型选用双向反激变换器作为主动均衡拓扑电路…

pytorch Neural Networks学习笔记

&#xff08;1&#xff09;输入图像&#xff0c;13232&#xff0c;通道数1&#xff0c;高32&#xff0c;宽32 &#xff08;2&#xff09;卷积层1&#xff0c;滤波器的shape为6155&#xff0c;滤波器个数6&#xff0c;通道数1&#xff0c;高5&#xff0c;宽5。卷积层1的输出为62…

【介绍下负载均衡原理及算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

使用docker配置DSP-SLAM

一.Docker环境配置 1.简单介绍 –docker容器技术–。 简单理解&#xff1a;Anaconda用于隔离不同的python环境&#xff1b;docker可以理解成在你的机器里面安装了一个独立的系统&#xff0c;因此它可以隔离不同的CUDA环境&#xff0c;还有着独立的文件系统&#xff0c;防止别…

高级IO和5种IO模型

目录 1. 高级IO1.1 IO的基本概念1.2 OS如何得知外设当中有数据可读取1.3 OS如何处理从网卡中读取到的数据包1.4 IO的步骤 2. 五种IO模型2.1 利用钓鱼来理解2.2 阻塞IO2.3 非阻塞IO2.4 信号驱动IO2.5 IO多路转接2.6 异步IO 3. 高级IO的概念3.1 同步通信 VS 异步通信3.2 阻塞 VS …

k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法&#xff0c;主要用于数据聚类。其工作原理基于迭代优化&#xff0c;将数据点划分为K个集群&#xff0c;使得每个数据点都属于最近的集群&#xff0c;并且每个集群的中心&#xff08;质心&#xff09;是所有属于该集群的数据点的平均值。以下是…

STM32有什么高速接口吗?

STM32系列微控制器在高速接口方面也提供了一些强大的功能&#xff0c;虽然没有像Zynq那样的可编程逻辑部分&#xff0c;但有一些特性值得注意。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习嵌入式&#xff0c;不妨点…

【数据结构与算法】用两个栈实现一个队列

题目 用两个栈&#xff0c;实现一个队列功能 add delete length 队列 用数组可以实现队列&#xff0c;数组和队列的区别是&#xff1a;队列是逻辑结构是一个抽象模型&#xff0c;简单地可以用数组、链表实现&#xff0c;所以数组和链表是一个物理结构&#xff0c;队列是一个逻…

Go 单元测试基本介绍

文章目录 引入一、单元测试基本介绍1.1 什么是单元测试&#xff1f;1.2 如何写好单元测试1.3 单元测试的优点1.4 单元测试的设计原则 二、Go语言测试2.1 Go单元测试概要2.2 Go单元测试基本规范2.3 一个简单例子2.3.1 使用Goland 生成测试文件2.3.2 运行单元测试2.3.3 完善测试用…

easyexcel升级3.3.4失败的经历

原本想通过easyexcel从2.2.6升级到3.3.3解决一部分问题&#xff0c;结果之前的可以用的代码&#xff0c;却无端的出现bug 1 Sheet index (1) is out of range (0…0) 什么都没有改&#xff0c;就出了问题&#xff0c;那么问题肯定出现在easyexcel版本自身.使用模板填充的方式进…

conda新建环境报错An HTTP error occurred when trying to retrieve this URL.

conda新建环境报错如下 cat .condarc #将 .condarc文件中的内容删除&#xff0c;改成下面的内容 vi .condarc channels:- defaults show_channel_urls: true default_channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.…

权限管理Ranger详解

文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…

【Java NIO】那NIO为什么速度快?

Java IO在工作中其实不常用到&#xff0c;更别提NIO了。但NIO却是高效操作I/O流的必备技能&#xff0c;如顶级开源项目Kafka、Netty、RocketMQ等都采用了NIO技术&#xff0c;NIO也是大多数面试官必考的体系知识。虽然骨头有点难啃&#xff0c;但还是要慢慢消耗知识、学以致用哈…

# RAG | Langchain # Langchain RAG:打造Markdown文件的结构化分割解决方案

【文章简介】 在信息技术的现代背景下&#xff0c;高效地处理和分析文本数据对于知识获取和决策支持至关重要。Markdown文件因其易读性和高效性&#xff0c;在文档编写和知识共享中占据了重要地位。然而&#xff0c;传统的文本处理方法往往忽视了Markdown的结构化特性&#xff…

KNIME 国际化支持投票

你的投票也许能让 KNIME 中文化快一点点。 i18n 是个很搞笑的单词&#xff0c;它是英文 internationalization 国际化的缩写。18 指的是首字母i和末字母n中间有18个字母。另外还有什么 K8s 也是一样&#xff0c;中间省去了8个字母 ... 真是懒的可以。指北君还想起一个类似的笑话…

数字革命的先锋:Web3对社会的影响

引言 在信息技术飞速发展的当下&#xff0c;Web3作为一个新兴的互联网模式&#xff0c;正在逐渐改变我们的生活方式、商业模式和社会结构。本文将深入探讨Web3的核心特点、它在各个领域中的应用以及对社会产生的深远影响。 1. Web3的核心特点 1.1 去中心化 Web3强调去中心化…