【问题标题】:julia jump: declare array with variable upper and lower limitjulia jump:声明具有变量上限和下限的数组
【发布时间】:2021-01-24 17:56:49
【问题描述】:

我正在尝试使用 Julia (JUMP) 解决敏感性分析。我遇到了以下问题:

我正在尝试声明一个同时具有上限和下限的变量,以将其提供给 lp_objective_perturbation_range 函数。该函数需要一个数组的引用作为输入。

我尝试了以下语法:

# Lösung Aufgabe 1
println("Lösung Aufgabe 1")

# Produktionsplan auf Grundlage der Ausgangswerte
println("Produktionsplan auf Grundlage der Ausgangswerte")
produktionsplanModell = Model(with_optimizer(GLPK.Optimizer))

# Bereits angefallene Fixkosten
# Modenschau - 8.100.000 USD
# Designer   -   860.000 USD
fixkosten = 8100000 + 860000

c = [33.75; 66.25; 26.625; 210;  22; 136; 60.5; 53.5; 143.25; 110; 155.25]

A = [  0   0   0   0   0   2   0   0 1.5   2 1.5;
     0.5 1.5   0   0   0   0   0   0   0   0   0;
       0   0   0 1.5   0   0   0   0   0   0   0;
       0   0   0   0 1.5   3   0   0   0   0   0;
       0   0   0   0   0   0 1.5 0.5   0   0   0;
       0   0 1.5   0   0   0   0   0   2   0   0;
       0   0   0   0   0   0   0   0   0   3 2.5;]

b = [28000.0; 30000; 9000; 20000; 18000; 30000; 45000]

w = [60000.0;15000;20000; 4000; 6000; 5500; 9000;15000;15000; 7000; 5000]

y = [0.0; 0; 0; 0; 0; 0; 0; 0; 2800; 4200; 3000]

# Definition der Variablen
@variable(produktionsplanModell, w[i] >= x[i] >= y[i] for i=1:11)

很遗憾,这不起作用。所以我需要一个具有以下定义并且可以分配给模型的数组:

@variable(produktionsplanModell, 60000 >= x1  >=    0)
@variable(produktionsplanModell, 15000 >= x2  >=    0)
@variable(produktionsplanModell, 20000 >= x3  >=    0)
@variable(produktionsplanModell,  4000 >= x4  >=    0)
@variable(produktionsplanModell,  6000 >= x5  >=    0)
@variable(produktionsplanModell,  5500 >= x6  >=    0)
@variable(produktionsplanModell,  9000 >= x7  >=    0)
@variable(produktionsplanModell, 15000 >= x8  >=    0)
@variable(produktionsplanModell, 15000 >= x9  >= 2800)
@variable(produktionsplanModell,  7000 >= x10 >= 4200)
@variable(produktionsplanModell,  5000 >= x11 >= 3000)

可以这样做吗?程序的其余部分工作正常。提前致谢!

【问题讨论】:

  • 请不要添加“已解决”。相反,如果您愿意,您可以通过单击左侧的复选标记来接受答案。

标签: julia julia-jump ijulia-notebook


【解决方案1】:

正确的语法是:

@variable(produktionsplanModell , y[i] <= x[i=1:11] <= w[i] )

因此你需要定义循环inside变量声明。

当然还有一个选择:

@variable(produktionsplanModell, x[1:11] )
for i in 1:11
   @constraint(produktionsplanModell , w[i] <= x[i] <= y[i])
end

【讨论】:

  • 请使用第一个选项。第二个添加线性约束而不是变量边界。
  • @OscarDowson 你能稍微详细说明一下有什么区别吗?我很好奇当它交给求解器时会发生什么。例如。 Gurobi 或 CBC 在某些方面处理约束与变量边界不同?
  • 求解器有效地解决了具有线性约束A * x == 0 和边界l &lt;= x &lt;= u 的问题(有一些转换可以将用户问题转化为这种形式)。调用@constraint 会在A 矩阵中添加一个新行。在@variable 中添加边界或调用set_upper_bound 会修改lu 向量而不添加新行。修改绑定向量而不是 A 矩阵总是更好。
【解决方案2】:

谢谢。 我这样做了,效果很好……

@variable(produktionsplanModell, x[1:11])
for i=1:11
  set_lower_bound(x[i], y[i])
  set_upper_bound(x[i], w[i])
end

因为我的约束看起来像那样。

@constraint(produktionsplanModell, constraint[j=1:7], sum( A[j,i]*x[i] for i=1:11 ) <= b[j])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多