繁体   English   中英

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

[英]Travelling Salesman with multiple salesmen with a limit on number of cities per salesman?

问题:我需要从办公室下降(n)的员工家园(坐标可用)。 我有(x) 7座和(y) 4座驾驶室。

  1. 我必须设计一种算法,让所有员工在最短距离内离开家。

  2. 此外,该算法必须告诉我必须选择多少7座或/和4座车辆以便行驶最小距离。

例如。 如果我有15名员工,那么算法可能会告诉我使用1(7座)驾驶室和2(4座)驾驶室并让每个驾驶室的员工如下:

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

方法:我认为这是一个旅行推销员问题,有多个推销员,每个人都可以旅行的城市数量上限。 销售人员也不需要回到原点。 我想到了Ant的殖民地问题,但我无法明智地选择哪种算法可供选择

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

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

解决方案包括三个步骤:

  1. 生成员工下车点(节点)列表
  2. 创建不相交的不同路径, 也不创建分支 这些将是您的路线,并有助于防止浪费的路线重叠。 使用cost(path) = distance(furthest node and origin) + taxi_cost(nodes) + sum(distance between nodes)来比较路径和/或强制所有潜在网络。 网络是路径的布局。 不要分支路径!

    • 总距离是防止浪费的一道防线,确保路线不会太长。
    • 距离总和有助于算法汇聚于许多员工居住的社区(如果可能)。
    • 因为硬币问题的这种变化允许不完美的解决方案,所以它简化为背包问题的变体。 每辆出租车的实用性都是capacity 如果您还希望选择最便宜的方式来运送您的员工, utility(taxi) = capacity/cost 由此我们最简单的解决方案是贪婪; 谁在乎空旷空间? 如果您真的非常关心完全填写出租车(而不是经济有效),那么您需要一个更复杂的解决方案。 您只需将最小距离指定为指标(每增加一次出租车乘以成本)。 我认为这是代表'我不想付出太多'。 因此: taxi_cost(nodes) = math.floor(amount(nodes)/max(utility(taxis)+1) 。这个等式选择最便宜,最宽敞的出租车,并计算出完全服务路线所需的数量。
    • 务必将您检查的每个网络的成本计算为sum(cost(path))
  3. 找到最便宜的网络后,对于所选网络中的每条路径:
    • 列出前往最远节点的员工列表
    • 与这些员工一起填写首选出租车
    • 重复下一个最远的节点,直到你有一辆完整的出租车,然后将装满的出租车添加到列表中。 如果您的员工用尽,您已完成为该路线分配出租车。 (最远的第一选择的好处是,如果路线的那部分位于办公室的区域内,您可以要求未填充的出租车的员工走路)。

上面的算法并不完美,但它会有许多理想的倾向。

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

接近完美的每一步都比前一步花费了许多倍,因此如果解决方案提供了理想的功能,则可以接受减少的回报。 尽管该算法进行了一些潜在的次优权衡,但它们具有巨大的价值; 您的出租车路线网络变得更容易修改。

如果您想制定最佳解决方案, 背包问题硬币问题变更问题有助于确定出租车和路线的成本。

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

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

我已经为这个答案写了一篇深入的寻路指南。 寻路文章很少,只是没有深入到很多问题空间。 如果您有多个优先级,良好的成本函数可以为您提供近乎完美的解决方案。 不幸的是,良好的成本函数是特定于域的,因此您需要自己识别它们。 如果您不确定如何制作具有某些特征的路径,请随时给我发消息,我会帮您找出一个好的成本函数。

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

https://github.com/gtoonstra/cspdb

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

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

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

所以你现在有了群体的概念。

您可以将其视为贪婪算法。 鉴于列表c2,您可以选择最适合您州的选项。

你的状态是所有你驾驶矢量的矢量(从它们到达下一个地方的成本)。*赋值向量,其中k == 0表示k。 你找到了你所在国家的最低选择(考虑增加另一个繁重的4成本驾驶室,4人驾驶室和7人驾驶室之间的差异,并将人员添加到零人驾驶室或添加新驾驶室也有成本。一旦所有人都被分配到他们的出租车,你就有了答案。

贪婪算法的概念通常以背包问题为特征,但也可以用于诸如特征选择之类的统计方法。

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

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

从我的角度来看,你的算法应该解决两个问题:每种类型的汽车数量和最短距离(你的员工编号取决于你或你应该提供更多细节)。 对不起,我正在使用手机,但我没有网站的所有功能。

对于您可以使用以下算法的汽车数量。 要解决与距离相关的问题,您应该提供有关路径及其长度的更多信息。 然后可以将图算法与此组合以执行该技巧。 这里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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM