开发者社区> 问答> 正文

通过有序航路点的最短路径

我正在尝试实现一种算法,该算法通过2d平面中的路点的有序列表来计算最短路径及其从当前位置到目标的关联距离。航路点由其中心坐标(x,y)和半径r定义。最短路径必须与每个路点圆周至少相交一次。这与其他路径优化问题有所不同,因为我已经知道必须跨越航路点的顺序。

在简单的情况下,连续的航路点是不同的且未对齐,可以使用连续的角度平分线解决。棘手的情况是:

当三个或更多连续的航路点具有相同的中心但半径不同时 当连续的航路点对齐从而一条直线穿过所有这些航路点时 这里是我的Python实现,它不处理对齐航点的精简版,并处理严重同心连续航点。我修改它是因为它通常可以在经度和纬度下工作,而不是在欧几里得空间中工作。

def optimize(position, waypoints): # current position is on the shortest path, cumulative distance starts at zero shortest_path = [position.center] optimized_distance = 0

# if only one waypoint left, go in a straight line
if len(waypoints) == 1:
    shortest_path.append(waypoints[-1].center)
    optimized_distance += distance(position.center, waypoints[-1].center)

else:
    # consider the last optimized point (one) and the next two waypoints (two, three)
    for two, three in zip(waypoints[:], waypoints[1:]):
        one = fast_waypoints[-1]

        in_heading = get_heading(two.center, one.center)
        in_distance = distance(one.center, two.center)
        out_distance = distance(two.center, three.center)

        # two next waypoints are concentric
        if out_distance == 0:
            next_target, nb_concentric = find_next_not_concentric(two, waypoints)
            out_heading = get_heading(two.center, next_target.center)
            angle = out_heading - in_heading
            leg_distance = two.radius
            leg_heading = in_heading + (0.5/nb_concentric) * angle
        else:
            out_heading = get_heading(two.center, three.center)
            angle = out_heading - in_heading
            leg_heading = in_heading + 0.5 * angle
            leg_distance = (2 * in_distance * out_distance * math.cos(math.radians(angle * 0.5))) / (in_distance + out_distance)


        best_leg_distance = min(leg_distance, two.radius)
        next_best = get_offset(two.center, leg_heading, min_leg_distance)
        shortest_path.append(next_best.center)
        optimized_distance += distance(one.center, next_best.center)

return optimized_distance, shortest_path

我可以看到如何测试不同的极端情况,但是我认为这种方法是不好的,因为也许还有其他我没有想到的极端情况。另一种方法是离散航路点周长并应用最短路径算法(例如A *),但效率极低。

所以这是我的问题:是否有更简洁的方法来解决这个问题?

展开
收起
被纵养的懒猫 2019-10-09 16:50:39 551 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载