Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 寻找方向以最大化间隙_Python_Algorithm_Matlab_Geometry - Fatal编程技术网

Python 寻找方向以最大化间隙

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) 并将其最大化。一个快速而肮脏的解决方

我有多个点代表x,y平面上的障碍物。对于该环境中的给定点,我如何确定哪个方向将最大化我的间隙

例如,在下图中,有3个点障碍物(黑色),我想移动的点可以获得最大的间隙(红色)。箭头是它应该移动的方向,以便最快地最大化它与所有其他点的间隙


对于单个障碍来说,这是微不足道的,但我真的不知道如何处理多个障碍。

我认为解决问题的一个好办法是定义一个成本函数,如

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)