有没有办法提高规则性能?

Is there a way to improve rule performance?

我正在尝试配对任务(运行)并利用一组有限的事实,而不实例化所有可能的组合。虽然以下规则尚未完成,但性能非常慢。我正在寻找建议。

when
$rp : RoutePair()

accumulate( RouteRun( routePair == $rp,  $runId : runId);
            $routeRunListAm : collectList($runId),
            $count : count();
            $count == 4)
accumulate( $pr : PairableRuns( (runId1 == $routeRunListAm.toArray()[0] && runId2 == $routeRunListAm.toArray()[1])
                             || (runId1 == $routeRunListAm.toArray()[0] && runId2 == $routeRunListAm.toArray()[2])
                             || (runId1 == $routeRunListAm.toArray()[0] && runId2 == $routeRunListAm.toArray()[3])
                             || (runId1 == $routeRunListAm.toArray()[1] && runId2 == $routeRunListAm.toArray()[2])
                             || (runId1 == $routeRunListAm.toArray()[1] && runId2 == $routeRunListAm.toArray()[3])
                             || (runId1 == $routeRunListAm.toArray()[2] && runId2 == $routeRunListAm.toArray()[3]));
            $pairableRunsListPm : collectList($pr),
            $count : count();
            $count >= 2)
accumulate( RouteRun( routePair == $rp,  $returnRunId : returnRunId);
            $routeRunListPm : collectList($returnRunId))
accumulate( $pr : PairableRuns( (runId1 == $routeRunListPm.toArray()[0] && runId2 == $routeRunListPm.toArray()[1])
                             || (runId1 == $routeRunListPm.toArray()[0] && runId2 == $routeRunListPm.toArray()[2])
                             || (runId1 == $routeRunListPm.toArray()[0] && runId2 == $routeRunListPm.toArray()[3])
                             || (runId1 == $routeRunListPm.toArray()[1] && runId2 == $routeRunListPm.toArray()[2])
                             || (runId1 == $routeRunListPm.toArray()[1] && runId2 == $routeRunListPm.toArray()[3])
                             || (runId1 == $routeRunListPm.toArray()[2] && runId2 == $routeRunListPm.toArray()[3]));
            $pairableRunsListPm : collectList($pr),
            $count : count();
            $count >= 2)

然后

我必须 (ab) 使用一个答案,这样我才能提出我的问题来理解问题。

class RoutePair{...}
class RouteRun( 
    RoutePair routePair;
    RunId runId
}
class PairableRuns(
    RunId runId1; // maybe String or int - doesn't matter
    RunId runId2;
}

第一次收集后,$routeRunListAm 是一个包含 4 个 RouteRun 对象的列表,顺序不限。但是,如果某些 PairableRuns 中的 runId1 和 runId2 的顺序反映在以某种不确定顺序累积的该列表中的顺序,则复杂的布尔表达式只会 return 为真。

我发现这个 List 必须正好 4 个 RouteRun 对象——为什么不 >= 4?条件的第二部分包含几乎相同的 CE 和约束组合,只是这里的条件 $count == 4 在第三个累积 CE 中缺失。

我不确定复杂的布尔表达式应该确定什么,但我认为更简单

$pr: PairableRuns( runId1 memberOf $routeRunListAm,
                   runId2 memberOf $routeRunListAm )

应该达到同样的效果。

但是,我不确定这是否真的足够。考虑 $routeRunListAm 包含 7, 12, 14, 22 和 PairableRuns {7,12}{7,14}{7,22}。这将匹配原始约束以及我建议的形式三次 - 这是期望的吗?

没有简明的规范就不可能提出建议(如图所示的规则绝对不是)。