繁体   English   中英

如何在 Julia/JuMP v 1.10 中对所有人求和

[英]How to sum for all in Julia/JuMP v 1.10

我在以下线程中看到一个过时的答案( How to do "for all" in sum notation in Julia/JuMP ),不幸的是,它已经 3 岁了,但这正是我想要的。 然而,由于 sum() 函数在过去几年中发生了变化,因此代码由于许多语法错误而失败。

对于我的代码,我发现 sum() 函数仅适用于一个索引变量 i,但如果我包含另一个变量 j,该函数将停止工作。 如果这有什么不同,我也在使用 jupyter notebook。 有任何想法吗?

Using JuMP
ZS = Model(with_optimizer(Gurobi.Optimizer))

P = [[10 -20];
    [30 -40]]

@variable(ZS, x[1,1:2])
@variable(ZS, y[1:2,1])


@objective(ZS, Max, sum(x[i]*P[i,j]*y[j] for i=1:2 for j=1:2)) 


@constraint(ZS, con1, x[1] + x[2] <= 1)
@constraint(ZS, con2, y[1] + y[2] <= 1)

optimize!(ZS)

对于此代码示例,我收到“未找到密钥”错误

将变量的定义更改为一维,如下所示:

@variable(ZS, x[1:2])
@variable(ZS, y[1:2])

并且一切都应该按预期工作。

或者,保留xy二维并重新定义您的目标和约束,如下所示:

@objective(ZS, Max, sum(x[1,i]*P[i,j]*y[j,1] for i=1:2 for j=1:2)) 

@constraint(ZS, con1, x[1,1] + x[1,2] <= 1)
@constraint(ZS, con2, y[1,1] + y[2,1] <= 1)

作为旁注,您可以像这样更简单地定义P

julia> P = [10 -20
            30 -40]
2×2 Array{Int64,2}:
 10  -20
 30  -40

似乎您需要更新 for 循环语法并将求解器设置为非凸的。

我还建议对 vars、exp 等使用匿名标签,以便您可以根据需要更改它们。

using JuMP
using Gurobi
ZS = Model(Gurobi.Optimizer)

set_optimizer_attribute(ZS, "NonConvex", 2)

P = [[10 -20];
    [30 -40]]

xs = @variable(ZS, x[1:2])
ys = @variable(ZS, y[1:2])


my_obj = @objective(ZS, Max, sum(x[i]*P[i,j]*y[j] for i in 1:2, j in 1:2)) 


con1 = @constraint(ZS,  x[1] + x[2] <= 1)
con2 = @constraint(ZS, , y[1] + y[2] <= 1)


optimize!(ZS)

运行时间虽然很长...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM