A
和B
分别是m
和n
点,m<=n
。我想从m
找到一组名为B
的{{1}} 唯一点,其中所有C
对之间的距离总和为最小的。
要在没有唯一性约束的情况下解决这个问题,我可以找到从[A(i), C(i)]
到B
中每个点的最近点:
A
m = 5; n = 8; dim = 2;
A = rand(m, dim);
B = rand(n, dim);
D = pdist2(A, B);
[~, I] = min(D, [], 2);
C2 = B(I, :);
中可能存在B
的重复元素。现在第一个解决方案是强力搜索:
C
我认为minSumD = inf;
allCombs = nchoosek(1:n, m);
for i = 1:size(allCombs, 1)
allPerms = perms(allCombs(i, :));
for j = 1:size(allPerms, 1)
ind = sub2ind([m n], 1:m, allPerms(j, :));
sumD = sum(D(ind));
if sumD<minSumD
minSumD = sumD;
I = allPerms(j, :);
end
end
end
C = B(I, :);
(每个C2
的最接近点集)除了重复点之外几乎相同A(i)
。那么如何减少计算时间?
答案 0 :(得分:3)
使用Hungarian algorithm的变体,它计算最小/最大权重完美匹配。为未使用的B点创建n-m虚拟点以匹配(或者,如果您愿意付出更多努力,则将匈牙利算法机制调整为非方形矩阵)。