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

Posted

技术标签:

【中文标题】有多个推销员的旅行推销员,每个推销员的城市数量有限制?【英文标题】:Travelling Salesman with multiple salesmen with a limit on number of cities per salesman? 【发布时间】:2016-08-28 01:27:24 【问题描述】:

问题:我需要将 (n) 名员工从办公室送到家中(坐标可用)。我有 (x) 7 座和 (y) 4 座出租车。

    我必须设计一种算法,让所有员工在行驶最短距离的同时将他们送到家中。

    此外,算法必须告诉我必须选择多少辆 7 座或/和 4 座车辆才能行驶最短距离。

例如。如果我有 15 名员工,那么算法可能会告诉我使用 1 辆(7 座)出租车和 2 辆(4 座)出租车,并且每个出租车中的员工如下:

[(E2, E4, E6, E8), (E1, E3, E5, E7, E9, E10, E12), (E11, E13, E14, E15)]

方法:我认为这是一个旅行推销员问题,有多个推销员,每个推销员可以旅行的城市数量有上限。销售人员也不需要回到原点。蚂蚁的殖民地问题浮现在我的脑海里,但我真的不能明智地选择选择哪种算法

要求:我真的需要算法。无论是 TSP 还是 Ant 的殖民地,都无所谓。我会欢迎意见,但我真的需要算法。

【问题讨论】:

计程车把所有人都丢了还得回办公室? 不,出租车不用回来 出租车必须满员吗,或者说 2 人可以乘坐 4 人座? 最短路径是第一优先,即使我们必须忽略最大占用率。 使用 7 人座更便宜吗?该算法应该为 28 个人向同一个方向提出什么建议? 【参考方案1】:

这是一个成本最小化问题,而不是旅行商问题。它与 TSP 相关,因为 TSP 是一个非常具体的成本最小化问题。

解决方案包括三个步骤:

    生成员工下车点(节点)列表

    创建不相交的不同路径,也不分支。这些将是您的路线,有助于防止浪费的路线重叠。使用 cost(path) = distance(furthest node and origin) + taxi_cost(nodes) + sum(distance between nodes) 比较路径和/或蛮力所有潜在网络。网络是路径的布局。不要分支路径!!

    总距离是防止浪费的一道防线,确保路线不会太长。 距离总和有助于算法收敛到许多员工居住的社区(如果可能)。 由于硬币问题的这种变体允许不完美的解决方案,它简化为Knapsack Problem 的变体。每辆出租车的效用是capacity。如果您还想选择最便宜的方式运送您的员工,utility(taxi) = capacity/cost。由此,我们最简单的解决方案是贪婪。谁在乎空的空间?如果您真的关心完美地填满出租车(而不是成本效益),那么您将需要一个更复杂的解决方案。您只需将最短距离指定为指标(每增加一辆出租车,成本就会增加)。我认为这是说“我不想付太多钱”的代理。 因此:taxi_cost(nodes) = math.floor(amount(nodes)/max(utility(taxis)+1)。该等式选择最便宜、最宽敞的出租车,并计算出完全服务于路线所需的出租车数量。 请务必将您检查的每个网络的成本计算为sum(cost(path)) 找到最便宜的网络服务后,对于所选网络中的每条路径: 制作前往最远节点的员工列表 为这些员工填写首选出租车 重复下一个最远的节点,直到出租车满员,然后将满员的出租车添加到列表中。如果您的员工用完,则您已完成为路线分配出租车。 (最远优先选择的好处是,如果该部分路线在办公室的街区内,您可以要求乘坐空载出租车的员工步行)。

上面的算法并不完美,但是会有很多可取的趋势。

路线将尽可能短并覆盖尽可能大的区域(不循环或分支) 路线倾向于为社区服务,而不是试图重叠职责。这部分算法不是最优的,但是是有效的。这使得移除服务路线变得非常容易,而无需重新计算交通网络。 所选择的出租车具有成本效益,有助于避免支付不必要的费用。 路线将使用尽可能少的出租车,同时考虑到升级到容量更大的宽敞出租车的相对成本 因为行驶最远的出租车会满员,如果您决定取消空车服务,对员工上班的能力影响较小。

接近完美的每一步所花费的成本都是上一步的许多倍,因此如果解决方案提供了理想的功能,那么收益递减是可以接受的。尽管该算法做出了一些潜在的次优权衡,但它们具有巨大的价值;您的出租车路线网络变得更容易修改。

如果您想制定最佳解决方案,Knapsack Problem、Coin Problem 和 Change-making Problem 可帮助您确定出租车和路线的成本。

Spanning Trees 是确定路线的最有效方法。以办公室为中心,计算每个分支的成本作为离办公室的最大距离。尽量保持各分行服务区域的高密度,以便于添加和删除出租车路线。

学习寻路可以帮助您了解如何确定好的成本函数,以便您可以在数值上比较不同的潜在路径。请记住,您的网络由一组路径组成,但需要其自己的成本函数,以便您可以比较不同的布局。

我为this answer 编写了深入的寻路指南。寻路文章很少,而且对于很多问题空间都没有足够的深度。如果您有多个优先级,一个好的成本函数可以为您提供近乎完美的解决方案。不幸的是,好的成本函数是特定领域的,因此您需要自己识别它们。如果您不确定如何创建具有某些特征的路径,请随时给我发消息,我会帮助您找出一个好的成本函数。

【讨论】:

你在这个答案上投入了很多。祝你好运。 谢谢。您的回答给了我继续研究的方向。几天后我会给你赏金,除非有更好的答案。【参考方案2】:

这是一个约束满足问题,而不是真正的 TSP。如果您正在寻找一个可以帮助您的项目,您可以查看 cspdb,这是我前段时间写的:

https://github.com/gtoonstra/cspdb

您将在后端使用一个数据库来维护状态,并用它自己的语法编写几个脚本来操作该状态。包含几个示例来解决具有多种约束的学生和课堂调度问题。

【讨论】:

【参考方案3】:

list d destinations,您可以创建array of pairwise travel costs c。其中 c[a,b] 是从 a 到 b 的旅行费用...

现在你有了一个起点 p。将 p 的数组 c2 值添加到 d 中的每个点。

所以你现在有了组的概念。

您可以将其视为一种贪心算法。给定列表 c2,您可以根据您所在的州采取最便宜的选择。

您的状态是所有 cab 向量的向量(从他们所在的地方到他们接下来可以去的地方的成本)。* 分配向量,其中 k == 0 for k in the。您会找到给定您所在州的最小选项(考虑在 4 人驾驶室中增加另一个繁重的成本,4 人驾驶室和 7 人驾驶室之间的差异以及在零人驾驶室中增加一个人或添加一个新驾驶室也是有成本的。将所有人员分配到他们的出租车后,您就有了答案。

贪心算法的思想最常以背包问题为特征,但也可以用于特征选择等统计方法。

与@Aaron3468 一样,这种方法并不完美,也不能保证最佳解决方案。

如果您想要the best possible solutions,您可以遍历所有组合,但这很快就会变得不切实际。

【讨论】:

【参考方案4】:

在我看来,您的算法应该解决 2 个问题:每种类型的汽车数量和最短距离(如何给员工编号取决于您,或者您应该提供更多详细信息)。抱歉,我正在使用手机,我没有该网站的所有功能。

对于您可以使用以下算法的汽车数量。要解决与距离相关的问题,您应该提供有关路径及其长度的更多信息。然后可以将图形算法与此结合使用来解决问题。这里 11=7+4。

Begin

Integer temp:= n/11
Integer rem:= n mod 11
If rem=0

    x:=temp
    y:=temp

Else if rem<=4

    x:=temp
    y:=temp+1

Else if rem<=7

    x:=temp+1
    y:=temp

Else

    x:=temp+1
    y:=temp+1

Endif

End

【讨论】:

以上是关于有多个推销员的旅行推销员,每个推销员的城市数量有限制?的主要内容,如果未能解决你的问题,请参考以下文章

具有约束和可选城市的类似旅行推销员的问题

遗传算法 - 旅行推销员

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

回溯法解旅行商问题(TSP)

R语言旅行推销员问题TSP

旅行推销员建设性启发式