JuMP约束生成器使用疑问:目标函数支持为何约束不支持?
JuMP中约束与目标函数的生成器语法差异问题
核心结论
JuMP的@constraint宏不支持用生成器语法批量创建约束,但@objective支持,这是两者宏解析逻辑的设计差异导致的,不是代码语法错误。
原因解析
- 目标函数里的生成器:
sum(r.cost*x[r.origin, r.destination, r.product] for r in eachrow(cost))本质是把生成器作为参数传给sum函数,@objective只需要处理求和后的最终表达式,因此能正常运行。 - 约束里的生成器写法:
sum(x[r.origin,:, r.product]) <= r.supply for r in eachrow(supply)是把生成器直接放在约束表达式末尾,但@constraint的宏解析逻辑没有实现对这种语法的支持,无法识别并将每个生成器元素转换为单独的约束,所以会抛出报错。
正确的批量创建约束写法
除了你原本的for循环写法,JuMP推荐用数组约束语法来批量生成约束,代码更简洁:
@constraint(model, [r in eachrow(supply)], sum(x[r.origin,:, r.product]) <= r.supply)
这种写法把迭代器r in eachrow(supply)放在方括号[]内,@constraint会自动遍历每个r,生成对应的约束,效果和手动for循环完全一致。
确认原有写法的正确性
你最初的for循环写法是完全合规的,本质是手动遍历每行生成约束,逻辑清晰且运行正常:
for r in eachrow(supply) @constraint(model, sum(x[r.origin,:, r.product]) <= r.supply) end
内容的提问来源于stack exchange,提问作者Alex Turnbull
相关产品推荐
相关产品推荐

