我的Tcl应用程序将使用hypergraph,即具有单开始多端或仅有多端的边。查看可用的实时实现,我看到:: struct :: graph作为潜在的替代方案。然而,它似乎仅限于单启动单端。
在:: struct :: graph中是否有一种(最好是微不足道的)表达超边的方法?如果没有,我怎么能扩展:: struct :: graph?
(...也许有一个比:: struct :: graph更好的解决方案?)
答案 0 :(得分:1)
在中表达超边的 (最好是琐碎的)方式
不是微不足道的,也不一定足够:我现在唯一能想到的就是使用弧的属性来存储额外的源和目标对,给定的,好的,夸大其词:
struct::graph myHyperGraph
myHyperGraph node insert node0
myHyperGraph node insert node1
myHyperGraph node insert node2
myHyperGraph node insert node3
myHyperGraph arc insert node0 node1 harc0
myHyperGraph arc lappend harc0 ends [list node0 node2]
myHyperGraph arc lappend harc0 ends [list node0 node3]
基于这种捎带,一些处理操作应该是合理的努力,例如,在一个关联矩阵中。
答案 1 :(得分:0)
发布我的一些进展和想法,允许人们发表评论。
我倾向于发明“中心节点”。
每当需要超边界时,我都会让所有参与节点都有边缘到集线器。对于一对多的超边缘,我会添加一个集线器,从起始节点到集线器添加一条边,然后从集线器到终端节点各添加一条边。对于多对多,我会添加一个集线器,然后为所有参与节点添加边。边缘的方向会影响walk
的工作方式。我不确定该选择什么,但它很简单,以后再决定。
delete
和walk
命令可以很好地工作。唯一的问题是当一个中心节点被删除后,它会消失,但我相信这是微不足道的。