# How to obtain dual variables (shadow price) for a set of constraints

**URL:** <https://discourse.julialang.org/t/how-to-obtain-dual-variables-shadow-price-for-a-set-of-constraints/95986>\
**Category:** Optimization (Mathematical)\
**Tags:** question, jump\
**Created:** [March 13, 2023, 7:28am UTC](https://discourse.julialang.org/t/how-to-obtain-dual-variables-shadow-price-for-a-set-of-constraints/95986 "2023-03-13T07:28:21Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![kevinqiao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevinqiao/32/44492_2.png) [@kevinqiao](https://discourse.julialang.org/u/kevinqiao)\
**Post date:** [March 13, 2023, 7:28am UTC](https://discourse.julialang.org/t/how-to-obtain-dual-variables-shadow-price-for-a-set-of-constraints/95986/1 "2023-03-13T07:28:21Z")

</div>

Hello,

I have time-related constraints and I modeled it as

```julia
for time in 1:nTime
    @constraint(model, a[time] + b[time] == c[time], base_name = "cons" 
end

```

The model is solved and I want to obtain the dual variables, thus, how to obtain them by the above constraint formulation method?

BTW, I know there are two other ways to obtain the dual:

```julia
@constraint(model, cons1, a[1] + b[1] == c[1])
@constraint(model, cons2, a[2] + b[2] == c[2])
...
shadow_price(cons1)
...

```

and

```julia
cons = @constraints(model, [time in 1:nTime], a[time] + b[time] == c[time])
shodow_price(cons)

```

(My model contains other parameters, so that the top modeling method is preferred for me. )

---

<div class="post-metadata">

**Author:** ![kevinqiao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevinqiao/32/44492_2.png) [@kevinqiao](https://discourse.julialang.org/u/kevinqiao)\
**Post date:** [March 13, 2023, 7:42am UTC](https://discourse.julialang.org/t/how-to-obtain-dual-variables-shadow-price-for-a-set-of-constraints/95986/2 "2023-03-13T07:42:21Z")

</div>

Sorry, my method is

```julia
for time in 1:nTime
    @constraint(model, a[time] + b[time] == c[time], 
    base_name = "cons$(time)")
end

```

---

<div class="post-metadata">

**Author:** ![kevinqiao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevinqiao/32/44492_2.png) [@kevinqiao](https://discourse.julialang.org/u/kevinqiao)\
**Post date:** [March 13, 2023, 10:29am UTC](https://discourse.julialang.org/t/how-to-obtain-dual-variables-shadow-price-for-a-set-of-constraints/95986/3 "2023-03-13T10:29:03Z")

</div>

The dual variables can be obtained by:

```julia
for time in 1:nTime
    shadow_price(constraint_by_name(model, "cons$(time)")
end

```

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [March 13, 2023, 7:25pm UTC](https://discourse.julialang.org/t/how-to-obtain-dual-variables-shadow-price-for-a-set-of-constraints/95986/4 "2023-03-13T19:25:25Z")

</div>

You should always keep in mind that JuMP variables and constraints are just regular Julia objects.

That means you can use them with any other data structure in Julia. I’d write your model as:

```julia
cons = []
for time in 1:nTime
    c = @constraint(model, a[time] + b[time] == c[time], base_name = "cons") 
    push!(cons, c)
end
shadow_price.(cons)

```

or perhaps

```julia
cons = map(1:nTime) do time
    # Stuff here
    return @constraint(model, a[time] + b[time] == c[time], base_name = "cons")
end
shadow_price.(cons)

```

Your `constraint_by_name` approach also works, but it involves a couple of lookups and relies on `base_name` being unique. So having an explicit vector of constraints might be better.

---

<div class="post-metadata">

**Author:** ![kevinqiao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevinqiao/32/44492_2.png) [@kevinqiao](https://discourse.julialang.org/u/kevinqiao)\
**Post date:** [March 14, 2023, 1:48am UTC](https://discourse.julialang.org/t/how-to-obtain-dual-variables-shadow-price-for-a-set-of-constraints/95986/5 "2023-03-14T01:48:46Z")

</div>

Indeed, this method could be better, as it returns a vector, which is better for using dual variables.
