繁体   English   中英

Drools规则实施

[英]Drools rule implementation

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

描述: ALP是连接的所有事实/ POJO。 我需要找出每个A可以分配给一个免费的PL 如果没有,有多少A元素未分配。

事实模型图

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

我想到了一个很容易描述的算法:

  1. 找到边缘最小的A

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

  3. 重复,直到没有A为止

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

这是一组实现算法的规则。 它对大量的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM