trdytdd 2022-07-10 16:36 采纳率: 0%
浏览 214

关于#送外卖#的问题,如何解决?

一个送外卖的男孩有一系列的订单要送。这些订单的目的地用
坐标{𝑝1, 𝑝2, … , 𝑝𝑛}来表示,p𝑖 = (𝑥𝑖, 𝑦𝑖)。假设 x 坐标是严格递增的,即
𝑥1 < 𝑥2 < ⋯ 𝑥𝑛。外卖店的位置在𝑝1,并且送外卖的路线满足两个约束条
件:首先按照 x 坐标递增的顺序送外卖,然后按照 x 递减的顺序送外卖
并且最终回到外卖店。假设已有函数 dist(i,j)用来计算p𝑖和pj之间的距离,请给出计算最短外卖路线的算法。

img

  • 写回答

1条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-07-10 18:30
    关注

    假设订单目的地坐标按照x坐标递增的顺序组成列表(或数组)[p1, p2, p3, ...,pn-1, pn],那计算路线距离就相当于从列表中挑出p1到pn的不同点,加上列表中剩下的点之间的距离之和。
    举个例子,例子中输出的结果,相当于从上面的列表中挑出了p1, p2, p6, p7, p8, p10,则送买卖的距离之和为dist(p1,p2)+dist(p2,p6)+dist(p6,p7)+dist(p7+p8)+dist(p8,p10),用distA表示。而剩下的点加上外卖店和最远点,为p1, p3, p4, p5, p9, p10,代表返回外卖店的距离是dist(p1,p3)+dist(p3,p4)+dist(p4,p5)+dist(p5+p9)+dist(p9,p10),用distB表示。
    所以,题目可以转化成,从列表中挑出哪些点,得到的distA+distB最短。所有的可能性是2的n-2次方,逐个比较即可。
    下面是以python为例,找出所有可能路线的递归解法:

    def findpath(loc,path):
        if len(loc)==0: return [path]
        all_path = []
        for i in range(len(loc)):
            all_path += findpath(loc[i+1:],path+[loc[i]])
        return all_path
    
    p = [1,2,3,4,5,6,7,8,9,10]
    all_path=findpath(p[1:],[1])
    
    评论

报告相同问题?

问题事件

  • 创建了问题 7月10日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog