0
点赞
收藏
分享

微信扫一扫

如何使用匈牙利算法解决多维度的约束条件问题


🍿*★,°*:.☆欢迎您/$:*.°★* 🍿

如何使用匈牙利算法解决多维度的约束条件问题_数据分析

 

正文


假设 一个项目 有三个  维度的参数 A B C 都要 组合后最小
分别求解 a b c 三个维度的最优组合
如果三个组合方案刚好 重叠 那么说明有一个使得三个方案最优的 解
如果没有 那么若选择某个方案 其他维度的参数 的值 是 最后得到 选择每种方案的 所有维度参数 按照 到 0点 的欧式距离排序 选择最小的
一般的项目维度 是可穷举的
选择a 维度参数 的方案 a 的值
选择a 维度参数 的方案 b 的值
选择a 维度参数 的方案 c 的值
选择b 维度参数 的方案 a 的值
选择b 维度参数 的方案 b 的值
选择b 维度参数 的方案 c 的值
选择c 维度参数 的方案 a 的值
选择c 维度参数 的方案 b 的值
选择c 维度参数 的方案 c 的值
如果是有填充值得那么 还需要计算每个方案的有效组合数 最后 同时 排序 方可
在没有 组合有效数 的情况下 a b 方案均可  优化 方案 是将 所有方案参数归一化
假设 每个方案 有效组合是 [1,2,3]
当考虑到有效组合方案的时候要使用 多个参数一起排序  在前面的优先级最高 False 是降序 True 是升序

import numpy as np
import pandas as pd
from scipy.optimize import linear_sum_assignment


acost = np.array([[4, 1, 3], [2, 0, 5], [3, 2, 2]])
bcost = np.array([[6, 2, 7], [2, 1, 5], [7, 3, 2]])
ccost = np.array([[6, 3, 4], [2, 1, 8], [9, 3, 6]])
arow_ind, acol_ind = linear_sum_assignment(acost)
brow_ind, bcol_ind = linear_sum_assignment(bcost)
crow_ind, ccol_ind = linear_sum_assignment(ccost)

if np.sum((acol_ind == bcol_ind) & (arow_ind == ccol_ind) & (arow_ind == brow_ind) & (
        arow_ind == crow_ind)) == ccol_ind.size:
    print("选择一种方案即可")

a_acost_value = acost[arow_ind, acol_ind].sum()

a_bcost_value = bcost[arow_ind, acol_ind].sum()

a_ccost_value = bcost[arow_ind, acol_ind].sum()
a_cost_value = [a_acost_value, a_bcost_value, a_ccost_value]

b_acost_value = acost[brow_ind, bcol_ind].sum()

b_bcost_value = bcost[brow_ind, bcol_ind].sum()

b_ccost_value = bcost[brow_ind, bcol_ind].sum()
b_cost_value = [b_acost_value, b_bcost_value, b_ccost_value]

c_acost_value = acost[crow_ind, ccol_ind].sum()

c_bcost_value = bcost[crow_ind, ccol_ind].sum()

c_ccost_value = bcost[crow_ind, ccol_ind].sum()
c_cost_value = [c_acost_value, c_bcost_value, c_ccost_value]
total_cost_value = [np.array(a_cost_value) / max(a_cost_value), np.array(b_cost_value) / max(b_cost_value),
                    np.array(c_cost_value) / max(c_cost_value)]
total_cost_value = np.vstack(total_cost_value)
dis = np.std(total_cost_value - np.zeros(total_cost_value.shape), -1)
print(np.argmin(dis))
effective_combination_value = [1, 2, 3]
ef_dis_data = pd.DataFrame({"ef_count": effective_combination_value, "dis": dis})
print(ef_dis_data.sort_values(["ef_count","dis"],ascending=[False,True]).index.values[0])

总结

        简单的应用

  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由东方佑原创
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

如何使用匈牙利算法解决多维度的约束条件问题_升序_02

举报

相关推荐

0 条评论