向JuMP添加矢量化约束时引发的错误

问题描述

我正在尝试复制this模型-本教程中的代码适用于JuMP / Julia的旧版本,无法运行。

但是,当我尝试添加约束时:

@constraint(model,con,c[i = 1:N] .== ( ((1 - τ) * (1 - l[i]) .* w[i]) + e[i]))

我收到错误Unexpected assignment in expression 'c[i = 1:N]'

这里是代表:

using Random
using distributions
using JuMP
using Ipopt

Random.seed!(123)
N = 1000
γ = 0.5
τ = 0.2

ϵ = rand(normal(0,1),N)
wage = rand(normal(10,N)
consumption = (γ * (1 - τ) * wage) + (γ * ϵ)
leisure = (1 - γ) .+ (( 1 - γ) * ϵ) ./ (( 1 - τ ) * wage)


model = Model(Ipopt.Optimizer)
@variable(model,c[i = 1:N] >= 0)
@variable(model,0 <= l[i = 1:N] <= 1)
@constraint(model,c[i = 1:N] .== ( ((1 - τ) * (1 - l[i]) .* w[i]) + e[i]))
@NLobjective(model,Max,sum(γ *log(c[i]) + (1-γ)*log(l[i]) for i in 1:N ) )

有人知道为什么会抛出该异常以及如何解决它吗?

任何人和所有帮助表示赞赏!

运行Julia 1.5.1

解决方法

在JuMP中使用c[i = 1:N]时,您只能定义变量。

有了约束,您可以做的一种方法就是:

w = wage # not in your code
e = ϵ  # not in your code
@constraint(model,con[i = 1:N],c[i] == ( ((1 - τ) * (1 - l[i]) .* w[i]) + e[i]))
,

Przemyslaw的答案很好。如果您想使用向量化语法,可以

N = 1_000
e = rand(N)
w = rand(N)
τ = 0.2
model = Model()
@variable(model,c[i = 1:N] >= 0)
@variable(model,0 <= l[i = 1:N] <= 1)
@constraint(model,c .== (1 - τ) .* (1 .- l) .* w .+ e)

以下是约束https://jump.dev/JuMP.jl/stable/constraints的JuMP文档