我目前正在处理一个调度应用程序,并遇到了一个小问题。由于安全原因对磁场进行严格监管,因此要求软件检查许多相互依赖的条件,以确保可以进行跳闸。我没有一个漂亮的条件树 - 这很容易实现 - 我有这个可怕的有向图。现在,在大多数情况下,这并不困难,除非事先我可能不知道所需的所有信息,但仍需尽可能多地进行验证。
我可以将其作为if / else语句的老鼠来实现,但这可能是一个可维护性的噩梦,因为规则会在相当规律的基础上发生变化。由于图中没有循环,我认为某种形式的广度优先方法可能是最优的。 我是在正确的轨道上吗?是否有其他替代技术可以执行此类任务?
答案 0 :(得分:0)
解决方案完全取决于您所说的有向无环图(DAG)实际代表的含义。是节点AND和OR节点,还是条件分支?
如果它们是条件分支,则不需要任何广度优先搜索,因为没有可搜索的内容;你只需根据评估的条件采取分支。是的,它很容易实现为GOTO意大利面条。另一种选择是创建节点(或数据结构)的数据库,并具有通过节点逐个执行的“虚拟机”。这使得它更易于维护,但也更慢。
如果它是AND / OR / NOT图,那么您需要从叶子开始评估节点的真值。这不是广度优先搜索,而是反向广度的第一种方法。您计算叶子的值,然后向后计算内部节点的值;最终你会得到根节点的评估(真/假)。
答案 1 :(得分:0)
听起来你正试图解决一个名为'[constant folding] [1]'的常见编译问题。 (http://en.wikipedia.org/wiki/Constant_folding)。
好消息是它适用于DAG(直接非循环图),而不仅仅适用于树木。基本上,这个想法是从部分表达式中计算出你能做到的。像True AND X = X
或True OR X = True
这样简单的事情有助于修剪树的大部分内容。 (我所知道的琐碎的实现是深度优先和回溯的问题,而不是广度优先,但无论如何它不是很多代码)。
我仍然想知道为什么你的图表不是表达式树。如果您可以从A计算A或B中的B,则通常不会同时将A和B都作为输入。然后应该可以根据可用的输入表达问题,就像一组表达式树。但这是原始的猜测。你能否提供更多详细信息(例如)你有这个图表的原因?