当前位置: 首页 > 知识库问答 >
问题:

以原子方式更新事实的专家/规则引擎?

楚皓君
2023-03-14

原子可能不是合适的词。当建模细胞自动机或神经网络时,通常你有两个系统状态的副本。一个是当前状态,一个是您正在更新的下一步的状态。这确保了在运行所有规则以确定下一步时,系统整体状态保持不变的一致性。例如,如果您运行一个单元/神经元的规则来确定下一步的状态,那么您将运行下一个单元的规则,它是邻居,您希望使用邻居单元的当前状态,而不是其更新状态作为这些规则的输入。

这可能看起来效率低下,因为每个步骤都需要您在更新之前将所有当前步骤状态复制到下一个步骤状态,但是这样做很重要,以准确模拟系统,就好像所有细胞/神经元实际上同时被处理一样,因此规则/触发函数的所有输入都是当前状态。

在为专家系统设计规则时,困扰我的是一条规则如何运行,更新一些应该触发其他规则运行的事实,您可能有100条规则排队等待运行以响应,但显著性被用作一种脆弱的方式,以确保真正重要的规则首先运行。随着这些规则的运行,系统会发生更多变化。事实的状态一直在变化,因此当您开始处理第100条规则时,系统的状态已经发生了显著的变化,因为它是在真正响应第一个事实变化时添加到队列的。它可能已经发生了巨大的变化,以至于规则没有机会在真正应该对系统的原始状态做出反应的时候做出反应。通常,作为一种解决方法,您会仔细调整其显著性,但这会将其他规则向下移动,您会遇到鸡或蛋的问题。其他解决方法包括添加“处理标志”事实,作为锁定机制,在其他规则处理之前抑制某些规则。这些都像是黑客行为,导致规则中包含的标准超出了核心领域模型

如果您构建了一个能够准确建模问题的非常复杂的系统,那么您确实希望将对事实的更改转移到一个单独的“更新”队列中,该队列在规则队列为空之前不会影响当前事实。因此,假设您进行了一个事实更改,该更改将用100条规则填充要运行的规则队列。所有这些规则都将运行,但它们都不会更新当前事实列表中的事实,它们所做的任何更改都会排入更改列表的队列,从而确保在当前批处理过程中不会激活其他规则。处理完所有规则后,事实更改将立即应用到当前事实列表,然后触发更多规则被激活。重复冲洗。因此,它变得很像神经网络或细胞自动机的处理方式。针对不变的当前状态运行所有规则,队列更改,运行所有规则后将更改应用于当前状态。

这种操作模式是专家系统学术界存在的一个概念吗?我想知道是否有一个术语。

Drools是否能够在不影响当前事实的情况下运行所有规则,并将事实更改单独排队,直到所有规则都已运行?如果是,如何?我不希望您为我编写代码,但只需要一些它所调用的关键字或API中的关键字,一些帮助我搜索的起点。

其他专家/规则引擎是否具有此功能?

请注意,在这种情况下,运行的订单规则不再重要,因为排队运行的所有规则都将只看到当前状态。因此,随着规则队列的运行和清除,所有规则都看不到其他规则正在进行的任何更改,因为它们都是针对当前事实集运行的。因此,顺序变得无关紧要,管理规则执行顺序的复杂性也随之消失。在从队列中清除所有规则之前,所有事实更改都处于挂起状态,不会应用于当前状态。然后立即应用所有这些更改,从而导致相关规则再次排队。因此,我的目标不是对规则运行的顺序有更多的控制,而是通过使用模拟同时执行规则的引擎来完全避免规则执行顺序的问题。

共有2个答案

魏翔
2023-03-14

根据你相当模糊的描述,这项工作可能会/可能不会起作用。如果您确实担心触发进一步激活的规则,为什么不自己将中间状态排队。一旦当前评估完成,将这些新事实插入工作记忆。

插入每个事实之后,您必须调用fireAllRules(),这可能会非常昂贵。然后在规则中,不要直接插入事实,而是将这些事实推到队列中。一旦上述调用返回,请遍历队列并执行相同操作(或在完全插入原始事实之后……)

我可以想象这会很慢,为了加快速度,您可以使用相同的规则拥有多个并行工作记忆,并在一次进入多个队列等中评估多个事实。但是事情变得非常棘手...

总之,只是一个想法,太长的评论...

汪凌
2023-03-14

如果我理解你的描述:

  • 有一个事实是由许多规则管理的

在我看来,它是一个工作单元设计模式,就像Hibernate实现它一样(事实上还有许多ORM):http://www.codeproject.com/Articles/581487/Unit-of-Work-Design-Pattern

基本上,您将所有更改(例如在“技术”事实中)存储在内存中,然后在基于初始值的所有规则都已触发时执行“事务”,以更新事实值,依此类推。Hibernate通过其会话实现了这一点(您可以修改附加的对象,然后在需要时对数据库执行更新查询,而不是对java对象的所有修改都会对数据库产生查询)。

如果更新冲突(修改了相同的事实字段值,选择哪个值?与源版本控制冲突相同),您仍然会遇到问题,您必须定义一种确定更新顺序的方法,但它将只定义一次,并且对所有规则和其他更改都可用,它将无缝工作。

 类似资料:
  • 我正在尝试配置cloudwatch事件规则,这将触发sns主题。我一直面临着从cloutwatch规则和terraform创建的事件模式触发sns主题的问题。下面是我的地形代码: 在aws用户界面上应用选中的事件模式后,如下所示: 它在创建s3 bucket时出现调用失败错误。然后我从aws控制台重新保存为: 然后就过去了。 有人能建议我如何禁用地形重新安排事件模式。

  • 我正在使用一个DMN来评估我的输入,但需求是这样的规则将被添加在未来,规则将被添加由正常的用户。因此,我关心的是如何提供一个逻辑来动态更新/添加DMN中的规则,并在camunda Tomcat中更新它。我经历了部署、创建和重新部署rest api,但无法解决我的问题。

  • 我们已经使用Drools引擎几年了,但是我们的数据已经增长了,我们需要找到一个新的分布式解决方案来处理大量数据。我们有复杂的规则,可以查看几天的数据,这就是为什么Drools非常适合我们,因为我们的内存中只有数据。 你对类似于流口水但分布式/可扩展的东西有什么建议吗? 我确实对这件事进行了研究,但我找不到任何符合我们要求的东西。 谢谢

  • 我对drools和KIE服务器是新手。我遇到了一个问题,即如何通过触发规则RHS(then action)在工作记忆中插入新的事实,然后通过这些动态插入的事实激活其他规则。 我所期望的是,当BaseFeature从外部插入工作内存并激活RuleOne时,在RuleOne内部“然后”它将插入新的事实RuleResult,并希望激活RuleTwo,但它没有激活RuleTwo,只是RuleOne被激活了

  • 本文向大家介绍"以俄罗斯方块为例:(1)请尝试总结俄罗斯方块的游戏规则;(2)以吸引玩家进行下一局为目的,增加新的规则或系统;(3)以吸引玩家每天游玩为目的,增加新的规则或系统。"相关面试题,主要包含被问及"以俄罗斯方块为例:(1)请尝试总结俄罗斯方块的游戏规则;(2)以吸引玩家进行下一局为目的,增加新的规则或系统;(3)以吸引玩家每天游玩为目的,增加新的规则或系统。"时的应答技巧和注意事项,需要

  • .NET 的事件模式无非就是观察者模式的语法规范。(查看 Design Patterns, Gamma, Helm, Johnson, and Vlissides pp.293-303)事件定义类的通知消息。事件是构建在委托之上提供类型安全函数签名的处理。事实上,大多数使用委托的例子就是事件,开发者会认为事件和委托是同一件事。在原则中,我给你介绍了使用委托而不是事件的用法。当你需要通知多个客户告诉