Current section
Files
Jump to
Current section
Files
lib/shortest_way.ex
defmodule NearestNeighbourAlgorithm.ShortestWay do
@moduledoc false
def shortest_way(map, list \\ [])
def shortest_way([], list), do: list ++ [List.first(list)]
def shortest_way([{key, _} | []], list), do: shortest_way([], list ++ [key])
def shortest_way([{key, value} | tail], list) do
nearest_neighbour = nearest_neighbour(value, list)
tail
|> List.keydelete(key, 0)
|> List.keydelete(nearest_neighbour, 0)
|> List.insert_at(0, List.keyfind(tail, nearest_neighbour, 0))
|> shortest_way(list ++ [key])
end
defp nearest_neighbour(neighbours, list) do
neighbours
|> Enum.filter(fn(x) -> elem(x, 1) !== 0.0 end)
|> Enum.filter(fn(x) -> !Enum.member?(list, elem(x, 0)) end)
|> List.keysort(1)
|> List.first
|> elem(0)
end
end