Skip to content
Snippets Groups Projects
Commit 895aac50 authored by Jan Uhlík's avatar Jan Uhlík Committed by Jan Trávníček
Browse files

Add basic sqaure grid heuristic functions.

parent f4ff2d0b
No related branches found
No related tags found
No related merge requests found
Showing
with 442 additions and 0 deletions
// 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);
}
// 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
// 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);
}
// 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
// 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);
}
// 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
// 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);
}
// 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
// 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
// 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
// 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment