繁体   English   中英

是否有基于非蛮力的解决方案,仅使用每一行和每一列中的1个值来优化2D数组的最小和

[英]Is there a non brute force based solution to optimise the minimum sum of a 2D array only using 1 value from each row and column

我有两个数组; 一个是从一组连接点的先前位置生成的有序数组; 第二个是一组新的点,用于指定点的新位置。 任务是使每个旧点与最合适的新位置匹配。 每组点之间的差异存储在大小为n * n的新数组中。 目的是找到一种方法,将每个先前的点映射到一个新的点,从而使总和最小。 这样,每个旧点都是矩阵的一行,并且必须与单个列匹配。

我已经进行了详尽的搜索。 尽管这可行,但复杂度为O(n!),这不是有效的解决方案。

以下代码可用于生成2D阵列的测试数据。

import numpy as np


def make_data():
    org = np.random.randint(5000, size=(100, 2))
    new = np.random.randint(5000, size=(100, 2))
    arr = []
    # ranges = []
    for i,j in enumerate(org):
        values = np.linalg.norm(new-j, axis=1)
        arr.append(values)
    # print(arr)  
    # print(ranges)
    arr = np.array(arr)
    return arr

这是数组和预期输出的一些小示例。

防爆。 1

1 3 5 
0 2 3 
5 2 6 

上面的输出应返回[0,2,1]以表示第0行映射到第0列,第1行映射到第2列,第2行映射到第1列。因为最优解为b 1,3,2

该算法最好是100%准确的,尽管更快一些(85%+)也将是有效的。

Google搜索字词:“加权图最小匹配”。 您可以将数组视为加权图,并且正在寻找一种可以使边长最小的匹配项。

分配问题是基本的组合优化问题。 它包括在加权二分图中找到一个匹配,其中边缘的权重之和尽可能大。 一个常见的变体是找到最小重量的完美匹配。

https://en.wikipedia.org/wiki/Assignment_problem

匈牙利方法是一种组合优化算法,可以解决多项式时间内的赋值问题,并且可以预期以后的原始对偶方法。

https://en.wikipedia.org/wiki/Hungarian_algorithm

我不确定是否在此处发布整个算法; 它是几个段落,并在Wikipedia标记中。 另一方面,我不确定是否将其保留为“仅链接的答案”。 如果人们对两种方式都有强烈的感情,可以在评论中提及。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM