2009-09-30 39 views
0

我目前正在调度应用程序的工作过程中遇到了一个小障碍。由于该领域出于安全原因进行严格管理,该软件需要检查多个相互依赖的条件以确保可能出行。而不是一个很好的条件树 - 这将很容易实现 - 我有这个可怕的有向图。现在大多数情况下,这并不难,除了事实上我可能不知道所有事先要求的信息,但仍需要尽可能多地进行验证。复杂的一系列条件的部分验证

我可以实现这个作为if/else语句的老鼠窝,但这将是一个可维护性的噩梦,因为法规相当规则的变化。由于图中没有周期,我认为某种形式的广度优先方法可能是最优的。 我在正确的轨道上吗?是否有任何其他替代技术来执行这种任务?

回答

0

解决方案完全取决于您所说的有向无环图(DAG)实际上代表了什么。节点AND和OR节点,还是有条件的分支?

如果他们是有条件的分支,您不需要任何广度优先搜索,因为没有什么可以搜索;你只需根据评估条件采取分支。是的,它可以很容易地作为GOTO意大利面实施。另一个选择是创建节点(或数据结构)的数据库,并有一个“虚拟机”,它通过节点逐一执行。这使得它更易于维护,但也更慢。

如果它是一个AND/OR/NOT图,那么你需要评估从树叶开始的节点的真值。这不是广度优先搜索,而是一种逆广度优先的方法。您计算树叶的值,然后向后计算内部节点的值;最终你会得到一个根节点的评估(true/false)。

0

听起来像你试图解决一个常见的编译问题,称为'[常折叠] [1]'。 (http://en.wikipedia.org/wiki/Constant_folding)。

好的新功能是它适用于DAG(直接非循环图),而不仅仅适用于树。基本上这个想法是通过部分表达式来计算你可以得到的。像True AND X = XTrue OR X = True这样简单的事情有助于修剪树的大部分部分。 (我知道的微不足道的实现是一个深度优先和回溯比宽度优先的问题,但无论如何它不是很多代码)。

我还想知道为什么你得到一个图表不是一个表达式树。如果可以从A计算B或B的A,则通常不会同时输入A和B.然后应该可以根据可用的输入将问题表达为一组表达式树。但这是猜测。你能给出更多的细节(例如)为什么你有这个图吗?