JuMP的@constraint约束中实现{ a_j, b_j }类数组编码的咨询
JuMP @constraint 自定义离散集合的实现方法
你需要的{a_j, b_j}形式的离散元素集合,可以通过以下几种方式在@constraint中实现:
- 直接传入离散数组字面量
如果是固定的几个索引值,直接把元素放在方括号[]中作为索引范围即可,示例:
# 示例:仅对j为2、4、6的变量加约束 @constraint(model, [j in [2,4,6]], x[j] <= 10)
- 动态生成成对集合后遍历
如果是每组有两个对应元素的{a_j, b_j}结构,可以先定义存储成对元素的数组,再在约束中遍历:
# 提前定义所有(a_j, b_j)对 pairs = [(1,3), (2,5), (4,6)] # 写法1:按索引遍历 @constraint(model, [j in 1:length(pairs)], x[pairs[j][1]] + x[pairs[j][2]] <= 1) # 写法2:直接解包遍历更简洁 @constraint(model, [(a, b) in pairs], x[a] + x[b] <= 1)
- 多索引场景用映射容器
如果不同上层索引对应不同的{a_j, b_j}集合,可以用字典存储映射关系后调用:
# 定义i对应的专属集合S[i] S = Dict(1 => [2,5], 2 => [1,3], 3 => [4,6]) @constraint(model, [i in 1:3, j in S[i]], x[i,j] >= 0)
注意:Julia 1.0及以上版本不再支持用大括号
{}直接定义数组/集合,定义有序离散元素集合优先用方括号[],如果需要无序去重的特性可以用Set()构造集合传入。
内容的提问来源于stack exchange,提问作者Mahsa
相关产品推荐
相关产品推荐

