Java Drools规则实现

Java Drools规则实现,java,drools,Java,Drools,我有一个规则,我不知道是否可以在drools中实现 描述:A、L、p都是连接的事实/POJO。我需要找出每个A是否可以通过L分配给自由P。如果没有,还有多少A元素未分配 在上述情况下,一个A将保持未分配状态 我想出了一个简单的算法: 查找边最少的A 如果A没有边,则将结果计数器增加1,删除A 从A中选择随机L->p,然后删除A,L,p元素 重复此操作,直到没有A剩余 我很难用口水来描述这一点。我不擅长流口水的规则。在JAVA中,您必须对集合进行很多操作,包括排序,drools似乎不支持这些

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

描述:
A
L
p
都是连接的事实/POJO。我需要找出每个
A
是否可以通过
L
分配给自由
P
。如果没有,还有多少
A
元素未分配

在上述情况下,一个
A
将保持未分配状态

我想出了一个简单的算法:

  • 查找边最少的
    A

    • 如果
      A
      没有边,则将结果计数器增加1,删除
      A
  • A
    中选择随机
    L
    ->
    p
    ,然后删除
    A
    L
    p
    元素

  • 重复此操作,直到没有
    A
    剩余

  • 我很难用口水来描述这一点。我不擅长流口水的规则。在JAVA中,您必须对集合进行很多操作,包括排序,drools似乎不支持这些操作。有可能在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
    
    规则findMin
    什么时候
    $mina:A($edges:edges)
    不是A(edges.size()<$edges.size())
    然后
    System.out.println(“收回”+$mina);
    收回(百万美元);
    结束
    规则countFail扩展findMin
    什么时候
    eval($edges.size()==0)
    然后
    Main.counter++;
    System.out.println(“未能匹配”+$mina);
    结束
    规则matchLP扩展findMin
    什么时候
    $l:l(此成员为$edges,$p:p)
    然后
    收回(p美元);
    收回(1美元);
    System.out.println(“收回”+$p+”和“+$l”);
    结束
    规则清理
    显著性10
    什么时候
    $l:l($p:p)
    不是P(这个==$P)
    $a:a(边包含$l)
    然后
    收回(1美元);
    修改($a){
    删除(1美元);
    }
    System.out.println(“清理”+$l+,“+$a”);
    结束
    
    太棒了。我不知道扩展的东西。关于撤回:由于有更多的规则需要处理,是否可以存储撤回的事实,以便在“countFail”规则不再匹配后重新插入?或者复制事实,与工作记忆分开处理?我用流口水来计算分数,所以收回这些事实会改变它。我想我可以让它与议程组一起工作。首先处理所有其他规则,然后处理这些algo规则。监听java端的任何收回,并在使用KieSession的所有规则完成后重新插入所有收回的对象。类似的方法可能会奏效。如果你需要更多地处理这些事实,那么收回和插入是第二好的方法,因为即使你使用议程组,所有规则都会重新评估。-A和P对象中的标志更可取。