类间运输优化:如何筛选最小成本待移动数据行及直接求解方案?
问题1:高效筛选成本最优的待移动数据行
结合你用transport包得到的流量分配结果,按以下步骤操作就能高效完成筛选:
- 绑定每行的移动成本:给数据表的每一行,匹配它从当前class移动到所有目标class的成本(直接从你已构建的成本矩阵中取值)。可以用
dplyr的crossing生成所有源-目标class组合,再关联成本矩阵的数值。 - 关联流量分配任务:把
transport求解得到的流量计划(转成data.frame后包含from(源class)、to(目标class)、mass(需移动行数))和带成本的数据集关联,只保留需要执行移动的源-目标对。 - 按组筛选最小成本行:对每个源-目标class组,筛选出移动成本最低的对应行数。用
dplyr的group_by+slice_min就能快速实现,示例代码如下:
# 假设数据集df包含:row_id, current_class, 其他业务列 # 流量计划已转为data.frame:flow_plan,列:from, to, mass # 成本矩阵cost_mat:行对应源class,列对应目标class # 1. 为每行生成到所有目标class的移动成本(长格式) df_cost <- df %>% crossing(target_class = colnames(cost_mat)) %>% mutate(move_cost = cost_mat[current_class, target_class]) # 2. 只保留需要移动的源-目标组合 df_to_move <- df_cost %>% inner_join(flow_plan, by = c("current_class" = "from", "target_class" = "to")) # 3. 按组筛选成本最低的指定行数 optimal_moves <- df_to_move %>% group_by(current_class, target_class) %>% slice_min(order_by = move_cost, n = mass) %>% ungroup()
最终得到的optimal_moves就是成本最优的待移动数据行,同时包含每行的目标class信息。
问题2:能否跳过批量流计算直接移动数据行?
不行,核心原因如下:
- 批量流计算(运输问题求解)的本质是在全局供需约束下,找到总成本最小的流量分配方案。跳过这一步直接选行移动,比如随机从超量class挑行移到缺量class,大概率会选中移动成本高的行,导致总成本远高于最优值。
- 大型数据集中,手动或简单规则(如随机选择)无法覆盖所有可能的移动组合,必然陷入局部最优。只有通过
transport包的专业算法(如匈牙利算法、网络流算法),才能得到全局最优的流量分配,再基于这个分配筛选数据行,才能保证总成本最小。
内容的提问来源于stack exchange,提问作者SimeonL
相关产品推荐
相关产品推荐

