Packages
fixpoint
0.21.4
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/seseman.ex
#
# Seseman problem in Elixir.
#
# Description of the problem:
#
# n is the length of a border
# There are (n-2)^2 "holes", i.e.
# there are n^2 - (n-2)^2 variables to find out.
#
# The simplest problem, n = 3 (n x n matrix)
# which is represented by the following matrix:
#
# a b c
# d e
# f g h
#
# Where the following constraints must hold:
#
# a + b + c = border_sum
# a + d + f = border_sum
# c + e + h = border_sum
# f + g + h = border_sum
# a + b + c + d + e + f = total_sum
#
# For a (Swedish) discussion of this problem, see
# "Sesemans matematiska klosterproblem samt lite Constraint Logic Programming"
# http://www.hakank.org/webblogg/archives/001084.html
# and
# Seseman's Convent Problem: http://www.hakank.org/seseman/seseman.cgi
# (using ECLiPSe CLP code)
#
# It was also is commented in the (Swedish) blog post
# "Constraint Programming: Minizinc, Gecode/flatzinc och ECLiPSe/minizinc"
# http://www.hakank.org/webblogg/archives/001209.html
#
# It should be 85 solutions. And it does:
#
# 5 2 2
# 3 3
# 1 4 4
#
# 5 1 3
# 1 5
# 3 5 1
#
# 4 2 3
# 1 5
# 4 4 1
#
# 3 2 4
# 2 4
# 4 4 1
#
# ...
#
#
# 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.Seseman do
# import Enum # Conflicts with CPSolver.Constraint.Factory.sum
# import Hakank.CPUtils
alias CPSolver.IntVariable
alias CPSolver.Constraint.Sum
# alias CPSolver.Constraint.Equal
alias CPSolver.Model
# import CPSolver.Constraint.Factory
# import CPSolver.Variable.View.Factory
def print_solution(x) do
:io.format("~w ~w ~w~n~w ~w~n~w ~w ~w~n~n", x)
end
def run() do
Logger.configure(level: :info)
rowsum = 9
total = 24
# It should be 84 solutions
# Decision variables
x = Enum.map(0..7,fn i -> IntVariable.new(1..9, name: "x[#{i}]") end)
[a,b,c,
d, e,
f,g,h] = x
# The different sums that should add to rowsum
ts = [ [a,b,c],
[a,d,f],
[c,e,h],
[f,g,h]
]
row_sum_constraints = for t <- ts, do: Sum.new(rowsum,t)
total_constraint = Sum.new(total,x)
model = Model.new(x,
[total_constraint | row_sum_constraints ]
)
{:ok, result} =
CPSolver.solve(model,
search: {:first_fail, :indomain_max},
# stop_on: {:max_solutions, 3}, # It should be 85 solutions
timeout: :infinity
)
result.solutions
|> Enum.map(fn s -> s |> Enum.take(8) |> print_solution end)
IO.inspect(result.statistics)
end
end