# Multiple solutions from MiniZinc?

**URL:** https://discourse.julialang.org/t/multiple-solutions-from-minizinc/116367
**Category:** Optimization (Mathematical)
**Created:** [June 29, 2024, 12:03am UTC](https://discourse.julialang.org/t/multiple-solutions-from-minizinc/116367 "2024-06-29T00:03:12Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![slwu89](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/slwu89/32/217323_2.png) [@slwu89](https://discourse.julialang.org/u/slwu89)
#### Post date: [June 29, 2024, 12:03am UTC](https://discourse.julialang.org/t/multiple-solutions-from-minizinc/116367/1 "2024-06-29T00:03:12Z")

</div>

Hi, I am trying to see if it is possible to return multiple solutions from MiniZinc.jl. I am not sure how to set the flag to do so for the MiniZinc solver. Following the example at this stackoverflow question ([Multiple output under minizinc - Stack Overflow](https://stackoverflow.com/questions/36230950/multiple-output-under-minizinc)) the following code returns 1 of 4 possible solutions. Thanks for any help anyone can provide!

```julia
using JuMP
import MiniZinc

model = MOI.Utilities.CachingOptimizer(
    MiniZinc.Model{Int}(),
    MiniZinc.Optimizer{Int}("chuffed"),
)
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.Interval(1, 9))
MOI.add_constraint.(model, x, MOI.Integer())

MOI.add_constraint(model, MOI.VectorOfVariables(x), MOI.AllDifferent(2))
MOI.add_constraint(model, 1 * x[1] + x[2], MOI.EqualTo(3))
MOI.optimize!(model)

MOI.get(model, MOI.VariablePrimal(), x)
MOI.get(model, MOI.ResultCount())

```

---

<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: [June 29, 2024, 12:08am UTC](https://discourse.julialang.org/t/multiple-solutions-from-minizinc/116367/2 "2024-06-29T00:08:08Z")

</div>

Set `MOI.SolutionLimit`:

```julia
julia> using JuMP

julia> import MiniZinc

julia> model = GenericModel{Int}(() -> MiniZinc.Optimizer{Int}("chuffed"));

julia> set_attribute(model, MOI.SolutionLimit(), 10) # Or some large value

julia> @variable(model, 1 <= x[1:2] <= 9, Int);

julia> @constraint(model, x in MOI.AllDifferent(2));

julia> @constraint(model, sum(x) == 3);

julia> optimize!(model)

julia> [value.(x; result = i) for i in 1:result_count(model)]
2-element Vector{Vector{Int64}}:
 [1, 2]
 [2, 1]

```

I guess this isn’t documented 😄

---

<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: [June 29, 2024, 12:09am UTC](https://discourse.julialang.org/t/multiple-solutions-from-minizinc/116367/3 "2024-06-29T00:09:56Z")

</div>

See [Document MOI.SolutionLimit by odow · Pull Request #70 · jump-dev/MiniZinc.jl · GitHub](https://github.com/jump-dev/MiniZinc.jl/pull/70)

---

<div class="post-metadata">

### Author: ![slwu89](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/slwu89/32/217323_2.png) [@slwu89](https://discourse.julialang.org/u/slwu89)
#### Post date: [June 29, 2024, 12:11am UTC](https://discourse.julialang.org/t/multiple-solutions-from-minizinc/116367/4 "2024-06-29T00:11:45Z")

</div>

Thank you @odow! Ah, the JuMP syntax is much nicer than working at the “MOI level”. Can you explain what `GenericModel{Int}` is, and why we need to set the optimizer as an anonymous function?

---

<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: [June 29, 2024, 12:14am UTC](https://discourse.julialang.org/t/multiple-solutions-from-minizinc/116367/5 "2024-06-29T00:14:29Z")

</div>

> `GenericModel{Int}`

The default `model = Model()` constructor assumes coefficients are `Float64`. This is a feature to use `Int` coefficients (and variable values). See [Arbitrary precision arithmetic · JuMP](https://jump.dev/JuMP.jl/stable/tutorials/conic/arbitrary_precision/)

> why we need to set the optimizer as an anonymous function

Because you are passing an argument to `MiniZinc.Optimizer`. See [Models · JuMP](https://jump.dev/JuMP.jl/stable/manual/models/#Solvers-which-expect-environments)
