Python 寻找方向以最大化间隙
我有多个点代表x,y平面上的障碍物。对于该环境中的给定点,我如何确定哪个方向将最大化我的间隙 例如,在下图中,有3个点障碍物(黑色),我想移动的点可以获得最大的间隙(红色)。箭头是它应该移动的方向,以便最快地最大化它与所有其他点的间隙Python 寻找方向以最大化间隙,python,algorithm,matlab,geometry,Python,Algorithm,Matlab,Geometry,我有多个点代表x,y平面上的障碍物。对于该环境中的给定点,我如何确定哪个方向将最大化我的间隙 例如,在下图中,有3个点障碍物(黑色),我想移动的点可以获得最大的间隙(红色)。箭头是它应该移动的方向,以便最快地最大化它与所有其他点的间隙 对于单个障碍来说,这是微不足道的,但我真的不知道如何处理多个障碍。我认为解决问题的一个好办法是定义一个成本函数,如 f(red_pt, black_pts)=sum_i norm2(black_pts[i]-red_pt) 并将其最大化。一个快速而肮脏的解决方
对于单个障碍来说,这是微不足道的,但我真的不知道如何处理多个障碍。我认为解决问题的一个好办法是定义一个成本函数,如
f(red_pt, black_pts)=sum_i norm2(black_pts[i]-red_pt)
并将其最大化。一个快速而肮脏的解决方案是使用梯度上升,例如
为了更快地收敛,也就是说,在使到黑点的距离最小化的方向上更快地移动,可以使用二阶优化算法,例如。一旦定义了成本函数,找到更快增加距离的方向就是选择好的优化方法和超参数的问题
动画,它看起来像这样:
如何定义间隙?红色箭头似乎是一个奇怪的解决方案。对于第一个像素,到右侧黑色像素的距离正在减小。@Ash,目标是朝着一个最快的方向移动,以最大化从红色点到所有其他点的距离。您尝试过什么,做过任何研究吗?我认为这太宽泛/模糊了。您的代码似乎在绘制某些东西。。。你打算分享这张图片吗?@MarkSetchell这些图只是用来说明梯度上升过程中优化参数(红点)的演变。分享个人图片没有多大意义。我认为最好的方法是复制粘贴并运行代码。我添加了一个动画。我希望你不介意。如果你愿意,可以随意删除它。我只是用类似于
plt.savefig(f“f-{I:03}.png”)
的东西替换了你的plt.show()
,然后让它运行。最后,我用ImageMagick制作了一个动画GIF,带有magick-delay 80 f-*png-loop 0 animated.GIF
噢,我也使用plt.ylim(2,11)
import matplotlib.pyplot as plt
import numpy as np
def toy_problem():
x=np.array([
[10,5],
[3,4],
[5,10]]).astype("float")
init_pt=np.array([[6,5]]).astype("float")
return x, init_pt
def cost_function(x, black_pts):
s=0
jacobian=np.zeros([1,2])
for i in range(black_pts.shape[0]):
a=x[0,0]-black_pts[i,0]
b=x[0,1]-black_pts[i,1]
nrm2=a**2+b**2
jacobian[0,0]+=2*a
jacobian[0,1]+=2*b
s+=nrm2
return s, jacobian
def gradient_ascent(x, cost_function, black_pts,num_it=20):
lr=1e-2
for i in range(num_it):
val, jacobian=cost_function(x,black_pts)
x=x+lr*jacobian
plt.plot(black_pts[:,0],black_pts[:,1],"k*");
plt.plot(x[0,0],x[0,1],"r*");
plt.show()
return x
if __name__=="__main__":
black_pts,init_pt=toy_problem()
x_final=gradient_ascent(init_pt,cost_function,black_pts)