[英]Travelling Salesman with multiple salesmen with a limit on number of cities per salesman?
问题:我需要从办公室下降(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)]
方法:我认为这是一个旅行推销员问题,有多个推销员,每个人都可以旅行的城市数量上限。 销售人员也不需要回到原点。 我想到了Ant的殖民地问题,但我无法明智地选择哪种算法可供选择
要求:我真的需要ALGORITHM。 无论是TSP还是Ant的殖民地,都无关紧要。 我会欢迎意见,但我真的需要算法。
这是成本最小化问题,而不是旅行商问题。 它与TSP有关,因为TSP是一个非常具体的成本最小化问题。
解决方案包括三个步骤:
创建不相交的不同路径, 也不创建分支 。 这些将是您的路线,并有助于防止浪费的路线重叠。 使用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))
上面的算法并不完美,但它会有许多理想的倾向。
接近完美的每一步都比前一步花费了许多倍,因此如果解决方案提供了理想的功能,则可以接受减少的回报。 尽管该算法进行了一些潜在的次优权衡,但它们具有巨大的价值; 您的出租车路线网络变得更容易修改。
如果您想制定最佳解决方案, 背包问题 , 硬币问题和变更问题有助于确定出租车和路线的成本。
生成树是确定路线的最有效方法。 将生成树置于办公室中心,并将每个分支的成本计算为距离办公室的最大距离。 尽量保持每个分支服务区域的高密度,以便更容易添加和删除出租车路线。
研究寻路可以帮助您学习如何确定良好的成本函数,以便您可以在数字上比较不同的潜在路径。 请记住,您的网络由一组路径组成,但需要自己的成本函数,以便您可以比较不同的布局。
我已经为这个答案写了一篇深入的寻路指南。 寻路文章很少,只是没有深入到很多问题空间。 如果您有多个优先级,良好的成本函数可以为您提供近乎完美的解决方案。 不幸的是,良好的成本函数是特定于域的,因此您需要自己识别它们。 如果您不确定如何制作具有某些特征的路径,请随时给我发消息,我会帮您找出一个好的成本函数。
这是一个约束满足问题,而不是真正的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.