Packages
fixpoint
0.8.32
0.22.2
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/hakank/send_most_money.ex
#
# SEND+MOST=MONEY optimization problem in Elixir.
#
# Alphametic problem were we maximize MONEY.
#
# This version is doing two things:
# - find the maximum of MONEY
# - and then find all solutions for the maximum value of MONEY.
#
# Problem from the lecture notes:
# http://www.ict.kth.se/courses/ID2204/notes/L01.pdf
#
# There are two maximal solutions:
# 9782 + 1094 = 10876
# 9784 + 1092 = 10876
# This program was created by Hakan Kjellerstrand, hakank@gmail.com
# See also my Elixir page: http://www.hakank.org/elxir/
#
defmodule SendMostMoney do
# import CPUtils
alias CPSolver.IntVariable
alias CPSolver.Constraint.AllDifferent.FWC, as: AllDifferent
alias CPSolver.Constraint.Sum
# alias CPSolver.Constraint.LessOrEqual
alias CPSolver.Constraint.NotEqual
alias CPSolver.Constraint.Equal
alias CPSolver.Model
alias CPSolver.Objective
import CPSolver.Constraint.Factory
import CPSolver.Variable.View.Factory
def main() do
max_val = send_most_money()
IO.puts("Found max_val: #{max_val}")
send_most_money(max_val)
end
def send_most_money(max_val \\ nil) do
n = 8
xs =
for i <- 0..(n - 1) do
IntVariable.new(0..9, name: "x[#{i}]")
end
[s, e, n, d, m, o, t, y] = xs
{send_var, send_constraint} = sum([mul(s, 1000), mul(e, 100), mul(n, 10), d])
{most_var, most_constraint} = sum([mul(m, 1000), mul(o, 100), mul(s, 10), t])
# To maximize
{money_var, money_constraint} =
sum([mul(m, 10_000), mul(o, 1000), mul(n, 100), mul(e, 10), y])
constraints = [
send_constraint,
most_constraint,
money_constraint,
AllDifferent.new(xs),
# SEND+MOST = MONEY
Sum.new(money_var, [send_var, most_var]),
NotEqual.new(s, 0),
NotEqual.new(m, 0)
]
vars = xs ++ [money_var, send_var, most_var]
## Add max_val constraint if max_val is specified
model =
(max_val == nil && Model.new(vars, constraints, objective: Objective.maximize(money_var))) ||
Model.new(vars, [Equal.new(money_var, max_val) | constraints])
Logger.configure(level: :info)
opts = [
# search: {:first_fail, :indomain_min},
search: {:input_order, :indomain_min},
# search: {:first_fail, :indomain_random},
space_threads: 12,
timeout: :infinity
# stop_on: {:max_solutions, 2},
]
{:ok, res} =
CPSolver.solve_sync(
model,
opts
)
# IO.inspect(res.statistics)
sols =
if max_val == nil do
[res.solutions |> List.last()]
else
res.solutions
end
sols
|> Enum.map(fn s ->
money_val = Enum.at(s, 8)
send_val = Enum.at(s, 9)
most_val = Enum.at(s, 10)
:io.format("~w + ~w = ~w~n", [send_val, most_val, money_val])
end)
if max_val == nil do
Enum.at(sols |> hd, 8)
end
end
end