Использование Gonum для графовых алгоритмов в Go

Я новичок в программировании на Го, только что закончил урок "Тур по Го" пару дней назад. Я хочу создать граф размером 150 x 120, а затем получить все граничные узлы для каждого узла и реализовать некоторые алгоритмы поиска в графе, такие как BFS и Dijkstra. Я нашел великолепную библиотеку под названием Gonum с графическим пакетом, который выглядит многообещающим для использования.

Моя проблема в том, что информации много, и я не знаю с чего начать. Я надеялся, что будет какое-то учебное пособие, которое поможет мне начать в правильном направлении, но мне не повезло найти его.

Я установил это в Python, создав нулевые массивы для представления размера графа, а затем перебрал его, чтобы получить каждое ребро для каждого узла, но я не уверен, что это лучший способ подумать о том, как графики настроены в Go.

2 ответа

Решение

Если вы только начинаете с 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
}

Наткнулся на этот вопрос в поисках подсказок для подсчета ребер с помощью 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()))
Другие вопросы по тегам