旅行推销员/车辆路线用例的最佳实现

Posted

技术标签:

【中文标题】旅行推销员/车辆路线用例的最佳实现【英文标题】:best possible implementation of the travelling salesman / vehicle routing use case 【发布时间】:2016-02-08 23:10:05 【问题描述】:

我最近在面试中遇到一个案例,要求解决的用例属于旅行商问题/车辆路线问题。我能够告诉他们实际的问题是什么以及问题中涉及的数学。我确实解释了如何使用 Hadoop 的 MapReduce 范例部分来解决下面提到的用例。 (解释了多个 map reduce 作业将如何解决该问题)使用 Jimmy Lin 和 Chris Dyer 的《Data-Intensive Text Processing with MapReduce》一书中提到的图形算法。

出于好奇,我对 google 进行了一些研究,我可以看到已经针对不同风格的这个问题进行了大量的实施和研究。 我被问到的问题有以(x,y)格式提到的城市坐标,我在谷歌上看到的许多解决方案都考虑了其他一些因素,如单位距离、负/正测量单位等。所以简而言之,我做了更多的研究和阅读,我变得更加困惑。

我的问题是针对以下用例可能的解决方案以及其中的最佳解决方案。如果一些有经验的人可以对此有所了解,这将有助于消除我的困惑并以更好的方式理解解决方案。或者如果有人可以指导我走向正确的方向(这样我在探索整个解决方案的海洋时就不会更加困惑)

面试中询问的用例:

一家公司正在努力寻找可能的最佳解决方案,以服务其拥有 12 名员工的 300 名客户群。 他们需要一种技术解决方案,能够说明随着业务的增长以及其他变化(例如客户位置更改、添加的新位置等),他们将如何满足客户需求。

问题基本上是旅行商问题 (TSP) 或车辆路线问题 (VSP) 的一种形式。下面的事情需要在这里完成。

起始坐标为(0,0),城市坐标示例如下。 以下是在文本文件中作为输入提供的工作解决方案的坐标:

X coordinate    Y Coordinate 
420 278 
421 40 
29  178 
350 47 
298 201 
417 186 
378 134 
447 239 
42  114 
45  199 
362 195 
381 243 
429 1 
338 209 
176 9 
364 26 
326 182 
500 129 
190 51 
489 103 
368 142 
132 260 
305 200 
446 137 
375 154 
440 190 
9   118 
437 32 
383 266 

    什么是处理这个 NP 难题的正确方法,或者如果不正确 方式可以是不同的方法,它们的优点/缺点。

    由于它更多的是基于分析的问题,因此可以进行某种可视化 做来解决这个问题。喜欢一些图表或使用 R/分析工具

如果您需要更多详细信息,或者您可以建议我在哪里阅读和理解更多信息,请告诉我。

提前致谢

【问题讨论】:

我不是您要找的专家,因此我不敢发布这个过于简单的评论作为答案。基本上,您可以描述坐标之间的路径,然后找到哈密顿循环。许多常见的库可以计算这些周期,例如igraph(虽然我不知道 hadoop)。 This question 指的是java中的一个解决方案。希望对您有所帮助。 员工人数可能暗示他们希望讨论多个营业地点。 best possibleoptimal 需要一个目标和一些成本函数。 【参考方案1】:

没有解决 NP 问题的正确方法。由于复杂性是指数级的,因此除了琐碎的示例之外,其他任何事情都需要很长时间。

但是,有些近似值可以非常接近真实答案,并且可能对您的应用程序足够好(例如,它不是最短路径,但在它的某个相对范围内)。

查看wikipedia page。他们甚至有一些例子。

【讨论】:

据我了解,topic started有mTSP问题。 (m - 多个)并且这个推销员从不同的点开始(例如从他们的家或家庭办公室)。在这种情况下,我们绝对不会谈论与我们这个问题的规模有关的最佳解决方案,并且需要一些近似值。 Wiki 页面仅包含或多或少的经典公式/解决方案。 我已经清楚地说明了你想说的话。我的问题是任何人都可以在这里提出最好的解决方案。【参考方案2】:

如果我在面试时问这个问题 - 我会提出类似 paper 中描述的内容,看起来最适合您的任务表述。在本文中,您将找到优化的近似方法来解决所有销售人员从一个点开始的多个销售人员问题。如果我们通过从特定推销员的家庭/家庭办公室开始解决每个单个旅行推销员子问题(聚类将主要问题划分为经典问题)来知道员工离开哪里,则可以采用这种方法。

如果我们将地点图作为输入,而不仅仅是坐标 - 我们可以将 k-means 替换为像 MCL 这样的图聚类算法。

【讨论】:

其他答案的评论与上述相同,您能否建议对问题的回答而不是建议对问题进行修改然后回答 “一家公司正在努力寻找可能的最佳解决方案,为 12 名员工的 300 名客户群提供服务” + 提到它是 TSP 的变体。我们有多个“推销员”,他们是公司的员工。从逻辑上讲,它们拥有一个或多个“家庭办公室”。他们需要根据 TSP 的模型访问点。因此,我们有经典的 mTSP 问题或 mTSP,根据您的描述,销售人员的起点不同。这只是一个被问到的问题。 +如果输入是距离(不是坐标) - 我建议将 MCL 用于图形。我没有建议对问题定义进行任何修改。 @user1188611 一般来说 - 我真的不明白你的评论。它只是为您的问题选择的正式版本,为您提供相关论文。顺便说一句,幸运的是,这个强大的公式 (mTSP) 完全符合您的描述:)【参考方案3】:

确实,正如 Dmitry 所说,这是一个多旅行推销员问题的案例。 由于 NP 难,面试官自然会寻找你提出启发式优化算法的建议。

我认为这种情况下的关键是他们正在寻找一种能够实时更新目的地数量和位置变化的算法。蚁群优化(粒子群优化的一种形式)实际上最初是为旅行商问题制定的,请参阅论文和***:

https://en.wikipedia.org/wiki/Ant_colony_optimization_algorithms

“M. Dorigo、V. Maniezzo 和 A. Colorni,Ant 系统:由合作代理群体优化,IEEE Transactions on Systems, Man, and Cyber​​netics-B 部分,第 26 卷,第 1 期,第 29 页-41, 1996。”

这已经被推广到多旅行推销员问题,例如这篇论文(开源)中的一些不错的工作:

http://www.researchgate.net/publication/263389346_Multi-type_ant_colony_system_for_solving_the_multiple_traveling_salesman_problem

在面试情况下,我会详细说明它的优点: 1. 是一种有效的启发式解决方案; 2. 能够实时更新图表中的两种变化; 3. 对于奖励点,我提到,一旦在计算机中获得了相当有效的解决方案,in silico,司机自己可以以稍微概率的方式分配路线,随后可以执行由真实数据驱动的优化。

缺点是,与 Dmitry 建议的首先减少搜索空间的问题相比,可能需要相当大的处理能力。其次,如果他们希望你真正拟定一个逻辑,这在面试中可能会非常具有挑战性。

有趣的问题:)

【讨论】:

你给了我我在上面的问题中提出的英文版本。我的问题清楚地表明你是否可以建议不同的方法来解决问题而不是不同的方法来回答我不知道的问题。【参考方案4】:

我不是专家,但你不能只计算原点和所有其他点之间的距离并找到最近的点,然后对该点重复该过程直到你覆盖所有点吗?

【讨论】:

没有。对于某些示例,您可能会得到可怕的结果。你最终可能会在同一个点前后来回走动,只是因为下一个点比对面的点远一点。 你能不能只计算所有可能的路径并选择距离最短的路径? 是的,但是您有n! 可能的路径。 那么我猜你将不得不通过使用多个线程来“拆分工作”,每个线程都计算第三个动作的可能性。我从第三个开始说,因为为不同的线程划分工作会更容易。此外,一旦路径超过目前为止的最小距离,您应该停下来继续下一条路径。 当然。假设您有一台 128 核的庞大服务器,仅用于此目的。他们你要看看n! / 128。15! = 1'307'674'368'000 或 1.3 万亿个要检查的东西。如果您每秒检查 100 万次,您仍然需要等待 15 天才能完成。如果您只添加一个目的地,则需要等待 240 天才能完成。您无法将其优化到足以覆盖 100 个目的地(而 100 在许多情况下是一个很小的数字)。

以上是关于旅行推销员/车辆路线用例的最佳实现的主要内容,如果未能解决你的问题,请参考以下文章

在遗传算法中为多个“推销员”TSP 实现交叉函数

优化旅行推销员算法(时间旅行者算法)

旅行推销员将贬值物品运送到不同的市场

有多个推销员的旅行推销员,每个推销员的城市数量有限制?

遗传算法 - 旅行推销员

scipy 中的旅行推销员