我有一条规则,我不知道是否可以在drools中实现。
说明:A
,L
,P
都是连接的事实/ POJO。我需要了解每个A
是否可以分配给免费P
到L
。如果没有,那么有多少A
个元素未被分配。
在上述情况下,一个A
将被取消分配。
我想出了一个易于描述的算法:
查找边缘最小的A
A
没有边缘,请将结果计数器增加1,删除A
从L
中选择随机P
- > A
并删除A
,L
,P
元素< / p>
A
左我很难用drools描述这一点。我不是drools规则的专家。在JAVA中,你必须对集合进行大量操作,包括排序,这些drools似乎不支持。是否有可能以流氓的方式做到这一点?
答案 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