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