OpenTTD Source
20241108-master-g80f628063a
|
CYapfBaseT - A-star type path finder base class. More...
#include <yapf_base.hpp>
Public Types | |
typedef Types::Tpf | Tpf |
the pathfinder class (derived from THIS class) | |
typedef Types::TrackFollower | TrackFollower |
typedef Types::NodeList | NodeList |
our node list | |
typedef Types::VehicleType | VehicleType |
the type of vehicle | |
typedef NodeList::Titem | Node |
this will be our node type | |
typedef Node::Key | Key |
key to hash tables | |
Public Member Functions | |
CYapfBaseT () | |
default constructor | |
~CYapfBaseT () | |
default destructor | |
const YAPFSettings & | PfGetSettings () const |
return current settings (can be custom - company based - but later) | |
bool | FindPath (const VehicleType *v) |
Main pathfinder routine: More... | |
Node * | GetBestNode () |
If path was found return the best node that has reached the destination. More... | |
Node & | CreateNewNode () |
Calls NodeList::CreateNewNode() - allocates new node that can be filled and used as argument for AddStartupNode() or AddNewNode() | |
void | AddStartupNode (Node &n) |
Add new node (created by CreateNewNode and filled with data) into open list. | |
void | AddMultipleNodes (Node *parent, const TrackFollower &tf) |
add multiple nodes - direct children of the given node | |
void | PruneIntermediateNodeBranch (Node *n) |
In some cases an intermediate node branch should be pruned. More... | |
void | AddNewNode (Node &n, const TrackFollower &tf) |
AddNewNode() - called by Tderived::PfFollowNode() for each child node. More... | |
const VehicleType * | GetVehicle () const |
void | DumpBase (DumpTarget &dmp) const |
Data Fields | |
NodeList | nodes |
node list multi-container | |
int | num_steps = 0 |
this is there for debugging purposes (hope it doesn't hurt) | |
Protected Member Functions | |
Tpf & | Yapf () |
to access inherited path finder | |
Protected Attributes | |
Node * | best_dest_node = nullptr |
pointer to the destination node found at last round | |
Node * | best_intermediate_node = nullptr |
here should be node closest to the destination if path not found | |
const YAPFSettings * | settings |
current settings (_settings_game.yapf) | |
int | max_search_nodes |
maximum number of nodes we are allowed to visit before we give up | |
const VehicleType * | vehicle = nullptr |
vehicle that we are trying to drive | |
int | stats_cost_calcs = 0 |
stats - how many node's costs were calculated | |
int | stats_cache_hits = 0 |
stats - how many node's costs were reused from cache | |
CYapfBaseT - A-star type path finder base class.
Derive your own pathfinder from it. You must provide the following template argument: Types - used as collection of local types used in pathfinder
The following types must be defined in the 'Types' argument:
For node list you can use template class CNodeList_HashTableT, for which you need to declare only your node type. Look at test_yapf.h for an example.
Your pathfinder derived class needs to implement following methods: inline void PfSetStartupNodes() inline void PfFollowNode(Node &org) inline bool PfCalcCost(Node &n) inline bool PfCalcEstimate(Node &n) inline bool PfDetectDestination(Node &n)
For more details about those methods, look at the end of CYapfBaseT declaration. There are some examples. For another example look at test_yapf.h (part or unittest project).
Definition at line 49 of file yapf_base.hpp.
|
inline |
AddNewNode() - called by Tderived::PfFollowNode() for each child node.
Nodes are evaluated here and added into open list
Definition at line 211 of file yapf_base.hpp.
References valid, and CYapfBaseT< Types >::Yapf().
|
inline |
Main pathfinder routine:
Definition at line 104 of file yapf_base.hpp.
References CYapfBaseT< Types >::Yapf().
|
inline |
If path was found return the best node that has reached the destination.
Otherwise return the best visited node (which was nearest to the destination).
Definition at line 148 of file yapf_base.hpp.
References CYapfBaseT< Types >::best_dest_node, and CYapfBaseT< Types >::best_intermediate_node.
|
inline |
In some cases an intermediate node branch should be pruned.
The most prominent case is when a red EOL signal is encountered, but there was a segment change (e.g. a rail type change) before that. If the branch would not be pruned, the rail type change location would remain the best intermediate node, and thus the vehicle would still go towards the red EOL signal.
Definition at line 197 of file yapf_base.hpp.