Hello,
here is my rewriting your pseudo code
number_nodes = 3
weighted_tasks = [10, 10, 10, 7, 6, 5, 5, 2, 2, 1, 1, 1]
node_capacity = trunc(Enum.sum(weighted_tasks) / number_nodes)
1..number_nodes
|> Enum.map(fn index -> {index, %{capacity: node_capacity, tasks: []}} end)
|> Enum.map_reduce(
weighted_tasks,
fn {node_index, node}, tasks ->
{node, tasks} =
Enum.reduce(tasks, {node, []}, fn task, {node, new_tasks} ->
if task <= node.capacity do
{%{capacity: node.capacity - task, tasks: [task | node.tasks]}, new_tasks}
else
{node, [task | new_tasks]}
end
end)
{{node_index, node}, Enum.reverse(tasks)}
end
)
|> IO.inspect(charlists: :as_lists)
# output:
{[
{1, %{capacity: 0, tasks: [10, 10]}},
{2, %{capacity: 0, tasks: [1, 2, 7, 10]}},
{3, %{capacity: 0, tasks: [1, 1, 2, 5, 5, 6]}}
], []}


















