Drools规则实施

时间:2015-07-07 21:18:32

标签: java drools

我有一条规则,我不知道是否可以在drools中实现。

说明:ALP都是连接的事实/ POJO。我需要了解每个A是否可以分配给免费PL。如果没有,那么有多少A个元素未被分配。

Fact model diagram

在上述情况下,一个A将被取消分配。

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

  1. 查找边缘最小的A

    • 如果A没有边缘,请将结果计数器增加1,删除A
  2. L中选择随机P - &gt; A并删除ALP元素< / p>

  3. 重复,直到没有A
  4. 我很难用drools描述这一点。我不是drools规则的专家。在JAVA中,你必须对集合进行大量操作,包括排序,这些drools似乎不支持。是否有可能以流氓的方式做到这一点?

1 个答案:

答案 0 :(得分: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