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

在JuMP中使用VariableRef实现矩阵值映射报错如何解决

报错原因

JuMP 不允许将优化变量作为数组的索引值使用:你代码中C是自定义的整数优化变量,在模型构建阶段没有确定取值,属于VariableRef类型,无法直接用来定位A矩阵的元素位置,因此抛出索引类型错误。

修复方案:用指示变量+大M约束重构映射逻辑

不能直接用C做索引,需要新增二进制指示变量拆解约束逻辑,实现步骤如下:

  • 新增三维二进制指示变量z[i,j,k],取值为1时代表C[i,j] = k,否则为0
  • 添加约束保证每个C[i,j]的取值唯一:
# k的取值范围为0到A的第二维度最大值,对应你C的取值范围
max_k = size(A, 2)
@variable(model, z[i=1:m, j=1:n, k=0:max_k], binary=true)
@constraint(model, [i=1:m, j=1:n], sum(z[i,j,k] for k in 0:max_k) == 1)
@constraint(model, [i=1:m, j=1:n], C[i,j] == sum(k * z[i,j,k] for k in 0:max_k))
  • 用大M法重写原来的映射约束:只有当k != 0且z[i,j,k] == 1时,才触发A[i,k] == B[i,j]的约束:
# M取值需要足够大,覆盖A、B元素的最大可能差值,可根据你实际变量的上下界计算
M = 1e6
@constraint(model, [i=1:m, j=1:n, k=1:max_k], A[i,k] - B[i,j] ≤ M * (1 - z[i,j,k]))
@constraint(model, [i=1:m, j=1:n, k=1:max_k], B[i,j] - A[i,k] ≤ M * (1 - z[i,j,k]))

额外注意:你当前定义A、B变量时上下界都写为了lb_X[i,j],相当于直接固定了A、B的取值,不符合优化变量定义逻辑,需要根据实际需求修改为对应的上界参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:54:02