项目作业调度:多个作业并行问题

时间:2018-10-26 05:23:02

标签: optaplanner

在同一项目中,我不希望两个作业并行运行。我应该如何设计?
drl文件中是否有一个规则不允许同一项目下的两个作业同时运行? 如果没有这种东西,同一个项目下的两个作业应该如何不同时运行?

rule "nonrenewableResourceCapacity"
    when
        $resource : Resource(renewable == false, $capacity : capacity)
        accumulate(
            ResourceRequirement(resource == $resource,
                    $executionMode : executionMode,
                    $requirement : requirement)
            and Allocation(executionMode == $executionMode);
            $used : sum($requirement);
            $used > $capacity
        )
    then
        scoreHolder.addHardConstraintMatch(kcontext, 0, $capacity - $used);
end

rule "renewableResourceUsedDay"
        salience 1 // Do these rules first (optional, for performance)
    when
        ResourceRequirement(resourceRenewable == true, $executionMode : executionMode, $resource : resource)
        Allocation(executionMode == $executionMode,
                $startDate : startDate, $endDate : endDate)
    then
        for (int i = $startDate; i < $endDate; i++) {
            insertLogical(new RenewableResourceUsedDay($resource, i));
        }
end

rule "renewableResourceCapacity"
    when
        RenewableResourceUsedDay($resource : resource, $capacity : resourceCapacity, $usedDay : usedDay)
        accumulate(
            ResourceRequirement(resource == $resource,
                    $executionMode : executionMode,
                    $requirement : requirement)
            and Allocation(executionMode == $executionMode, $usedDay >= startDate, $usedDay < endDate);
            $used : sum($requirement);
            $used > $capacity
        )
    then
        scoreHolder.addHardConstraintMatch(kcontext, 0, $capacity - $used);
end

// ############################################################################
// Soft constraints
// ############################################################################

rule "totalProjectDelay"
    when
        Allocation(jobType == JobType.SINK, endDate != null, $endDate : endDate,
               $criticalPathEndDate : projectCriticalPathEndDate)
    then
        scoreHolder.addSoftConstraintMatch(kcontext, 0,  $criticalPathEndDate - $endDate);
end


rule "totalMakespan"
    when
        accumulate(
            Allocation(jobType == JobType.SINK, $endDate : endDate);
            $maxProjectEndDate : max($endDate)
        )
    then
        scoreHolder.addSoftConstraintMatch(kcontext, 1, - (Integer) $maxProjectEndDate);
end

1 个答案:

答案 0 :(得分:0)

在任务分配中,当您永远不想并行运行2个作业时(因此对于所有作业都是硬约束),我可能会使其成为内置的硬约束并基本上像TSP一样对其建模。

>

如果只是一对特定的作业不应该并行运行,我将让变量侦听器检测到两个作业将同时运行,并延迟可以启动最新作业的作业的开始时间。如果它们都可以同时启动,则ID最低的一个首先启动,另一个延迟。最后一点是通过累加计算避免分数损坏。