Current section

Files

Jump to
fixpoint lib examples fair_weights.ex
Raw

lib/examples/fair_weights.ex

defmodule CPSolver.Examples.FairWeights do
alias CPSolver.IntVariable, as: Variable
alias CPSolver.Model
alias CPSolver.Constraint.Maximum
alias CPSolver.Constraint.Factory
import CPSolver.Variable.View.Factory
alias CPSolver.Objective
def model(node_map, weight_range \\ 32..64) do
{weighted_values, memory_plus_load} =
Enum.map(node_map, fn {node_id, %{memory: memory, load: load}} ->
measure = memory + load
#Variable.new(Enum.map(1..64, fn val -> val * (memory + load) end),
{mul(Variable.new(weight_range,
name: node_id), measure),
measure}
end)
|> Enum.unzip()
upper_bound = Enum.max(weight_range) * Enum.max(memory_plus_load) -
Enum.min(weight_range) * Enum.min(memory_plus_load)
IO.inspect(upper_bound, label: :upper_bound)
{max_var, max_constraint} = Factory.maximum(weighted_values)
{min_var, mix_constraint} = Factory.minimum(weighted_values)
{difference_var, difference_constraint} = Factory.subtract(max_var, min_var)
ub_constraint = Factory.leq(difference_var, upper_bound)
Model.new([difference_var, max_var, min_var] ++ weighted_values, [
ub_constraint,
max_constraint, difference_constraint, mix_constraint],
objective: Objective.minimize(difference_var)
)
end
def test(opts \\ []) do
model = model(sample())
{:ok, res} = CPSolver.solve(model, opts)
end
def sample() do
%{
"fwb4" => %{memory: 233, load: 23},
"fwb2" => %{memory: 225, load: 24},
"slb4" => %{memory: 243, load: 12},
"tpb4" => %{memory: 325, load: 27},
"xra2" => %{memory: 321, load: 25},
"tpa1" => %{memory: 306, load: 36},
"xra4" => %{memory: 316, load: 21},
"fwc3" => %{memory: 181, load: 6},
"slb1" => %{memory: 246, load: 14},
"fwa3" => %{memory: 276, load: 33},
"xrb3" => %{memory: 321, load: 24},
"fwc4" => %{memory: 183, load: 7},
"tpb3" => %{memory: 342, load: 25},
"fwb1" => %{memory: 238, load: 28},
"xra1" => %{memory: 319, load: 24},
"fwa2" => %{memory: 229, load: 23},
"tpb1" => %{memory: 305, load: 23},
"fwb3" => %{memory: 258, load: 29},
"sla2" => %{memory: 248, load: 16},
"sla4" => %{memory: 240, load: 14},
"fwc2" => %{memory: 181, load: 6},
"xrb1" => %{memory: 318, load: 26},
"tpa3" => %{memory: 319, load: 25},
"xrb2" => %{memory: 304, load: 25},
"tpa2" => %{memory: 318, load: 21},
"slb2" => %{memory: 227, load: 9},
"fwa4" => %{memory: 238, load: 22},
"sla1" => %{memory: 234, load: 17},
"sla3" => %{memory: 231, load: 16},
"fwa1" => %{memory: 258, load: 25},
"tpa4" => %{memory: 322, load: 22},
"slb3" => %{memory: 237, load: 14},
"fwc1" => %{memory: 184, load: 5},
"xra3" => %{memory: 308, load: 27},
"xrb4" => %{memory: 329, load: 26},
"tpb2" => %{memory: 320, load: 26}
}
end
end