如何在Julia / JuMP v 1.10中求和

时间:2019-05-18 14:17:19

标签: julia julia-jump

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

对于我的代码,我发现sum()函数仅适用于一个索引变量i,但是如果我包含另一个变量j,该函数将停止工作。我也使用jupyter笔记本,如果有什么区别。有什么想法吗?

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)

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

2 个答案:

答案 0 :(得分:0)

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

@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

答案 1 :(得分:0)

似乎您需要更新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)

运行时很长,但是...