之前做的一个视觉检测项目,本来各个视觉检测工具之间是独立的,单独执行图像输入、得出结果,然后综合汇总结果,简单明了。
后来要求工具之间能存在依赖关系,也就是A工具的输出可以作为B工具的输入,这样就很麻烦了,谁知道用户会怎么勾搭各个工具的输入和输出?怎么知道哪个工具先执行?
当时是用链表简单处理了,处理得很粗糙,逻辑上不清晰。想优化却不知道怎么查找资料。
最近,项目经理又来说这个问题了。
于是,静下心来找资料。结果发现,这个工具与工具之间得依赖、拓扑关系,是一个著名的概念:有向无环图(DAG)。
ok,既然找到资料的切入点,那就好办了。
处理DAG的最有效的C++库应该是这个【Boost Graph Library (BGL) 】,但是这个库貌似是依赖boost,有点大。暂时不用它,后面再看看。
目前打算用的是这个库【 OCEChain /DAG】,只有寥寥两个文件。已经基本能够满足我的需求了。先用它了。
需要对它的源码进行一下修改
将DirectedAcyclicGraph.h的98到103行注释掉。
否则会报:
error: C2580: “DAG::Node<const int>::Node(const DAG::Node<const int> &)”: 不允许使用多个版本的有默认特殊成员函数
error C2580: “DAG::Node<const int>::Node(const DAG::Node<const int> &)”: 不允许使用多个版本的有默认特殊成员函数
查看对正在编译的 类 模板 实例化“DAG::Node<const int>”的引用
这个库是实现了有向无环图的表示,但是在添加子对象时,没有检查添加子对象后会不会造成环型;也没有实现拓扑排序布局。
还是差点意思。
闭环检测可以这样
拓扑排序可以这样
【有向无环图与拓扑排序】
参考
【有向无环图的自动布局算法】
【OCEChain /DAG】