【问题标题】:How to sum for all in Julia/JuMP v 1.10如何在 Julia/JuMP v 1.10 中为所有人求和
【发布时间】:2019-05-18 14:17:18
【问题描述】:

我在以下线程中看到了一个过时的答案 (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)

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

【问题讨论】:

    标签: julia julia-jump


    【解决方案1】:

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

    @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
    

    【讨论】:

    • 谢谢你,但是现在我有另一个错误,我认为这与我的目标函数没有正确实现有关,因为它有 2 个变量 x 和 y。我现在收到这个错误:Gurobi.GurobiError(10020, "Objective Q not PSD (dagonal Adjustment of 7.0e+01 would be required)")
    • 错误是您的目标函数不是 PSD(即半正定)。 Gurobi 中的二次求解器支持 PSD 目标。如果目标不是 PSD,则您的目标函数在允许域中可能是非凸的,因此具有多个局部最小值。在这种情况下,如果你想找到一个全局最小值,你需要使用一些全局优化例程。如果您只需要一个局部最小值,那么您可以使用任何通用的梯度优化包。
    【解决方案2】:

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

    我还建议对 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)
    

    虽然运行时间很长...

    【讨论】:

      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      相关资源
      最近更新 更多