原子可能不是正确的词。在对元胞自动机或神经网络进行建模时,通常您有两个系统状态副本。一个是当前状态,一个是您正在更新的下一步的状态。这确保了一致性,即在运行所有规则以确定下一步时,整个系统的状态保持不变。例如,如果您为一个细胞/神经元运行规则以确定下一步的状态,然后为下一个细胞运行规则,它是邻居,您希望将当前状态用作这些规则的输入相邻小区的状态,而不是其更新状态。
这可能看起来效率低下,因为每个步骤都需要您在更新它们之前将所有当前步骤状态复制到下一步状态,但是重要的是要准确模拟系统,就好像所有细胞/神经元实际上是同时处理,因此规则/触发函数的所有输入都是当前状态。
在为专家系统设计规则时困扰我的是一个规则如何运行,更新一些应该触发其他规则运行的事实,并且您可能有 100 条规则排队等待运行以响应,但显着性被用作脆弱确保真正重要的那些首先运行的方法。随着这些规则的运行,系统会发生更多变化。事实的状态一直在变化,因此当您处理第 100 条规则时,系统的状态自从它真正响应第一个事实变化时被添加到队列以来已经发生了显着变化。它可能已经发生了如此巨大的变化,以至于规则没有机会在它真正应该有的时候对系统的原始状态做出反应。通常作为一种解决方法,您需要仔细调整其显着性,但随后将其他规则移到列表中,您就会遇到鸡或蛋的问题。其他解决方法包括添加“处理标志”事实,作为锁定机制来抑制某些规则,直到其他规则处理。这些都感觉像是 hack,并导致规则包含超出核心域模型的标准。
如果您构建了一个精确建模问题的非常复杂的系统,您真的希望将事实的更改暂存到一个单独的“更新”队列中,该队列在规则队列为空之前不会影响当前的事实。因此,假设您进行了一项事实更改,该更改填充了规则队列以运行 100 条规则。所有这些规则都会运行,但它们都不会更新当前事实列表中的事实,它们所做的任何更改都会排队到更改列表中,这样可以确保在当前批处理正在处理时没有其他规则被激活。处理完所有规则后,事实更改将立即应用于当前事实列表,然后触发更多规则被激活。冲洗重复。所以它变得很像神经网络或元胞自动机的处理方式。 运行所有规则后,针对不变的当前状态运行所有规则,队列更改,将更改应用于当前状态。
这种操作模式是专家系统学术界存在的概念吗?我想知道它是否有一个术语。
Drools 是否有能力以允许所有规则运行而不影响当前事实的方式运行,并且将事实更改单独排队,直到所有规则都运行?如果是这样,怎么做? 我不希望您为我编写代码,而只是一些它所调用的关键字或 API 中的关键字,一些帮助我搜索的起点。
是否有任何其他专家/规则引擎具有此功能?
请注意,在这种情况下,运行的订单规则不再重要,因为所有排队运行的规则都只会看到当前状态。因此,随着规则队列的运行和清除,任何规则都看不到其他规则所做的任何更改,因为它们都是针对当前事实集运行的。 因此,顺序变得无关紧要,管理规则执行顺序的复杂性消失了。 在所有规则从队列中清除之前,所有事实更改都处于挂起状态并且不会应用于当前状态。然后立即应用所有这些更改,从而导致相关规则再次排队。所以我的目标不是更好地控制规则运行的顺序,而是通过使用模拟同时规则执行的引擎来完全避免规则执行顺序的问题。