Packages
fixpoint
0.20.2
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/
#
## Boris Okner: modified to sync with the latest API,
## change naming and result handling.
##
defmodule CPSolver.Examples.Hakank.SendMostMoney do
# import Hakank.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 run() 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])
max_val_constraint = max_val && Equal.new(money_var,max_val) || Equal.new(money_var,money_var)
constraints = [send_constraint,most_constraint,money_constraint,max_val_constraint,
AllDifferent.new(xs),
Sum.new(money_var,[send_var,most_var]), # SEND+MOST = MONEY
NotEqual.new(s,0),NotEqual.new(m,0)
]
vars = xs++[money_var,send_var,most_var]
model = max_val == nil && Model.new(vars, constraints,objective: Objective.maximize(money_var))
|| Model.new(vars, 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(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