我在以下线程(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)
对于此示例代码,我收到了“找不到密钥”错误
答案 0 :(得分:0)
将变量的定义更改为一维,如下所示:
@variable(ZS, x[1:2])
@variable(ZS, y[1:2])
所有操作都应按预期进行。
或者将x
和y
保留为二维,然后重新定义目标和约束,如下所示:
@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)
运行时很长,但是...