Для проекта *1001* по моделированию дискретных элементов я недавно начал изучать графическое представление совокупности частиц в контакте.Основная идея такова: у меня есть гранулированный агрегат, состоящий из множества частиц.Каждая частица взаимодействует со своими соседями через точки контакта, которые можно представить как ребра, соединяющие частицы (узлы).Задача состоит в том, чтобы извлечь базис цикла , то есть набор наименьших возможных циклов, из которых могут быть построены большие циклы.Для этого я строю график, используя пакет Python networkx
, а затем извлекаю базу цикла с помощью функции networkx.cycle_basis
.Простой пример псевдокода для иллюстрации моей процедуры:
import networkx as nx
nodes = [particle IDs]
edges = [pairs of particle IDs]
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
cycles = nx.cycle_basis(G)
cycles
представляет список списков идентификаторов частиц, участвующих в каждом базисном цикле.Однако, когда я строю график (используя координаты частиц в симуляции), я вижу, что cycles
содержит ряд циклов, которые на самом деле являются комбинацией меньших циклов и, следовательно, не являются базовыми циклами (если я правильно понял).Пример показан ниже:
Здесь черные линии, соединяющие частицы, представляют ребра на графике, а красный цикл содержится вcycles
(что явно не является базовым циклом).Кроме того, в наборе иногда встречаются дубликаты.
Мой вопрос: почему networkx.cycle_basis
отображает такое поведение?Это ожидаемое и мое понимание основы цикла неверно, или результат неправильный?И есть ли способ убрать эти неосновные циклы?