From 895aac50e6544137596280e3248e80484665ad1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Uhl=C3=ADk?= <jan@uhlik.me> Date: Thu, 29 Mar 2018 20:59:20 +0200 Subject: [PATCH] Add basic sqaure grid heuristic functions. --- .../src/heuristic/ChebyshevDistance.cpp | 26 ++++++++ .../src/heuristic/ChebyshevDistance.hpp | 57 ++++++++++++++++++ .../src/heuristic/DiagonalDistance.cpp | 26 ++++++++ .../src/heuristic/DiagonalDistance.hpp | 59 +++++++++++++++++++ .../src/heuristic/EuclideanDistance.cpp | 26 ++++++++ .../src/heuristic/EuclideanDistance.hpp | 59 +++++++++++++++++++ .../src/heuristic/EuclideanDistanceNoSQRT.cpp | 26 ++++++++ .../src/heuristic/EuclideanDistanceNoSQRT.hpp | 59 +++++++++++++++++++ .../src/heuristic/ManhattenDistance.cpp | 26 ++++++++ .../src/heuristic/ManhattenDistance.hpp | 59 +++++++++++++++++++ .../src/heuristic/SquareGridHeuristics.hpp | 19 ++++++ 11 files changed, 442 insertions(+) create mode 100644 alib2graph_algo/src/heuristic/ChebyshevDistance.cpp create mode 100644 alib2graph_algo/src/heuristic/ChebyshevDistance.hpp create mode 100644 alib2graph_algo/src/heuristic/DiagonalDistance.cpp create mode 100644 alib2graph_algo/src/heuristic/DiagonalDistance.hpp create mode 100644 alib2graph_algo/src/heuristic/EuclideanDistance.cpp create mode 100644 alib2graph_algo/src/heuristic/EuclideanDistance.hpp create mode 100644 alib2graph_algo/src/heuristic/EuclideanDistanceNoSQRT.cpp create mode 100644 alib2graph_algo/src/heuristic/EuclideanDistanceNoSQRT.hpp create mode 100644 alib2graph_algo/src/heuristic/ManhattenDistance.cpp create mode 100644 alib2graph_algo/src/heuristic/ManhattenDistance.hpp create mode 100644 alib2graph_algo/src/heuristic/SquareGridHeuristics.hpp diff --git a/alib2graph_algo/src/heuristic/ChebyshevDistance.cpp b/alib2graph_algo/src/heuristic/ChebyshevDistance.cpp new file mode 100644 index 0000000000..9bf78f5bc1 --- /dev/null +++ b/alib2graph_algo/src/heuristic/ChebyshevDistance.cpp @@ -0,0 +1,26 @@ +// ChebyshevDistance.cpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#include "ChebyshevDistance.hpp" + +#include <registration/AlgoRegistration.hpp> +#include <common/DefaultTypes.hpp> + +namespace { + +auto ChebyshevDistance = registration::AbstractRegister<heuristic::ChebyshevDistance, + std::function<DefaultCoordinateType(const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &, + const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &)> >( + heuristic::ChebyshevDistance::chebyshevDistanceFunction); + +} diff --git a/alib2graph_algo/src/heuristic/ChebyshevDistance.hpp b/alib2graph_algo/src/heuristic/ChebyshevDistance.hpp new file mode 100644 index 0000000000..32d2a11bdd --- /dev/null +++ b/alib2graph_algo/src/heuristic/ChebyshevDistance.hpp @@ -0,0 +1,57 @@ +// ChebyshevDistance.hpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#ifndef ALIB2_CHEBYSHEVDISTANCE_HPP +#define ALIB2_CHEBYSHEVDISTANCE_HPP + +#include <cmath> +#include <alib/pair> +#include <functional> + +namespace heuristic { + +class ChebyshevDistance { +// --------------------------------------------------------------------------------------------------------------------- + + public: + template<typename TCoordinate> + static TCoordinate chebyshevDistance(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node); + +// --------------------------------------------------------------------------------------------------------------------- + + template<typename TCoordinate> + static std::function<TCoordinate(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> chebyshevDistanceFunction(); + +// --------------------------------------------------------------------------------------------------------------------- + +}; + +// ===================================================================================================================== + +template<typename TCoordinate> +TCoordinate ChebyshevDistance::chebyshevDistance(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node) { + return std::max(node.first - goal.first, node.second - goal.second); +} + +// --------------------------------------------------------------------------------------------------------------------- + +template<typename TCoordinate> +std::function<TCoordinate(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> ChebyshevDistance::chebyshevDistanceFunction() { + return (TCoordinate (*)(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)) chebyshevDistance; +} + +// --------------------------------------------------------------------------------------------------------------------- + +} // namespace heuristic +#endif //ALIB2_CHEBYSHEVDISTANCE_HPP diff --git a/alib2graph_algo/src/heuristic/DiagonalDistance.cpp b/alib2graph_algo/src/heuristic/DiagonalDistance.cpp new file mode 100644 index 0000000000..d45afd6348 --- /dev/null +++ b/alib2graph_algo/src/heuristic/DiagonalDistance.cpp @@ -0,0 +1,26 @@ +// DiagonalDistance.cpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#include "DiagonalDistance.hpp" + +#include <registration/AlgoRegistration.hpp> +#include <common/DefaultTypes.hpp> + +namespace { + +auto DiagonalDistance = registration::AbstractRegister<heuristic::DiagonalDistance, + std::function<DefaultWeightType(const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &, + const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &)> >( + heuristic::DiagonalDistance::diagonalDistanceFunction); + +} diff --git a/alib2graph_algo/src/heuristic/DiagonalDistance.hpp b/alib2graph_algo/src/heuristic/DiagonalDistance.hpp new file mode 100644 index 0000000000..f30028086d --- /dev/null +++ b/alib2graph_algo/src/heuristic/DiagonalDistance.hpp @@ -0,0 +1,59 @@ +// DiagonalDistance.hpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#ifndef ALIB2_DIAGONALDISTANCE_HPP +#define ALIB2_DIAGONALDISTANCE_HPP + +#include <cmath> +#include <alib/pair> +#include <functional> + +namespace heuristic { + +class DiagonalDistance { +// --------------------------------------------------------------------------------------------------------------------- + public: + template<typename TCoordinate> + static double diagonalDistance(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node); + +// --------------------------------------------------------------------------------------------------------------------- + + template<typename TCoordinate> + static std::function<double(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> diagonalDistanceFunction(); + +// --------------------------------------------------------------------------------------------------------------------- + +}; + +// ===================================================================================================================== + +template<typename TCoordinate> +double DiagonalDistance::diagonalDistance(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node) { + TCoordinate d_max = std::max(std::abs(node.first - goal.first), std::abs(node.second - goal.second)); + TCoordinate d_min = std::min(std::abs(node.first - goal.first), std::abs(node.second - goal.second)); + + return M_SQRT2 * d_min + (d_max - d_min); +} + +// --------------------------------------------------------------------------------------------------------------------- + +template<typename TCoordinate> +std::function<double(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> DiagonalDistance::diagonalDistanceFunction() { + return (double (*)(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)) diagonalDistance; +} + +// --------------------------------------------------------------------------------------------------------------------- + +} // namespace heuristic +#endif //ALIB2_DIAGONALDISTANCE_HPP diff --git a/alib2graph_algo/src/heuristic/EuclideanDistance.cpp b/alib2graph_algo/src/heuristic/EuclideanDistance.cpp new file mode 100644 index 0000000000..99c1237460 --- /dev/null +++ b/alib2graph_algo/src/heuristic/EuclideanDistance.cpp @@ -0,0 +1,26 @@ +// EuclideanDistance.cpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#include "EuclideanDistance.hpp" + +#include <registration/AlgoRegistration.hpp> +#include <common/DefaultTypes.hpp> + +namespace { + +auto EuclideanDistance = registration::AbstractRegister<heuristic::EuclideanDistance, + std::function<DefaultWeightType(const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &, + const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &)> >( + heuristic::EuclideanDistance::euclideanDistanceFunction); + +} diff --git a/alib2graph_algo/src/heuristic/EuclideanDistance.hpp b/alib2graph_algo/src/heuristic/EuclideanDistance.hpp new file mode 100644 index 0000000000..7424b52a90 --- /dev/null +++ b/alib2graph_algo/src/heuristic/EuclideanDistance.hpp @@ -0,0 +1,59 @@ +// EuclideanDistance.hpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#ifndef ALIB2_EUCLIDEANDISTANCE_HPP +#define ALIB2_EUCLIDEANDISTANCE_HPP + +#include <cmath> +#include <alib/pair> +#include <functional> + +namespace heuristic { + +class EuclideanDistance { +// --------------------------------------------------------------------------------------------------------------------- + + public: + template<typename TCoordinate> + static double euclideanDistance(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node); + +// --------------------------------------------------------------------------------------------------------------------- + + template<typename TCoordinate> + static std::function<double(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> euclideanDistanceFunction(); + +// --------------------------------------------------------------------------------------------------------------------- + +}; + +// ===================================================================================================================== + +template<typename TCoordinate> +double EuclideanDistance::euclideanDistance(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node) { + return std::sqrt( + (node.first - goal.first) * (node.first - goal.first) + + (node.second - goal.second) * (node.second - goal.second)); +} + +// --------------------------------------------------------------------------------------------------------------------- + +template<typename TCoordinate> +std::function<double(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> EuclideanDistance::euclideanDistanceFunction() { + return (double (*)(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)) euclideanDistance; +} + +// --------------------------------------------------------------------------------------------------------------------- + +} // namespace heuristic +#endif //ALIB2_EUCLIDEANDISTANCE_HPP diff --git a/alib2graph_algo/src/heuristic/EuclideanDistanceNoSQRT.cpp b/alib2graph_algo/src/heuristic/EuclideanDistanceNoSQRT.cpp new file mode 100644 index 0000000000..b9c53060d6 --- /dev/null +++ b/alib2graph_algo/src/heuristic/EuclideanDistanceNoSQRT.cpp @@ -0,0 +1,26 @@ +// EuclideanDistanceNoSQRT.cpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#include "EuclideanDistanceNoSQRT.hpp" + +#include <registration/AlgoRegistration.hpp> +#include <common/DefaultTypes.hpp> + +namespace { + +auto EuclideanDistanceNoSQRT = registration::AbstractRegister<heuristic::EuclideanDistanceNoSQRT, + std::function<DefaultWeightType(const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &, + const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &)> >( + heuristic::EuclideanDistanceNoSQRT::euclideanDistanceNoSQRTFunction); + +} diff --git a/alib2graph_algo/src/heuristic/EuclideanDistanceNoSQRT.hpp b/alib2graph_algo/src/heuristic/EuclideanDistanceNoSQRT.hpp new file mode 100644 index 0000000000..ee834f9ac5 --- /dev/null +++ b/alib2graph_algo/src/heuristic/EuclideanDistanceNoSQRT.hpp @@ -0,0 +1,59 @@ +// EuclideanDistanceNoSQRT.hpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#ifndef ALIB2_EUCLIDEANDISTANCENOSQRT_HPP +#define ALIB2_EUCLIDEANDISTANCENOSQRT_HPP + +#include <alib/pair> +#include <functional> + +namespace heuristic { + +class EuclideanDistanceNoSQRT { +// --------------------------------------------------------------------------------------------------------------------- + + public: + + template<typename TCoordinate> + static double euclideanDistanceNoSQRT(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node); + +// --------------------------------------------------------------------------------------------------------------------- + + template<typename TCoordinate> + static std::function<double(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> euclideanDistanceNoSQRTFunction(); + +// --------------------------------------------------------------------------------------------------------------------- + +}; + +// ===================================================================================================================== + +template<typename TCoordinate> +double EuclideanDistanceNoSQRT::euclideanDistanceNoSQRT(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node) { + return (node.first - goal.first) * (node.first - goal.first) + + (node.second - goal.second) * (node.second - goal.second); +} + +// --------------------------------------------------------------------------------------------------------------------- + +template<typename TCoordinate> +std::function<double(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, + TCoordinate> &)> EuclideanDistanceNoSQRT::euclideanDistanceNoSQRTFunction() { + return (double (*)(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)) euclideanDistanceNoSQRT; +} + +// --------------------------------------------------------------------------------------------------------------------- + +} // namespace heuristic +#endif //ALIB2_EUCLIDEANDISTANCENOSQRT_HPP diff --git a/alib2graph_algo/src/heuristic/ManhattenDistance.cpp b/alib2graph_algo/src/heuristic/ManhattenDistance.cpp new file mode 100644 index 0000000000..b4b10e8def --- /dev/null +++ b/alib2graph_algo/src/heuristic/ManhattenDistance.cpp @@ -0,0 +1,26 @@ +// ManhattenDistance.cpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#include "ManhattenDistance.hpp" + +#include <registration/AlgoRegistration.hpp> +#include <common/DefaultTypes.hpp> + +namespace { + +auto ManhattenDistance = registration::AbstractRegister<heuristic::ManhattenDistance, + std::function<DefaultCoordinateType(const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &, + const ext::pair< + DefaultCoordinateType, + DefaultCoordinateType> &)> >( + heuristic::ManhattenDistance::manhattenDistanceFunction); + +} \ No newline at end of file diff --git a/alib2graph_algo/src/heuristic/ManhattenDistance.hpp b/alib2graph_algo/src/heuristic/ManhattenDistance.hpp new file mode 100644 index 0000000000..fac3fcd232 --- /dev/null +++ b/alib2graph_algo/src/heuristic/ManhattenDistance.hpp @@ -0,0 +1,59 @@ +// ManhattenDistance.hpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#ifndef ALIB2_MANHATTENDISTANCE_HPP +#define ALIB2_MANHATTENDISTANCE_HPP + +#include <cmath> +#include <alib/pair> +#include <functional> + +namespace heuristic { + +class ManhattenDistance { +// --------------------------------------------------------------------------------------------------------------------- + + public: + + template<typename TCoordinate> + static TCoordinate manhattenDistance(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node); + +// --------------------------------------------------------------------------------------------------------------------- + + template<typename TCoordinate> + static + std::function<TCoordinate(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> manhattenDistanceFunction(); + +// --------------------------------------------------------------------------------------------------------------------- + +}; + +// ===================================================================================================================== + +template<typename TCoordinate> +TCoordinate ManhattenDistance::manhattenDistance(const ext::pair<TCoordinate, TCoordinate> &goal, + const ext::pair<TCoordinate, TCoordinate> &node) { + return std::abs(node.first - goal.first) + std::abs(node.second - goal.second); +} + +// --------------------------------------------------------------------------------------------------------------------- + +template<typename TCoordinate> +std::function<TCoordinate(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)> ManhattenDistance::manhattenDistanceFunction() { + return (TCoordinate (*)(const ext::pair<TCoordinate, TCoordinate> &, + const ext::pair<TCoordinate, TCoordinate> &)) manhattenDistance; +} + +// --------------------------------------------------------------------------------------------------------------------- + +} // namespace heuristic +#endif //ALIB2_MANHATTENDISTANCE_HPP diff --git a/alib2graph_algo/src/heuristic/SquareGridHeuristics.hpp b/alib2graph_algo/src/heuristic/SquareGridHeuristics.hpp new file mode 100644 index 0000000000..88c367c166 --- /dev/null +++ b/alib2graph_algo/src/heuristic/SquareGridHeuristics.hpp @@ -0,0 +1,19 @@ +// SquareGridHeuristics.hpp +// +// Created on: 15. 03. 2018 +// Author: Jan Uhlik +// Modified by: +// +// Copyright (c) 2017 Czech Technical University in Prague | Faculty of Information Technology. All rights reserved. +// Git repository: https://gitlab.fit.cvut.cz/algorithms-library-toolkit/automata-library + +#ifndef ALIB2_SQUAREGRIDHEURISTICS_HPP +#define ALIB2_SQUAREGRIDHEURISTICS_HPP + +#include "ChebyshevDistance.hpp" +#include "DiagonalDistance.hpp" +#include "EuclideanDistance.hpp" +#include "EuclideanDistanceNoSQRT.hpp" +#include "ManhattenDistance.hpp" + +#endif //ALIB2_SQUAREGRIDHEURISTICS_HPP -- GitLab