Julia优化模型中数组列求和报错:自定义索引范围的解决方法
问题解决:JuMP中DenseAxisArray变量的求和报错
报错原因
当你用自定义的UnitRange变量(I/J/K作为函数输入参数)定义JuMP变量时,得到的是JuMP.Containers.DenseAxisArray类型的容器,而非普通Julia数组。标准sum函数的dims参数不支持对这种容器的索引范围进行归约,因此触发报错。而直接写1:5时,JuMP会自动将容器转为普通数组,所以能正常运行。
解决方案
方法一:显式遍历索引构建求和表达式(推荐)
直接针对行索引遍历,对列索引求和,这种方式适配DenseAxisArray类型,且能保留JuMP变量的优化关联:
I = 1:5; J = 1:5; K = 1:5; using JuMP, HiGHS m = Model(HiGHS.Optimizer) @variable(m, A[i in I, j in J, t in K] >= 0) # 定义每行的和(对应原sum(A[:,:,1], dims=2)的需求) @expression(m, row_sums[i in I], sum(A[i, j, 1] for j in J)) # 示例:使用求和结果添加约束或目标函数 @constraint(m, [i in I], row_sums[i] <= 10) @objective(m, Max, sum(row_sums)) optimize!(m)
如果不需要将求和结果保存为表达式数组,也可以直接在约束/目标中写嵌套求和:
@constraint(m, [i in I], sum(A[i, j, 1] for j in J) <= 10)
方法二:转换为普通数组(仅适合特殊场景)
若需要使用普通数组的dims求和语法,可以先将DenseAxisArray转为普通数组(注意:元素仍为JuMP变量,仅容器类型改变):
A_array = Array(A) row_sums = sum(A_array[:,:,1], dims=2)
这种方式仅建议在索引范围是连续整数且需要频繁进行数组操作时使用,灵活性不如显式索引求和。
内容的提问来源于stack exchange,提问作者mathslover
相关产品推荐
相关产品推荐

