如何优化NxN表格无替换选行求最大得分的算法?适配30x30规模
问题匹配场景与解决方案
你描述的场景属于经典的最大权指派问题,核心约束为行、列均仅可选择1次,目标是所有选中元素的加总得分最大,30x30规模完全可以用成熟的匈牙利算法高效求解。
算法说明
- 匈牙利算法是专门解决n阶方阵指派问题的最优算法,时间复杂度为O(n³),30阶规模下运算量仅为2.7万次,可在毫秒级得到全局最优解,不存在贪心算法的局部最优问题。
- 若你使用的算法版本默认求解最小权指派,只需将所有矩阵元素取相反数,就可以将最大权问题转换为最小权问题求解,最终结果取反即可得到最大得分。
R语言实现示例
基于你给出的测试数据,可直接调用lpSolve包的lp.assign函数实现:
首先安装加载依赖包:
install.packages("lpSolve") library(lpSolve)
处理测试数据并求解:
# 构造测试矩阵,去掉第一列非数值列 opt_matrix <- as.matrix(opt_table[, -1]) # 求解最大权指派问题 result <- lp.assign(opt_matrix, direction = "max") # 输出最大总得分 print(result$objval) # 输出结果为1.5,和你给出的最优解一致 # 输出匹配结果矩阵,1的位置即为选中的元素 print(result$solution)
运行后solution矩阵的输出为:
[,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1
对应第一列选第一行(A)、第二列选第二行(B)、第三列选第三行(C),完全匹配预期最优解。
其他语言实现参考
如果你使用其他编程语言,都有成熟的匈牙利算法实现可以直接调用:
- Python:可以使用
scipy.optimize.linear_sum_assignment函数,传入取反后的矩阵即可求解最大权问题 - C++/Java:可直接引入开源的匈牙利算法实现代码,30阶规模下运行无任何性能压力
内容的提问来源于stack exchange,提问作者spazznolo
相关产品推荐
相关产品推荐

