【问题标题】:Drools rule implementationDrools 规则实现
【发布时间】:2015-07-07 21:18:31
【问题描述】:

我有个规则不知道能不能在drools中实现。

描述:ALP都是连接的facts/POJO。我需要找出每个A 是否可以通过L 分配给一个免费的P。如果没有,有多少 A 元素未分配。

在上述情况下,A 将未分配。

我想出了一个易于描述的算法:

  1. 找到边缘最少的A

    • 如果A 没有边,将结果计数器加1,删除A
  2. A 中随机选择L->P 并删除ALP 元素

  3. 重复直到没有A离开

我很难用流口水来描述这一点。我不是流口水规则的专家。在 JAVA 中,您必须对集合进行大量操作,包括排序,而 drools 似乎不支持这些操作。是否有可能以某种方式在流口水中做到这一点?

【问题讨论】:

    标签: java drools


    【解决方案1】:

    这里有一组实现算法的规则。它对大量的 As 和 Ps 不是很有效。纯 Java 解决方案也不应该那么困难。请注意,从集合中移除一个 A 并清除所有悬空的 L 和 P 对象后,不需要进行完整排序。

    rule findMin
    when
        $mina: A( $edges: edges )
        not A( edges.size() < $edges.size() )
    then
        System.out.println( "retract " + $mina );
        retract( $mina );
    end
    
    rule countFail extends findMin
    when
        eval( $edges.size() == 0 )
    then
        Main.counter++;
        System.out.println( "fail to match " + $mina );
    end
    
    rule matchLP extends findMin
    when
        $l: L( this memberOf $edges, $p: p )
    then
        retract( $p );
        retract( $l );
        System.out.println( "retract " + $p + " and " + $l );
    end
    
    rule cleanup
    salience 10
    when
        $l: L( $p: p )
        not P( this == $p )
        $a: A( edges contains $l )
    then
        retract( $l );
        modify( $a ){
            remove( $l );
        }
        System.out.println( "cleanup " + $l + ", " + $a );
    end
    

    【讨论】:

    • 太棒了。我不知道扩展的东西。关于撤回:由于要处理的规则更多,是否可以存储撤回的事实以在“countFail”规则不再匹配后重新插入它们?或者复制事实以与工作记忆分开处理?我正在使用流口水来计算分数,所以收回这些事实会改变它。
    • 我想我可以让它与议程组一起工作。首先处理所有其他规则,然后处理这些算法规则。使用 KieSession 完成所有规则后,侦听来自 java 端的任何撤回并重新插入所有撤回的对象。这样的事情可能会奏效。
    • 如果您需要对这些事实进行更多操作,则撤回和插入是次优的,因为即使您使用议程组,也会重新评估所有规则。 - A 和 P 对象中的标志更可取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多