🍿*★,°*:.☆欢迎您/$:*.°★* 🍿 |
正文
假设 一个项目 有三个 维度的参数 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])
总结
简单的应用
- 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
- 📢本文由东方佑原创,首发于 CSDN博客🙉
- 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨