Python-最接近的最小值

时间:2019-06-08 12:27:24

标签: python scipy integer-programming

我有2个矩阵,每个矩阵都包含Nx2个元素。任何值都是带有8-10个小数的浮点数,它们分别表示一个点的“ x”和“ y”。

对于第一个数组中的任何元素对(x,y)(x在第一列中,而y在第二列中),我需要在第二个数组中找到最接近的点。在任何循环中,一旦找到,我都需要从第二个数组中删除该值。

最后,我的主要目标是获得最佳解决方案,以使第一个数组的任何元素与第二个数组的一个元素之间只有一个一对一的映射,从而满足最接近的value子句。

我创建了一个NxN矩阵,其中我通过

计算了从第一个数组的任何点到第二个数组的任何点的距离
  

scipy.spatial.distance.cdist

代码:

def find_nearest(X_start, X_end):
    mat = scipy.spatial.distance.cdist(X_start, X_end, metric='euclidean')
    new_df = pd.DataFrame(mat)
    return new_df;

enter image description here

下一步是将起点与终点耦合,并且不应有任何相交点,即一对一映射。

我想通过整数编程(使用this)来实现。 因此,如果m [i] [j]是矩阵NxN的元素,我会发现这些约束

enter image description here

问题是我不知道如何编写目标函数,因此我要确定是否需要添加与它相关的任何其他约束。

您认为这是遵循的好方法吗? 由于我没有透露自己已经做过的事情,所以最后一个问题似乎不被理解。

就在这里。

2 个答案:

答案 0 :(得分:1)

这称为分配问题

   min sum((i,j), dist[i,j]*x[i,j])
   subject to
       sum(i, x[i,j]) = 1 for all j
       sum(j, x[i,j]) = 1 for all i
       x[i,j] in {0,1}

其中

 i = 1..n is an element of the first matrix
 j = 1..n is an element of the second matrix
 dist[i,j] is a distance matrix

这些问题可以通过专门的求解器解决,也可以将其表述为LP(线性规划)问题。

Scipy有一个简单的分配求解器(link)。但是,这不是一个非常快的实现:好的LP解算器更快(link)。

答案 1 :(得分:0)

好的,我想这就是你要问的。以下代码将遍历p1中的每个坐标,并计算p2中每个坐标的距离(closest_node函数来自here),然后将最接近的坐标返回到nearest数组和相应的元素已从p2删除

p1nearest之间将存在1对1的对应关系,即p1[0]映射到nearest[0]等。

import numpy as np

def closest_node(node, nodes):
    dist_2 = np.sum((nodes - node)**2, axis=1)
    return np.argmin(dist_2)

p1 = np.random.rand(10, 2)
p2 = np.random.rand(10, 2)
nearest = []

for coord in p1:
    near = closest_node(coord, p2)
    nearest.append(p2[near])
    p2 = np.delete(p2, near, 0)

nearest = np.array(nearest)