Ответ 1
Я прошел аналогичный процесс, пытаясь использовать Graph
для всего, и обнаружил, что он не заменяет Combinatorica
и GraphPlot
. Наилучшее использование для Graph
- использовать его как тип контейнера для хранения вершин + ребер + координат.
Например, большинство функций из "Теории алгоритмических диаграмм" учебника Combinatorica
недоступны для новых объектов Graph
. Когда я разговаривал с разработчиком WRI в проекте Graph
, я понял, что все функции Combinatorica
для Graph
не являются приоритетом, поскольку целью дизайна является предоставление методов, которые решают задачи алгоритмическим агностическим способом. Например, у вас может быть метод для поиска вершинной обложки и раскраски графа для нового объекта Graph
, но для алгоритмических конкретных задач, таких как окраска Brelaz и Greedy Vertex Cover, вам всегда придется отложить до Combinatorica
.
В дополнение к мультиграфам некоторые схемы графа недоступны для объектов Graph
. Вы не можете исправить некоторые координаты вершин и позволить автоматическому расположению сделать все остальное. Кроме того, расположение LayeredGraphPlot
недоступно и иногда предпочтительнее над Graph
LayeredDrawing
.
Способ получить лучшее из 3-х миров состоит в том, чтобы использовать объекты Graph
в качестве основного носителя для хранения графа и создавать обертки для GraphPlot
, Combinatorica
и GraphUtilities
функций, которые принимают объекты Graph
Некоторые варианты использования:
-
Вам нужен алгоритм из
Combinatorica
илиGraphUtilities
- создать оболочкуsomeAlgorithm
, которая принимает объектGraph
, преобразует его в список ребер илиCombinatorica
graph (GraphUtilities'ToCombinatoricaGraph
).), запускает алгоритм, преобразует его обратно в объектGraph
, стараясь установить правильныеGraphStyle
иVertexCoordinates
из исходного объекта графа. Из-за конфликтов убедитесь, чтоCombinatorica
иGraphUtilities
не находятся в контексте, я сделать это, используя $Pre -
Вам понадобится график пользовательского графика, например здесь, или многогранный граф - создайте функцию обертки
someGraphPlot
который принимает объектGraph
, преобразует его в правильное представление, затем используетGraphPlot
или, возможно, создает временный объектGraph
с пользовательскими формами вершин/ребер для этого участка. Обратите внимание, что вы можете прикреплять свойства к ребрам с помощьюSetProperty
, чтобы вы могли хранить ваши мультиграфы вGraph
таким образом. -
Вы хотите использовать один из макетов
GraphPlot
и хранить координаты вGraph
- используйте функцию здесь, чтобы получить координаты вершин изGraphPlot
и сохраните их в объектеGraph
, используяVertexCoordinates
Здесь ноутбук, демонстрирующий эти варианты использования и несколько других