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

匈牙利算法:

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
匈牙利算法是一种用于解决指派问题算法。指派问题是一类优化问题,其目标是在满足特定的指派要求条件下,使指派方案总体效果最佳。例如,将若干项工作分配给若干人员,或选择若干个投标者来承包若干项合同。 匈牙利算法的基本思路是通过对费用矩阵进行变换,将其转化为有 n 个位于不同行不同列的零元素的形式,然后确定这些零元素对应的变量的取值,以得到指派问题的最优解。一种常见的变换方法是对费用矩阵的行和列分别减去某个常数,使其包含 n 个零元素。然后,将这些零元素对应的变量取值设为 1,其余变量设为 0,即可得到最优解。 另一种方法是找出系数矩阵中的最大值,然后将系数矩阵中的每个元素减去最大值,得到新的系数矩阵。然后按照正常的匈牙利算法进行求解,即可得到最优解。 综上所述,匈牙利算法是一种用于解决指派问题算法,可以通过对费用矩阵进行变换或者找出系数矩阵中的最大值来求解最优解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [指派问题匈牙利算法](https://blog.csdn.net/Wonz5130/article/details/80678410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [匈牙利算法解决指派问题清晰流程](https://blog.csdn.net/siss0siss/article/details/51325656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值