IBM CPLEX目标规划代码报错:operator not available for dexpr int + dvar float[][j][l]
IBM CPLEX目标规划代码错误排查
在使用IBM CPLEX编写目标规划代码时,运行出现错误:operator not available for dexpr int + dvar float[][j][l],错误出现在goal 1的约束条件中。相关代码片段如下:
int N=22; int M=30; int T=3; int P=3; range I=1..N; range J=1..M; range K=1..T; // 注:代码未定义range L,推测遗漏定义,如range L=1..P; // ...... dvar boolean x[I][J][K][L]; // ...... dvar float d1minus[I][J][L]; dvar float d1plus[I][J][L]; // ...... minimize objective; subject to{ objective == sum(i in I, j in J, l in L)(d1minus[i][j][l]+d1plus[i][j][l])+sum(i in I) (d2minus[i]+d2plus[i]+d3minus[i]+d3plus[i]) ; forall(i in I, j in J, l in L){ d1minus[i][j][l]>=0; d1plus[i][j][l]>=0; } forall(i in I){ d2minus[i]>=0; d2plus[i]>=0; d3minus[i]>=0; d3plus[i]>=0; } //goal 1 forall(i in I){ sum(j in J,k in K,l in L)x[i][j][k][l]+d1minus[i][k][l]-d1plus[i][j][l]==24; }
错误核心原因
- 下标维度不匹配:
d1minus定义为dvar float d1minus[I][J][L],但在goal1约束中使用了d1minus[i][k][l],其中k属于range K,而非J,索引类型与变量定义的维度不匹配,导致CPLEX无法识别变量类型,触发运算符错误。 - 未量化的自由变量:
goal1的循环仅量化了i in I,但约束中出现的j和l未被包含在当前循环的量化范围内,属于未绑定的自由变量。CPLEX无法解析“求和后的整数表达式”与“未绑定的浮点变量数组”直接运算的逻辑。 - 代码遗漏定义:
代码中使用了range L,但未给出明确定义(推测应为range L=1..P;),这会导致索引解析异常,间接引发类型匹配问题。
修正方案
根据目标规划的逻辑,分两种场景修正:
场景1:对每个(i,j,l)组合约束
若goal1是对每个i、j、l的x求和(遍历k)后与偏差变量约束等于24,调整循环范围和下标:
//goal 1 修正后 forall(i in I, j in J, l in L){ sum(k in K)x[i][j][k][l] + d1minus[i][j][l] - d1plus[i][j][l] == 24; }
场景2:对每个i整体约束
若goal1是对每个i的所有j、k、l的x求和后与偏差变量约束等于24,需先修正偏差变量维度,再调整约束:
// 先修正偏差变量维度 dvar float d1minus[I]; dvar float d1plus[I]; //goal 1 修正后 forall(i in I){ sum(j in J,k in K,l in L)x[i][j][k][l] + d1minus[i] - d1plus[i] == 24; }
内容的提问来源于stack exchange,提问作者celal güngör
相关产品推荐
相关产品推荐

