在Go中使用Gonum进行图算法

时间:2019-01-19 15:09:19

标签: go search graph gonum

我是一名新的Go程序员,几天前刚刚完成了“ A Go of Go”教程。我想创建一个150 x 120大小的图形,然后获取每个节点的所有边缘节点,并实现一些图形搜索算法,例如BFS和Dijkstra。我发现了一个外观漂亮的Gonum库,它带有一个graph package,看起来很有希望使用。

我的问题是,这里有很多信息,我不知道从哪里开始。我希望会有某种教程使我朝正确的方向开始,但是我没有运气找到一个。

我在Python中进行设置的方式是创建一个零的numpy数组来表示图形的大小,然后对其进行迭代以获取每个节点的每个边,但是我不确定这是否是最好的方法考虑一下如何在Go中设置图表。

2 个答案:

答案 0 :(得分:1)

如果您只是刚开始使用Go,我建议您坚持使用标准库,不要在学习过程中增加更多内容。尝试使用一些基本算法来实现一个简单的图形数据结构-这非常简单,并且可以让您使用该语言进行练习。稍后,当您需要更多性能/功能时,可以四处寻找库(gonum或其他库)。例如,一个简单的图可以表示为:

// Node is a node in the graph; it has a (unique) ID and a sequence of
// edges to other nodes.
type Node struct {
    Id    int64
    Edges []int64
}

// Graph contains a set of Nodes, uniquely identified by numeric IDs.
type Graph struct {
    Nodes map[int64]Node
}

答案 1 :(得分:0)

在这个问题上迷失了方向,寻找了用gonum / graph计数边缘的提示。除了浏览API文档外,我没有发现很多资源。

我认为我找到了计算单个节点边缘的正确方法。也许吧!

for _, node := range graph.NodesOf(g.Nodes()) {
    toNodes := g.From(node.ID()) // returns graph.Nodes
    nodeArray := graph.NodesOf( toNodes ) // returns []graph.Node
    edgeCount := len(nodeArray)
    // - or -
    edgeCount := len(graph.NodesOf( g.From(node.ID()) ))
    // do work with edge count
}

给定一个已知节点以及您可以从那里到达的所有节点,您可以计算(例如:len(graph.NodesOf(g.From(node.ID())))的边数!

要计算所有边缘:

totalEdges := len(graph.EdgesOf(g.Edges()))