Java Drools规则实现
我有一个规则,我不知道是否可以在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似乎不支持这些
A
、L
、p
都是连接的事实/POJO。我需要找出每个A
是否可以通过L
分配给自由P
。如果没有,还有多少A
元素未分配
在上述情况下,一个A
将保持未分配状态
我想出了一个简单的算法:
A
- 如果
没有边,则将结果计数器增加1,删除A
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对象中的标志更可取。