# JuMP Gurobi.jl CPLEX.jl Solution Pool

**URL:** <https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604>\
**Category:** Optimization (Mathematical)\
**Tags:** question, jump, optimization\
**Created:** [November 16, 2021, 6:05pm UTC](https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604 "2021-11-16T18:05:24Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![davide-f](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/davide-f/32/33780_2.png) [@davide-f](https://discourse.julialang.org/u/davide-f)\
**Post date:** [November 16, 2021, 6:05pm UTC](https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604/1 "2021-11-16T18:05:24Z")

</div>

Hi community,

I was interested in setting and obtaining a solution pool for a MILP problem using a solver like CPLEX or Gurobi that support that capability.  
Do you know how I can proceed or suggestions?

Thank you

---

<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:** [November 16, 2021, 6:17pm UTC](https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604/2 "2021-11-16T18:17:09Z")

</div>

I replied to your comment: [https://github.com/jump-dev/CPLEX.jl/issues/197#issuecomment-970530377](https://github.com/jump-dev/CPLEX.jl/issues/197#issuecomment-970530377)

PRs accepted.

It’s implemented in Gurobi, but not CPLEX.

---

<div class="post-metadata">

**Author:** ![davide-f](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/davide-f/32/33780_2.png) [@davide-f](https://discourse.julialang.org/u/davide-f)\
**Post date:** [November 16, 2021, 6:20pm UTC](https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604/3 "2021-11-16T18:20:15Z")

</div>

Thank you very much!  
In Gurobi you mean like the following example?

> m = Model(optimizer\_with\_attributes(Gurobi.Optimizer, “PoolSearchMode”=\>2, “PoolSolutions” =\> 1000))  
> @variables(m,begin  
> 0 \<= x \<= 5  
> 0 \<= y \<= 10, Int  
> z, Bin  
> zz, Bin  
> end)  
> @objective(m, Max, x + 2y + 5\*(z+zz))  
> @constraint(m, x + y + z + zz\<= 10)  
> @constraint(m, x + 2y + z + zz \<= 15)  
> @constraint(m, z + zz \<= 1)  
> optimize!(m)  
> value(z, result=2)

---

<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:** [November 16, 2021, 6:24pm UTC](https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604/4 "2021-11-16T18:24:36Z")

</div>

[https://jump.dev/JuMP.jl/stable/manual/solutions/#Multiple-solutions](https://jump.dev/JuMP.jl/stable/manual/solutions/#Multiple-solutions)

---

<div class="post-metadata">

**Author:** ![CBongiova](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cbongiova/32/4856_2.png) [@CBongiova](https://discourse.julialang.org/u/CBongiova)\
**Post date:** [May 9, 2022, 6:20pm UTC](https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604/5 "2022-05-09T18:20:36Z")

</div>

Hi,

I am also interested in obtaining a solution pool from a MILP using Gurobi. I have looked at the docs but I cannot manage to retrieve the different solutions. For example, for the model mentioned by @davide-f here above:

> using JuMP  
> m = Model(optimizer\_with\_attributes(Gurobi.Optimizer, “PoolSearchMode”=\>2, “PoolSolutions” =\> 1000))  
> @variables(m,begin  
> 0 \<= x \<= 5  
> 0 \<= y \<= 10, Int  
> z, Bin  
> zz, Bin  
> end)  
> @objective(m, Max, x + 2y + 5\*(z+zz))  
> @constraint(m, x + y + z + zz\<= 10)  
> @constraint(m, x + 2y + z + zz \<= 15)  
> @constraint(m, z + zz \<= 1)  
> optimize!(m)

I get:

> Academic license - for non-commercial use only  
> Optimize a model with 3 rows, 4 columns and 10 nonzeros  
> Variable types: 1 continuous, 3 integer (2 binary)  
> Coefficient statistics:  
> Matrix range [1e+00, 2e+00]  
> Objective range [1e+00, 5e+00]  
> Bounds range [5e+00, 1e+01]  
> RHS range [1e+00, 2e+01]  
> Found heuristic solution: objective 15.0000000  
> Presolve time: 0.00s  
> Presolved: 3 rows, 4 columns, 10 nonzeros  
> Variable types: 1 continuous, 3 integer (2 binary)  
> …  
> Explored 47 nodes (10 simplex iterations) in 0.01 seconds  
> Thread count was 8 (of 8 available processors)  
> Solution count 24: 19 19 19 … 5  
> No other solutions better than -1e+100  
> Optimal solution found (tolerance 1.00e-04)  
> Best objective 1.900000000000e+01, best bound 1.900000000000e+01, gap 0.0000%

And so we have:

- 24 solutions (by running result\_count(m))
- But then value(z; result=i) and objective\_value(m; result=i) always return the same value (for each i in {1,…,24})

Any idea of what is going on? Is the “result” argument not functioning?

Thank you!

---

<div class="post-metadata">

**Author:** ![CBongiova](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cbongiova/32/4856_2.png) [@CBongiova](https://discourse.julialang.org/u/CBongiova)\
**Post date:** [May 9, 2022, 7:02pm UTC](https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604/6 "2022-05-09T19:02:38Z")

</div>

> [@CBongiova](#):
>
> value(z; result=i)

UPDATE  
I have found a workaround at the following link: [Multi-cut Benders decomposition? - #3 by deschase](https://discourse.julialang.org/t/multi-cut-benders-decomposition/23472/3)

---

<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:** [May 9, 2022, 10:20pm UTC](https://discourse.julialang.org/t/jump-gurobi-jl-cplex-jl-solution-pool/71604/7 "2022-05-09T22:20:02Z")

</div>

What is `import Pkg; Pkg.status("Gurobi")`? I can’t reproduce this:

```nohighlight
julia> using JuMP, Gurobi

julia> m = Model(Gurobi.Optimizer)
Academic license - for non-commercial use only - expires 2022-06-19
A JuMP Model
Feasibility problem with:
Variables: 0
Model mode: AUTOMATIC
CachingOptimizer state: EMPTY_OPTIMIZER
Solver name: Gurobi

julia> set_optimizer_attribute(m, "PoolSearchMode", 2)

julia> set_optimizer_attribute(m, "PoolSolutions", 1000)

julia> @variables(m, begin
           0 <= x <= 5
           0 <= y <= 10, Int
           z, Bin
           zz, Bin
       end)
(x, y, z, zz)

julia> @objective(m, Max, x + 2y + 5*(z+zz))
x + 2 y + 5 z + 5 zz

julia> @constraint(m, x + y + z + zz<= 10)
x + y + z + zz ≤ 10.0

julia> @constraint(m, x + 2y + z + zz <= 15)
x + 2 y + z + zz ≤ 15.0

julia> @constraint(m, z + zz <= 1)
z + zz ≤ 1.0

julia> optimize!(m)
Gurobi Optimizer version 9.1.0 build v9.1.0rc0 (mac64)
Thread count: 4 physical cores, 8 logical processors, using up to 8 threads
Optimize a model with 3 rows, 4 columns and 10 nonzeros
Model fingerprint: 0x32c0faa9
Variable types: 1 continuous, 3 integer (2 binary)
Coefficient statistics:
  Matrix range [1e+00, 2e+00]
  Objective range [1e+00, 5e+00]
  Bounds range [5e+00, 1e+01]
  RHS range [1e+00, 2e+01]
Found heuristic solution: objective 15.0000000
Presolve time: 0.00s
Presolved: 3 rows, 4 columns, 10 nonzeros
Variable types: 1 continuous, 3 integer (2 binary)

Root relaxation: objective 1.900000e+01, 3 iterations, 0.00 seconds

    Nodes | Current Node | Objective Bounds | Work
 Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time

* 0 0 0 19.0000000 19.00000 0.00% - 0s

Optimal solution found at node 0 - now completing solution pool...

    Nodes | Current Node | Pool Obj. Bounds | Work
             | | Worst |
 Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time

     0 0 - 0 - 19.00000 - - 0s
     0 0 - 0 - 19.00000 - - 0s
     0 2 - 0 - 19.00000 - - 0s

Explored 47 nodes (10 simplex iterations) in 0.00 seconds
Thread count was 8 (of 8 available processors)

Solution count 24: 19 19 19 ... 5
No other solutions better than -1e+100

Optimal solution found (tolerance 1.00e-04)
Best objective 1.900000000000e+01, best bound 1.900000000000e+01, gap 0.0000%

User-callback calls 174, time in user-callback 0.00 sec

julia> print_var(v, i) = print(lpad("$(value(v; result = i))", 5), " ")
print_var (generic function with 1 method)

julia> begin
           println(" i x y z objective")
           for i in 1:result_count(m)
               print(lpad(i, 2), " ")
               print_var(x, i)
               print_var(y, i)
               print_var(z, i)
               println(" ", objective_value(m; result = i))
           end
       end
 i x y z objective
 1 0.0 7.0 1.0 19.0
 2 0.0 7.0 0.0 19.0
 3 4.0 5.0 1.0 19.0
 4 4.0 5.0 -0.0 19.0
 5 2.0 6.0 1.0 19.0
 6 2.0 6.0 -0.0 19.0
 7 5.0 4.0 -0.0 18.0
 8 5.0 4.0 1.0 18.0
 9 5.0 3.0 1.0 16.0
10 5.0 3.0 -0.0 16.0
11 5.0 5.0 -0.0 15.0
12 1.0 7.0 0.0 15.0
13 3.0 6.0 -0.0 15.0
14 5.0 2.0 1.0 14.0
15 5.0 2.0 -0.0 14.0
16 5.0 4.0 -0.0 13.0
17 5.0 1.0 1.0 12.0
18 5.0 1.0 -0.0 12.0
19 5.0 3.0 0.0 11.0
20 5.0 -0.0 -0.0 10.0
21 5.0 0.0 1.0 10.0
22 5.0 2.0 -0.0 9.0
23 5.0 1.0 0.0 7.0
24 5.0 -0.0 -0.0 5.0

```
