Drools属于服务的进程的规则(反向optaplanner教程分配)

时间:2014-08-12 14:04:01

标签: service cloud drools optaplanner

我想在与optaplanner中的云平衡示例相关联的drools中实现一个简单的(?)规则:而不是在不同的计算机上拥有特定服务的进程(“2.1.8:超越此教程“),任何给定计算机上任何给定服务的第一个进程都应该涉及到成本:

rule "changeCost"

    when

       $computer: CloudComputer($changecost : getchangeCost())
       $process: CloudProcess($service: service, computer== $computer)
       $NumberOfProcessesOfSameServiceInComputer: Number (intValue == 0) from accumulate ( $a:
        CloudProcess (
            computer== $computer,
            service== $service),
        count($a)
       )

    then

    scoreHolder.addSoftConstraintMatch(kcontext, - $changecost);

end

我当然在课程CloudProcess中添加了一个项目(?)“服务”,并在课程changecost中添加了项目CloudComputer和getter / setter。代码汇编很好,但除了变得非常慢之外,分配按照常规进行(即,好像没有服务)。怎么了?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我可以想象这条规则会减慢一切。看看你在做什么:

规则“changeCost”

when
   $computer: CloudComputer($changecost : getchangeCost())

匹配任何CloudComputer实例 - 确定。

   $process: CloudProcess($service: service, computer== $computer)

将任何(!)CloudProcess实例与该CloudComputer上的某些服务匹配

   $NumberOf: Number (intValue == 0)
             from accumulate ( $a: CloudProcess (
        computer== $computer,
        service== $service),
    count($a)

计算CloudProcess(计算机,服务)之类的内容。

所以,一旦你用一些服务建立了一个CloudProcess实例,就会对它的喜欢进行计数,但对于同类的任何其他CloudProcess实例也会发生同样的事情,它会发生在所有类型的服务......

此外,该规则只会导致事实评估,但它永远不会触发。第二种模式确定(至少)有一个CloudProcess具有由第一种模式建立的CloudComputer的一些服务。累积计算它的喜好,但是然后约束表明计数的数字必须为零 - 显然在匹配第二个模式后是不可能的。

如果您需要确定只有一种CloudProcess,您可以使用

when
  $computer: CloudComputer($changecost : getchangeCost())
  $cp: CloudProcess($service: service, computer== $computer)
  not CloudProcess( computer== $computer, service== $service, this != $cp)
then