You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

transport包unbalanced函数output="all"时报错,无法获取运输方案

非均衡运输方案获取报错问题解决

问题场景

需要计算两个质量分布间的非均衡运输成本(推土机距离),使用R的transport库时,unbalanced函数在output="dist"时正常返回结果,但output="all"时抛出维度错误。

示例代码

m1 <- matrix(c(1,0,0,0),nrow = 2,ncol = 2)
m2 <- matrix(c(0,0,0,1),nrow = 2,ncol = 2)
a <- transport::pgrid(m1)
b <- transport::pgrid(m2)
transport::unbalanced(a,b,output = "dist")
transport::unbalanced(a,b,output = "all")

报错信息

Error in rowSums(temp[1:m, ]) :
'x' muss ein Array mit mindestens zwei Dimensionen sein
//英文翻译: 'x' has to be an array of at least two dimensions


错误含义解释

这个错误表示rowSums函数接收的参数不是至少二维的数组。你的输入场景里,m1的质量完全集中在单个网格点(仅1个源点),m2的质量也完全集中在单个网格点(仅1个汇点),当调用unbalanced(a,b,output="all")时,函数内部生成的临时运输矩阵temp在切片后变成了一维向量,而rowSums要求输入必须是二维及以上的数组,因此触发报错。


获取运输方案的解决方法

方法1:手动生成运输方案

由于场景中源点和汇点都只有一个,运输逻辑非常直接:

  • 源点坐标:a$coords → (0.25, 0.25)
  • 汇点坐标:b$coords → (0.75, 0.75)
  • 运输量:取两个分布总质量的最小值(此处两者总质量均为1,运输量为1)
  • 运输成本:与output="dist"返回的0.7071068一致(即两点间欧氏距离√0.5)

可手动构造运输方案的数据框:

transport_plan <- data.frame(
  from = 1,
  to = 1,
  mass = 1,
  distance = sqrt(0.5)
)

方法2:调整输入避免单点场景

如果需要让unbalanced函数正常返回output="all",可以给源或汇添加微小的质量扰动,避免单点集中的情况:

# 给m1的其他网格点添加极小质量
m1_adjusted <- matrix(c(0.999, 0.0003, 0.0003, 0.0004), nrow=2, ncol=2)
# 给m2的其他网格点添加极小质量
m2_adjusted <- matrix(c(0.0004, 0.0003, 0.0003, 0.999), nrow=2, ncol=2)

a_adjusted <- transport::pgrid(m1_adjusted)
b_adjusted <- transport::pgrid(m2_adjusted)
# 此时调用output="all"可正常返回
result <- transport::unbalanced(a_adjusted, b_adjusted, output = "all")

返回的result中,绝大多数质量会集中在原场景的核心运输路径上,符合实际需求。

内容的提问来源于stack exchange,提问作者Noskario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:52:26