Packages
fixpoint
0.8.31
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/set_covering.ex
#
# Set covering problem in Elixir.
#
# Placing of firestations, from Winston "Operations Research", page 486
#
# Cf http://hakank.org/minizinc/set_covering.mzn
#
# This program was created by Hakan Kjellerstrand, hakank@gmail.com
# See also my Elixir page: http://www.hakank.org/elxir/
#
defmodule SetCovering do
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 problem(1) do
# minimum distance
min_distance = 15
# distances between the cities
distance = [
[0, 10, 20, 30, 30, 20],
[10, 0, 25, 35, 20, 10],
[20, 25, 0, 15, 30, 20],
[30, 35, 15, 0, 15, 25],
[30, 20, 30, 15, 0, 14],
[20, 10, 20, 25, 14, 0]
]
[min_distance, distance]
end
def main() do
[min_distance, distance] = problem(1)
num_cities = length(distance)
# where to place the fire stations: 1 if placed in this city.
x =
for i <- 0..(num_cities - 1) do
IntVariable.new(0..1, name: "x[#{i}]")
end
# number of fire stations, to minimize
z = IntVariable.new(0..num_cities, name: "z")
# calculate the number of covered fire stations
constraints =
for j <- 0..(num_cities - 1) do
{d_var, d_constraint} =
sum(
for i <- 0..(num_cities - 1),
CPUtils.mat_at(distance, i, j) <= min_distance do
Enum.at(x, i)
end
)
# d >= 1
gt_constraint = LessOrEqual.new(1, d_var)
[gt_constraint, d_constraint]
end
# |> List.flatten
# |> IO.inspect
model =
Model.new(
x ++ [z],
(constraints ++ [Sum.new(z, x)]) |> List.flatten(),
objective: Objective.minimize(z)
)
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)
IO.inspect(res.objective, label: :objective)
res.solutions
# |> IO.inspect
end
end