[英]Drools rule implementation
我有一个规则,我不知道是否可以在drools中实现。
描述: A
, L
, P
是连接的所有事实/ POJO。 我需要找出每个A
可以分配给一个免费的P
到L
如果没有,有多少A
元素未分配。
在上面的情况下,一个A
将被取消分配。
我想到了一个很容易描述的算法:
找到边缘最小的A
A
没有边,则将结果计数器增加1,删除A
从A
选择随机L
- > P
并删除A
, L
, P
元素
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.