匈牙利算法解决两个坐标列表匹配问题

匈牙利算法:

python线性规划(linear programming)与分配问题(assignment problem)—— linear_sum_assignment的使用
python数学建模之用optimize.linear_sum_assignment解决模型优化之指派问题

遇到一个问题,有一个坐标列表A:[[10,20],[20,30],[42,41],[45,41]], 和一个坐标列表B:[[14,24],[41,42],[20,31],[42,41]],需要看这两个坐标列表之间谁与谁更匹配,这时候就可以使用匈牙利算法来实现

其中分别使用欧几里得距离以及曼哈顿距离作为损失函数

## 遇到一个问题,有一个坐标列表A:[[10,20],[20,30],[42,41],[45,41]], 和一个坐标列表B:[[14,24],[41,42],[20,31],[42,41]],需要看这两个坐标列表之间谁与谁更匹配,这时候就可以使用匈牙利算法来实现

from scipy.optimize import linear_sum_assignment
import numpy as np

# 先前的坐标
position_a = [[10,20],[20,30],[42,41],[45,41]]

# 之后的坐标
position_b = [[14,24],[41,42],[20,31],[42,41]]

## 使用欧几里得距离作为损失

# 使用坐标计算代价矩阵
cost_martix = [[np.power((np.array(a)-np.array(b)),2).sum() for a in position_a] for b in position_b]

print(cost_martix)
# [[32, 72, 1073, 1250], [1445, 585, 2, 17], [221, 1, 584, 725], [1465, 605, 0, 9]]
# 进行匈牙利算法匹配

row_ind, col_ind = linear_sum_assignment(cost_martix)
print(row_ind)
print(col_ind)
# [0 1 2 3]
# [0 2 1 3]

for x,y in zip(row_ind, col_ind):
    print("列表B中的%s,应该与列表A中坐标%s匹配,距离消耗为%d"%(position_b[x],position_a[y],cost_martix[x][y]))
# 列表B中的[14, 24],应该与列表A中坐标[10, 20]匹配,距离消耗为32
# 列表B中的[41, 42],应该与列表A中坐标[42, 41]匹配,距离消耗为2
# 列表B中的[20, 31],应该与列表A中坐标[20, 30]匹配,距离消耗为1
# 列表B中的[42, 41],应该与列表A中坐标[45, 41]匹配,距离消耗为9

## 使用曼哈顿距离作为损失
cost_martix2 = [[np.abs((np.array(a)-np.array(b))).sum() for a in position_a] for b in position_b]

print(cost_martix2)
# [[8, 12, 45, 48], [53, 33, 2, 5], [21, 1, 32, 35], [53, 33, 0, 3]]

# 使用匈牙利算法匹配

row_ind2, col_ind2 = linear_sum_assignment(cost_martix2)
print(row_ind2)
print(col_ind2)
# [0 1 2 3]
# [0 2 1 3]

for x,y in zip(row_ind, col_ind):
    print("列表B中的%s,应该与列表A中坐标%s匹配,距离消耗为%d"%(position_b[x],position_a[y],cost_martix2[x][y]))
# 列表B中的[14, 24],应该与列表A中坐标[10, 20]匹配,距离消耗为8
# 列表B中的[41, 42],应该与列表A中坐标[42, 41]匹配,距离消耗为2
# 列表B中的[20, 31],应该与列表A中坐标[20, 30]匹配,距离消耗为1
# 列表B中的[42, 41],应该与列表A中坐标[45, 41]匹配,距离消耗为3

你可能感兴趣的:(深度学习与机器学习,算法,python,numpy)