我正在尝试实现一种算法,该算法通过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 *),但效率极低。
所以这是我的问题:是否有更简洁的方法来解决这个问题?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。