gpt4 book ai didi

java - 流口水规则实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:37 25 4
gpt4 key购买 nike

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

描述:ALP都是facts/POJOs,它们是有联系的。我需要查明是否每个 A 都可以通过 L 分配给一个空闲的 P。如果没有,还有多少 A 元素未分配。

Fact model diagram

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

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

  1. 找到边最少的A

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

  3. 重复,直到没有 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

关于java - 流口水规则实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31279457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com