X-Git-Url: http://nitlanguage.org diff --git a/lib/a_star.nit b/lib/a_star.nit index 9780e12..cc0cba3 100644 --- a/lib/a_star.nit +++ b/lib/a_star.nit @@ -14,9 +14,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Services related to pathfinding of graphs using A* -# A single graph may have different properties according to the `PathContext` used +# A* pathfinding in graphs # +# A single graph may have different properties according to the `PathContext` used # # Usage: # @@ -188,13 +188,21 @@ class Node end end + # Find the closest node accepted by `cond` under `max_cost` + fun find_closest(max_cost: Int, context: PathContext, cond: nullable TargetCondition[N]): nullable N + do + var path = path_to_alts(null, max_cost, context, cond) + if path == null then return null + return path.nodes.last + end + # We customize the serialization process to avoid problems with recursive # serialization engines. These engines, such as `JsonSerializer`, # are at danger to serialize the graph as a very deep tree. # With a large graph it can cause a stack overflow. # # Instead, we serialize the nodes first and then the links. - redef fun core_serialize_to(serializer: Serializer) + redef fun core_serialize_to(serializer) do serializer.serialize_attribute("graph", graph) end @@ -265,7 +273,7 @@ class Graph[N: Node, L: Link] # Used to check if nodes have been searched in one pathfinding private var pathfinding_current_evocation: Int = 0 - redef fun core_serialize_to(serializer: Serializer) + redef fun core_serialize_to(serializer) do serializer.serialize_attribute("nodes", nodes) serializer.serialize_attribute("links", links) @@ -316,7 +324,7 @@ class AStarPath[N] end # Context related to an evocation of pathfinding -class PathContext +abstract class PathContext serialize # Type of the nodes in `graph` @@ -380,7 +388,7 @@ class WeightedPathContext self.worst_cost = worst_cost end - redef var worst_cost: Int is noinit + redef var worst_cost is noinit redef fun cost(l) do return l.weight @@ -400,7 +408,7 @@ class WeightedLink end # Advanced path conditions with customizable accept states -class TargetCondition[N: Node] +abstract class TargetCondition[N: Node] serialize # Should the pathfinding accept `node` as a goal?