如何在JuMP中编写等于数组取值的求和约束
约束编写错误修正说明
报错根因
- 维度逻辑颠倒:需求规则为对所有j、k,i维度求和等于W_jk,你写的代码逻辑为循环i,对j、k维度求和,和需求完全不符。
- 变量作用域错误:你代码中
j、k的有效范围仅在sum()内部的生成器中,W[j,k]写在sum外部时,找不到对应的j、k变量,因此触发未定义报错。 - 约束类型不匹配:需求是等式约束,你写的是大于等于约束。
正确代码实现
这里提供两种JuMP框架下的正确写法:
写法1:显式循环写法
N = 10 W = [11 12 13 14 15 16 17; 9 14 21 21 12 15 16; 14 21 15 13 12 17 17] # 对每一组j、k单独加约束,i维度求和 for j in 1:size(W, 1), k in 1:size(W, 2) @constraint(m, sum(x[i, j, k] for i in 1:N) == W[j, k]) end
如果你的x是已定义的三维变量数组,也可以直接用切片简化求和逻辑:
@constraint(m, sum(x[:, j, k]) == W[j, k])
写法2:JuMP向量化写法(更简洁)
无需手写循环,直接用JuMP的索引约束语法:
@constraint(m, [j in 1:3, k in 1:7], sum(x[i, j, k] for i in 1:N) == W[j, k])
内容的提问来源于stack exchange,提问作者lafinstack
相关产品推荐
相关产品推荐

