path

package
v0.0.0-...-e9e5634 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 22, 2018 License: BSD-3-Clause Imports: 10 Imported by: 0

Documentation

Overview

Package path provides graph path finding functions.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Kruskal

Kruskal generates a minimum spanning tree of g by greedy tree coalescence, placing the result in the destination, dst. If the edge weights of g are distinct it will be the unique minimum spanning tree of g. The destination is not cleared first. The weight of the minimum spanning tree is returned. If g is not connected, a minimum spanning forest will be constructed in dst and the sum of minimum spanning tree weights will be returned.

Nodes and Edges from g are used to construct dst, so if the Node and Edge types used in g are pointer or reference-like, then the values will be shared between the graphs.

If dst has nodes that exist in g, Kruskal will panic.

func NullHeuristic

func NullHeuristic(_, _ graph.Node) float64

NullHeuristic is an admissible, consistent heuristic that will not speed up computation.

func Prim

Prim generates a minimum spanning tree of g by greedy tree extension, placing the result in the destination, dst. If the edge weights of g are distinct it will be the unique minimum spanning tree of g. The destination is not cleared first. The weight of the minimum spanning tree is returned. If g is not connected, a minimum spanning forest will be constructed in dst and the sum of minimum spanning tree weights will be returned.

Nodes and Edges from g are used to construct dst, so if the Node and Edge types used in g are pointer or reference-like, then the values will be shared between the graphs.

If dst has nodes that exist in g, Prim will panic.

Types

type AllShortest

type AllShortest struct {
	// contains filtered or unexported fields
}

AllShortest is a shortest-path tree created by the DijkstraAllPaths, FloydWarshall or JohnsonAllPaths all-pairs shortest paths functions.

func DijkstraAllPaths

func DijkstraAllPaths(g graph.Graph) (paths AllShortest)

DijkstraAllPaths returns a shortest-path tree for shortest paths in the graph g. If the graph does not implement graph.Weighter, UniformCost is used. DijkstraAllPaths will panic if g has a negative edge weight.

The time complexity of DijkstrAllPaths is O(|V|.|E|+|V|^2.log|V|).

func FloydWarshall

func FloydWarshall(g graph.Graph) (paths AllShortest, ok bool)

FloydWarshall returns a shortest-path tree for the graph g or false indicating that a negative cycle exists in the graph. If the graph does not implement Weighted, UniformCost is used.

The time complexity of FloydWarshall is O(|V|^3).

func JohnsonAllPaths

func JohnsonAllPaths(g graph.Graph) (paths AllShortest, ok bool)

JohnsonAllPaths returns a shortest-path tree for shortest paths in the graph g. If the graph does not implement Weighted, UniformCost is used.

The time complexity of JohnsonAllPaths is O(|V|.|E|+|V|^2.log|V|).

func (AllShortest) AllBetween

func (p AllShortest) AllBetween(uid, vid int64) (paths [][]graph.Node, weight float64)

AllBetween returns all shortest paths from u to v and the weight of the paths. Paths containing zero-weight cycles are not returned.

func (AllShortest) Between

func (p AllShortest) Between(uid, vid int64) (path []graph.Node, weight float64, unique bool)

Between returns a shortest path from u to v and the weight of the path. If more than one shortest path exists between u and v, a randomly chosen path will be returned and unique is returned false. If a cycle with zero weight exists in the path, it will not be included, but unique will be returned false.

func (AllShortest) Weight

func (p AllShortest) Weight(uid, vid int64) float64

Weight returns the weight of the minimum path between u and v.

type DominatorTree

type DominatorTree struct {
	// contains filtered or unexported fields
}

DominatorTree is a flow graph dominator tree.

func Dominators

func Dominators(root graph.Node, g graph.Directed) DominatorTree

Dominators returns a dominator tree for all nodes in the flow graph g starting from the given root node.

func DominatorsSLT

func DominatorsSLT(root graph.Node, g graph.Directed) DominatorTree

DominatorsSLT returns a dominator tree for all nodes in the flow graph g starting from the given root node using the sophisticated version of the Lengauer-Tarjan algorithm. The SLT algorithm may outperform the simple LT algorithm for very large dense graphs.

func (DominatorTree) DominatedBy

func (d DominatorTree) DominatedBy(n graph.Node) []graph.Node

DominatedBy returns a slice of all nodes immediately dominated by n. Elements of the slice are retained by the DominatorTree.

func (DominatorTree) DominatorOf

func (d DominatorTree) DominatorOf(n graph.Node) graph.Node

DominatorOf returns the immediate dominator of n.

func (DominatorTree) Root

func (d DominatorTree) Root() graph.Node

Root returns the root of the tree.

type Heuristic

type Heuristic func(x, y graph.Node) float64

Heuristic returns an estimate of the cost of travelling between two nodes.

type HeuristicCoster

type HeuristicCoster interface {
	HeuristicCost(x, y graph.Node) float64
}

HeuristicCoster wraps the HeuristicCost method. A graph implementing the interface provides a heuristic between any two given nodes.

type Shortest

type Shortest struct {
	// contains filtered or unexported fields
}

Shortest is a shortest-path tree created by the BellmanFordFrom or DijkstraFrom single-source shortest path functions.

func AStar

func AStar(s, t graph.Node, g graph.Graph, h Heuristic) (path Shortest, expanded int)

AStar finds the A*-shortest path from s to t in g using the heuristic h. The path and its cost are returned in a Shortest along with paths and costs to all nodes explored during the search. The number of expanded nodes is also returned. This value may help with heuristic tuning.

The path will be the shortest path if the heuristic is admissible. A heuristic is admissible if for any node, n, in the graph, the heuristic estimate of the cost of the path from n to t is less than or equal to the true cost of that path.

If h is nil, AStar will use the g.HeuristicCost method if g implements HeuristicCoster, falling back to NullHeuristic otherwise. If the graph does not implement Weighted, UniformCost is used. AStar will panic if g has an A*-reachable negative edge weight.

func BellmanFordFrom

func BellmanFordFrom(u graph.Node, g graph.Graph) (path Shortest, ok bool)

BellmanFordFrom returns a shortest-path tree for a shortest path from u to all nodes in the graph g, or false indicating that a negative cycle exists in the graph. If the graph does not implement Weighted, UniformCost is used.

The time complexity of BellmanFordFrom is O(|V|.|E|).

Example (Negativecycles)
package main

import (
	"fmt"
	"math"

	"gonum.org/v1/gonum/graph/path"
	"gonum.org/v1/gonum/graph/simple"
)

func main() {
	// BellmanFordFrom can be used to find a non-exhaustive
	// set of negative cycles in a graph. Enumerating the
	// exhaustive list requires iterations of the procedure
	// here successively omitting links from the new node
	// to already found negative cycles.

	// Construct a graph with a negative cycle.
	edges := []simple.WeightedEdge{
		{F: simple.Node('a'), T: simple.Node('b'), W: -2},
		{F: simple.Node('a'), T: simple.Node('f'), W: 2},
		{F: simple.Node('b'), T: simple.Node('c'), W: 6},
		{F: simple.Node('c'), T: simple.Node('a'), W: -5},
		{F: simple.Node('d'), T: simple.Node('c'), W: -3},
		{F: simple.Node('d'), T: simple.Node('e'), W: 8},
		{F: simple.Node('e'), T: simple.Node('b'), W: 9},
		{F: simple.Node('e'), T: simple.Node('c'), W: 2},
	}
	g := simple.NewWeightedDirectedGraph(0, math.Inf(1))
	for _, e := range edges {
		g.SetWeightedEdge(e)
	}

	// Add a zero-cost path to all nodes from a new node Q.
	for _, n := range g.Nodes() {
		g.SetWeightedEdge(simple.WeightedEdge{F: simple.Node('Q'), T: n})
	}

	// Find the shortest path to each node from Q.
	pt, ok := path.BellmanFordFrom(simple.Node('Q'), g)
	if ok {
		fmt.Println("no negative cycle present")
		return
	}
	for _, n := range []simple.Node{'a', 'b', 'c', 'd', 'e', 'f'} {
		p, w := pt.To(n.ID())
		if math.IsNaN(w) {
			fmt.Printf("negative cycle in path to %c path:%c\n", n, p)
		}
	}

}
Output:

negative cycle in path to a path:[a b c a]
negative cycle in path to b path:[b c a b]
negative cycle in path to c path:[c a b c]
negative cycle in path to f path:[a b c a f]

func DijkstraFrom

func DijkstraFrom(u graph.Node, g traverse.Graph) Shortest

DijkstraFrom returns a shortest-path tree for a shortest path from u to all nodes in the graph g. If the graph does not implement Weighted, UniformCost is used. DijkstraFrom will panic if g has a u-reachable negative edge weight.

If g is a graph.Graph, all nodes of the graph will be stored in the shortest-path tree, otherwise only nodes reachable from u will be stored.

The time complexity of DijkstrFrom is O(|E|.log|V|).

func (Shortest) From

func (p Shortest) From() graph.Node

From returns the starting node of the paths held by the Shortest.

func (Shortest) To

func (p Shortest) To(vid int64) (path []graph.Node, weight float64)

To returns a shortest path to v and the weight of the path. If the path to v includes a negative cycle, one pass through the cycle will be included in path and weight will be returned as NaN.

func (Shortest) WeightTo

func (p Shortest) WeightTo(vid int64) float64

WeightTo returns the weight of the minimum path to v. If the path to v includes a negative cycle, the returned weight will not reflect the true path weight.

type UndirectedWeightLister

type UndirectedWeightLister interface {
	graph.WeightedUndirected
	WeightedEdges() []graph.WeightedEdge
}

UndirectedWeightLister is an undirected graph that returns edge weights and the set of edges in the graph.

type Weighted

type Weighted interface {
	// Weight returns the weight for the edge between
	// x and y with IDs xid and yid if Edge(xid, yid)
	// returns a non-nil Edge.
	// If x and y are the same node or there is no
	// joining edge between the two nodes the weight
	// value returned is implementation dependent.
	// Weight returns true if an edge exists between
	// x and y or if x and y have the same ID, false
	// otherwise.
	Weight(xid, yid int64) (w float64, ok bool)
}

Weighted is a weighted graph. It is a subset of graph.Weighted.

type WeightedBuilder

type WeightedBuilder interface {
	AddNode(graph.Node)
	SetWeightedEdge(graph.WeightedEdge)
}

WeightedBuilder is a type that can add nodes and weighted edges.

type Weighting

type Weighting func(xid, yid int64) (w float64, ok bool)

Weighting is a mapping between a pair of nodes and a weight. It follows the semantics of the Weighter interface.

func UniformCost

func UniformCost(g traverse.Graph) Weighting

UniformCost returns a Weighting that returns an edge cost of 1 for existing edges, zero for node identity and Inf for otherwise absent edges.

Directories

Path Synopsis
Package dynamic provides incremental heuristic graph path finding functions.
Package dynamic provides incremental heuristic graph path finding functions.
internal
testgraphs
Package testsgraphs provides a number of graphs used for testing routines in the path and path/dynamic packages.
Package testsgraphs provides a number of graphs used for testing routines in the path and path/dynamic packages.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL