Packages
fixpoint
0.13.1
0.22.1
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.18.2
0.18.1
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.13.5
0.13.4
0.13.2
0.13.1
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.2
0.12.1
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.46
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.28
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.1.3
0.1.2
0.1.1
0.1.0
Constraint Programming Solver
Current section
Files
Jump to
Current section
Files
lib/examples/xkcd_np.ex
defmodule CPSolver.Examples.XKCD.NP do
@doc """
<a href="https://xkcd.com/287/">xkcd-np</a>.
"""
alias CPSolver.IntVariable, as: Variable
alias CPSolver.Model
import CPSolver.Variable.View.Factory
import CPSolver.Constraint.Factory
def model() do
appetizers = [
{:mixed_fruit, 215},
{:french_fries, 275},
{:side_salad, 335},
{:hot_wings, 355},
{:mozarella_sticks, 420},
{:sampler_plate, 580}
]
total = 1505
quantities =
Enum.map(appetizers, fn {name, price} ->
mul(Variable.new(0..div(total, price), name: name), price)
end)
sum_constraint = sum(quantities, total)
Model.new(quantities, [sum_constraint], extra: %{appetizers: appetizers, total: total})
end
def check_solution(solution, %{extra: %{appetizers: appetizers, total: total}} = _model) do
appetizers
|> Enum.zip(solution |> Enum.take(length(appetizers)))
|> Enum.reduce(0, fn {{_name, price}, quantity}, acc -> acc + price * quantity end)
|> then(fn sum -> sum == total end)
end
def solve() do
model = model()
num_appetizers = length(model.extra.appetizers)
{:ok, res} = CPSolver.solve(model)
Enum.map_join(res.solutions, "\n OR \n", fn sol ->
sol
|> Enum.zip(res.variables)
|> Enum.take(num_appetizers)
|> Enum.reject(fn {q, _name} -> q == 0 end)
|> Enum.map_join(", ", fn {q, name} -> "#{name} : #{q}" end)
end)
|> IO.puts()
end
end